面试题答案
一键面试主要区别
- 处理单元:
- 字节流以字节(8位)为处理单元,主要用于处理二进制数据,如图片、音频、视频等。
InputStream
和OutputStream
是字节流的抽象基类。 - 字符流以字符(16位,在Java中
char
类型是16位)为处理单元,用于处理文本数据,能更好地处理不同字符编码,如UTF - 8、GBK等。Reader
和Writer
是字符流的抽象基类。
- 字节流以字节(8位)为处理单元,主要用于处理二进制数据,如图片、音频、视频等。
- 编码处理:
- 字节流不会对数据进行字符编码转换,它直接读取和写入原始字节数据。
- 字符流在读取和写入数据时,会根据指定的字符编码(或默认编码)进行字符编码转换,以确保文本数据的正确处理。
- 缓冲机制:
- 字节流有自己的缓冲实现,如
BufferedInputStream
和BufferedOutputStream
。 - 字符流同样有缓冲实现,如
BufferedReader
和BufferedWriter
,但字符流的缓冲更适合处理文本,能按行读取等,例如BufferedReader
的readLine()
方法。
- 字节流有自己的缓冲实现,如
应用场景
优先使用字节流的场景
- 处理二进制文件:
- 当处理图片文件时,如读取一张JPEG格式的图片并进行简单的复制操作。
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class ImageCopy { public static void main(String[] args) { try (InputStream in = new FileInputStream("source.jpg"); OutputStream out = new FileOutputStream("destination.jpg")) { byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) != -1) { out.write(buffer, 0, length); } } catch (IOException e) { e.printStackTrace(); } } }
- 处理音频或视频文件类似,字节流直接处理原始字节数据,不会干扰二进制数据结构。
- 网络通信中的底层数据传输:
- 在Socket编程中,当发送和接收原始的网络数据时,优先使用字节流。例如在简单的TCP服务器端接收客户端发送的数据:
import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TCPServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(12345); Socket socket = serverSocket.accept(); InputStream in = socket.getInputStream()) { byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) != -1) { System.out.println("Received: " + new String(buffer, 0, length)); } } catch (IOException e) { e.printStackTrace(); } } }
优先使用字符流的场景
- 处理文本文件:
- 读取一个文本文件并逐行处理其中内容,例如统计文件中的行数:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class LineCount { public static void main(String[] args) { int lineCount = 0; try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) { while (reader.readLine() != null) { lineCount++; } System.out.println("Line count: " + lineCount); } catch (IOException e) { e.printStackTrace(); } } }
- 处理用户输入输出(文本相关):
- 当从控制台读取用户输入的文本并进行处理时,使用字符流更方便。例如使用
BufferedReader
读取用户输入的字符串:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class UserInput { public static void main(String[] args) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { System.out.println("Enter a string: "); String input = reader.readLine(); System.out.println("You entered: " + input); } catch (IOException e) { e.printStackTrace(); } } }
- 当从控制台读取用户输入的文本并进行处理时,使用字符流更方便。例如使用