在Java的I/O流按流内容分为两大类,字符流(Character Streams)和字节流(Byte Streams)。
字符流和字节流处理数据输入输出的两种基本方式,分别应用于字符内容和二进制字节内容的读写。
字节流(Byte Streams)
字节流是直接读写字节的流,由抽象类InputStream和OutputStream描述其读写方法,创建对象时需要使用它们的子类,如二进制文件的读写类FileInputStream和FileOutputStream。
字节流因为直接处理字节数据,一般用于读写二进制数据(如图片、音频、视频等),但是也适合用于所有数据类型。
对于文本内容,字节流不直接支持Unicode编码,对文本文件处理时可能需要额外的编码转换逻辑。
字符流(Character Streams)
字符流读写字符数据,用于处理文本内容。由抽象类Reader和Writer描述其读写方法,创建对象时需要使用它们的子类,如文本文件的读写类FileReader和FileWriter。
字符流内部实现了字符编码和解码,直接支持Unicode,在处理文本文件时更为方便。
字符流因为自动处理字符编码转换,在读写文本时代码更简洁。
复制文本文件实例
使用字节流,按字节复制文件内容。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamCopyExample {
public static void main(String[] args) {
String sourceFile = "source.txt";
String targetFile = "target.txt";
try (FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(targetFile)) {
int byteRead;
while ((byteRead = fis.read()) != -1) {
fos.write(byteRead);
}
System.out.println("文件复制完成(字节流)。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用字符流,按字符复制文本文件
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharacterStreamCopyExample {
public static void main(String[] args) {
String sourceFile = "source.txt";
String targetFile = "target.txt";
try ( FileReader fr = new FileReader(sourceFile);
FileWriter fw = new FileWriter(targetFile)) {
int charRead;
while ((charRead = fr.read()) != -1) {
fw.write(charRead);
}
System.out.println("文件复制完成(字符流)。");
} catch (IOException e) {
e.printStackTrace();
}
}
}