- 处理数据的单位不同
- 字节流:字节流以字节(8位二进制)为单位处理数据。它可以用于处理任何类型的数据,因为所有的数据在计算机底层都是以字节的形式存储的。例如,读取或写入图像、音频、视频等二进制文件时,字节流是最合适的选择。像
InputStream
(输入字节流)的read()
方法每次读取一个字节的数据,OutputStream
(输出字节流)的write()
方法每次写入一个字节的数据。例如,使用字节流读取一个二进制文件(如一张图片)的部分代码如下:
```java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
- 字节流:字节流以字节(8位二进制)为单位处理数据。它可以用于处理任何类型的数据,因为所有的数据在计算机底层都是以字节的形式存储的。例如,读取或写入图像、音频、视频等二进制文件时,字节流是最合适的选择。像
public class ByteStreamExample {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("image.jpg");
FileOutputStream fos = new FileOutputStream("new_image.jpg");
int data;
while ((data = fis.read())!= -1) {
fos.write(data);
}
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- **字符流**:字符流以字符为单位处理数据。字符的大小在不同的字符编码下可能不同,例如在UTF - 8编码下,一个字符可能占用1 - 4个字节。字符流主要用于处理文本数据,它会考虑字符编码,能够正确地处理字符的读写,如读取和写入`.txt`文件等文本文件。例如`Reader`(输入字符流)的`read()`方法每次读取一个字符(以`int`类型表示,范围是0 - 65535),`Writer`(输出字符流)的`write()`方法每次写入一个字符。例如,使用字符流读取一个文本文件的部分代码如下:
```java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharacterStreamExample {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("text.txt");
FileWriter fw = new FileWriter("new_text.txt");
int character;
while ((character = fr.read())!= -1) {
fw.write((char) character);
}
fr.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 对文本数据的处理方式不同
- 字节流:字节流在处理文本数据时,是将文本内容当作字节序列来处理,不会考虑字符编码。这意味着如果使用字节流来读取或写入文本文件,并且文本文件包含非ASCII字符(如中文、日文等),可能会出现乱码问题。例如,当使用字节流读取一个UTF - 8编码的中文文本文件并直接打印字节数据转换后的字符时,可能会出现乱码,因为字节流不知道字节数据对应的字符编码。
- 字符流:字符流在处理文本数据时,会考虑字符编码。它内部会根据指定的字符编码(如UTF - 8、GBK等)或者使用默认的字符编码来正确地将字节序列转换为字符或者将字符转换为字节序列。这使得字符流在处理文本文件时更加方便和安全,能够正确地处理各种字符,避免乱码问题。例如,
FileReader
和FileWriter
在构造函数中可以根据系统默认的字符编码来处理文本文件,也可以通过InputStreamReader
和OutputStreamWriter
来指定字符编码,如下面的代码可以指定使用UTF - 8编码来读取文本文件:
```java
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class CharacterEncodingExample {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("utf8_text.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine())!= null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
- 应用场景不同
- 字节流:
- 适用于处理二进制文件,如图片、音频、视频、可执行文件等。这些文件中的数据没有字符的概念,都是以字节为单位存储和传输的。
- 在进行网络通信时,如果是传输二进制数据(如文件下载、上传等),字节流是常用的选择。
- 字符流:
- 主要用于处理文本文件,如
.txt
文件、.java
文件、.html
文件等,能够确保文本内容的正确读写,避免字符编码带来的问题。 - 在处理需要按字符进行操作的场景,如文本解析、文本编辑等,字符流更合适。例如,读取一个配置文件并解析其中的键值对,使用字符流可以更方便地按行读取并处理文本内容。
- 主要用于处理文本文件,如
- 字节流: