面试题答案
一键面试主要区别
- 处理数据单位不同
- 字节流:以字节(8位二进制)为单位处理数据,适用于处理所有类型的数据,包括二进制数据(如图片、音频、视频等)。
InputStream
和OutputStream
是字节流的抽象类。 - 字符流:以字符为单位处理数据,Java中的字符是16位的Unicode字符。字符流主要用于处理文本数据。
Reader
和Writer
是字符流的抽象类。
- 字节流:以字节(8位二进制)为单位处理数据,适用于处理所有类型的数据,包括二进制数据(如图片、音频、视频等)。
- 编码处理不同
- 字节流:不涉及字符编码转换,直接操作字节数据。在处理文本时,如果涉及不同编码格式,需要手动进行编码转换。
- 字符流:在读取和写入数据时,会自动进行字符编码转换。例如,从文件读取数据时,可以指定文件的编码格式(如UTF - 8、GBK等),字符流会按照指定编码将字节数据转换为字符。
- 缓冲机制不同
- 字节流:虽然也可以通过
BufferedInputStream
和BufferedOutputStream
实现缓冲,但默认情况下没有缓冲。 - 字符流:字符流的许多子类(如
BufferedReader
和BufferedWriter
)默认就带有缓冲,这使得它们在处理文本数据时效率更高。
- 字节流:虽然也可以通过
应用场景举例
- 字节流应用场景
- 处理二进制文件:如读取和写入图片文件。例如,将一张图片从一个位置复制到另一个位置:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class ByteStreamExample {
public static void main(String[] args) {
try (InputStream inputStream = new FileInputStream("source.jpg");
OutputStream outputStream = new FileOutputStream("destination.jpg")) {
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- **网络通信**:在Socket通信中,通常使用字节流来发送和接收数据,因为网络传输的数据本质上是字节流。
2. 字符流应用场景 - 处理文本文件:读取和写入纯文本文件。例如,读取一个文本文件并逐行打印内容:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class CharacterStreamExample {
public static void main(String[] args) {
try (Reader reader = new FileReader("example.txt");
BufferedReader bufferedReader = new BufferedReader(reader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- **处理用户输入输出**:如控制台输入输出。`System.in`是字节流,而`BufferedReader`包装`System.in`可以方便地读取用户输入的文本,`System.out`配合`PrintWriter`可以方便地输出文本。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class ConsoleIOExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter writer = new PrintWriter(System.out, true)) {
writer.println("请输入内容:");
String input = reader.readLine();
writer.println("你输入的内容是:" + input);
} catch (IOException e) {
e.printStackTrace();
}
}
}