Java - 字符和字节流

标签 java iostream

我正在尝试创建一个程序,允许我从本地文件获取名称并将它们添加到名称字符串数组中。我不完全理解字符流,二进制流和缓冲流之间的区别,并且在线查找并没有回答我的问题,即:我将使用哪种类型的流从文本文件中读取以创建字符串数组?

最佳答案

I don't completely understand the difference between character streams, binary streams, and buffer streams

缓冲区在这里是一个转移注意力的东西——这只是一个实现细节,通常是为了提高效率。了解您正在读取的是二进制数据还是文本数据非常重要。如果您正在阅读文本文件,您需要一个具有某种描述的Reader。您的文件包含二进制数据(所有文件基本上都是字节),您需要说明如何将其转换为文本。您可以使用FileReader,但我更喜欢使用包装在InputStreamReader中的FileInputStream,如下所示您可以指定要在二进制和文本之间转换的编码。您需要知道文件的编码,例如UTF-8。

任何InputStream仅返回二进制数据; Reader 返回文本数据。

无论哪种方式,如果您想逐行读取(不清楚您的数组将包含什么),您将需要一个 BufferedReader 来包装您的 InputStreamReaderFileReader,因为它提供了 readLine() 方法。

Hmmm then why would people ever use byte streams, if we all use characters.

我们没有。图像文件、音乐、视频、压缩数据、加密数据等本质上不是文本数据。如果您使用 Reader 读取图像文件,您几乎肯定会丢失一些数据。

将文本视为另一种文件格式 - 如果您尝试加载图像来显示它,您需要一些能够理解该图像文件格式的东西;如果您尝试加载音乐文件来播放它,则需要能够理解该音频文件格式的东西 - 对于文本,InputStreamReader 可以理解文本。

尽管在所有情况下我们都有文件级别的字节,但您使用的类决定了如何解释这些字节。

关于Java - 字符和字节流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20487968/

相关文章:

c++ - 如何在 C++ 中设置流的最大读取长度?

c++ - 交替的 cin/cout 很慢?

c++ - 在 C++ 代码中获取虚拟值而不是预期值

c++ - 如何在 cout 上使用 isatty(),或者我可以假设 cout == 文件描述符 1?

c++ - 使用 std::ifstream,忽略字符和查找之间有区别吗?

java - 如何知道一个列表有一个特定的索引?

java - Android Studio ActionBar 宽度/图标位置

java - 如何使用 MongoTemplate 应用多个标准条件

java - 线程安全 - 以列表为值的并发 HashMap

java - css img :hover working, img:active 不是