我正在尝试创建一个程序,允许我从本地文件中获取名称并将它们添加到String名称数组中。我不完全理解字符流,二进制流和缓冲流之间的区别,并且在线查看没有回答我的问题,即:我将使用哪种类型的流来从文本文件中读取以创建字符串数组?
答案 0 :(得分:2)
我不完全理解字符流,二进制流和缓冲流之间的区别
缓冲区在这里是一个红色的鲱鱼 - 这只是一个实现细节,通常是为了提高效率。了解您是在阅读二进制数据还是文本数据非常重要。如果您正在阅读文本文件,则需要Reader
一些描述。您的文件包含二进制数据(所有文件基本上都是字节),您需要说明如何将其转换为文本。您可以使用FileReader
,但我更愿意使用FileInputStream
中包含的InputStreamReader
,因为您可以指定编码< / em>在二进制和文本之间进行转换。您需要知道文件的编码,例如: UTF-8。
任何InputStream
只返回二进制数据;并且Reader
返回文本数据。
无论哪种方式,如果您想逐行阅读(不清楚您的数组将包含哪些内容),您需要BufferedReader
来包裹InputStreamReader
或FileReader
,提供readLine()
方法。
那么,如果我们都使用字符,为什么人们会使用字节流。
我们没有。图像文件,音乐,视频,压缩数据,加密数据等本身不是文本数据。如果您使用Reader
读取图像文件,则几乎肯定会丢失一些数据。
将文本视为另一种文件格式 - 如果您尝试加载图像以显示它,则需要能够理解图像文件格式的图像;如果你试图加载一个音乐文件来播放它,你需要一些能理解音频文件格式的东西 - 有文字,InputStreamReader
能理解文字。
尽管在所有情况下我们都有文件级别的字节,但您使用的类确定了这些字节的解释方式。
答案 1 :(得分:1)
区别很简单。根据这个tutorial
- Byte Streams处理原始二进制数据的I / O.
- Character Streams处理字符数据的I / O,自动处理与本地字符集的转换。
- Buffered Streams通过减少对本机API的调用次数来优化输入和输出。
醇>