Java 字符流
Java 中的字符流也称为字符输入/输出流,是把字符数据读入程序或者将字符数据写出程序的流。字符流以字符为单位读取数据,而不是以字节为单位,因此可以更有效地处理文本文件。字符流基于字符集,因此可以以更高效的编码方式来处理文本,从而提高性能。 Java 中提供了两个基本的字符流类:Reader 和 Writer,它们分别用于读取和写入数据。比如,FileReader 用于从文件中读取数据,而 FileWriter 用于将数据写入文件中。
常见的字符流方法:
- InputStreamReader / OutputStreamWriter
- BufferedReader / BufferedWriter
- CharArrayReader / CharArrayWriter
- StringReader / StringWriter
- FileReader / FileWriter
InputStreamReader / OutputStreamWriter
示例:
import java.io.*;
public class StreamReaderWriterDemo {
public static void main(String[] args) {
try (
InputStreamReader isr = new InputStreamReader(System.in);
OutputStreamWriter osw = new OutputStreamWriter(System.out);
) {
osw.write("Please input something: \n");
osw.flush();
char[] buffer = new char[20];
isr.read(buffer);
osw.write(("Your input is:"));
osw.write(buffer); // 乱码
osw.write("\n");
osw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
BufferedReader / BufferedWriter
示例:
import java.io.*;
public class BufferedReaderWriterDemo {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
CharArrayReader / CharArrayWriter
示例:
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.IOException;
public class CharArrayReaderWriterDemo {
public static void main(String[] args) {
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
char[] newCharArray = new char[charArray.length];
try (CharArrayReader reader = new CharArrayReader(charArray);
CharArrayWriter writer = new CharArrayWriter())
{
int c;
while ((c = reader.read()) != -1) {
writer.write(c);
}
newCharArray = writer.toCharArray();
} catch (IOException e) {
e.printStackTrace();
}
}
}
StringReader / StringWriter
示例:
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
public class StringReaderWriterDemo {
public static void main(String[] args) {
String str = "Hello World!";
StringBuilder builder = new StringBuilder();
try (StringReader reader = new StringReader(str);
StringWriter writer = new StringWriter()) {
int c;
while ((c = reader.read()) != -1) {
writer.write(c);
}
builder.append(writer);
System.out.println(builder);
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileReader / FileWriter
示例:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileReaderWriterDemo {
public static void main(String[] args) {
try (FileReader reader = new FileReader("src.txt");
FileWriter writer = new FileWriter("dest.txt"))
{
int c;
while ((c = reader.read()) != -1) {
writer.write(c);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
如何检测字符流的结束标志?—— 字符流的结束标志通常是 -1,当读取到 -1 时,表示字符流已经读取完毕。例如,InputStreamReader 类的 read() 方法返回的是 int 类型,当成功读取一个字符时,返回的是字符的 ASCII 值,而当读取到文件末尾时,返回 -1。
if (inputStreamReader.read() == -1) {
//字符流已结束
}