跳到主要内容

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) {
//字符流已结束
}