Java - 字符和字节流

时间:2013-12-10 06:51:05

标签: java iostream

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

2 个答案:

答案 0 :(得分:2)

  

我不完全理解字符流,二进制流和缓冲流之间的区别

缓冲区在这里是一个红色的鲱鱼 - 这只是一个实现细节,通常是为了提高效率。了解您是在阅读二进制数据还是文本数据非常重要。如果您正在阅读文本文件,则需要Reader一些描述。您的文件包含二进制数据(所有文件基本上都是字节),您需要说明如何将其转换为文本。您可以使用FileReader,但我更愿意使用FileInputStream中包含的InputStreamReader,因为您可以指定编码< / em>在二进制和文本之间进行转换。您需要知道文件的编码,例如: UTF-8。

任何InputStream只返回二进制数据;并且Reader返回文本数据。

无论哪种方式,如果您想逐行阅读(不清楚您的数组将包含哪些内容),您需要BufferedReader来包裹InputStreamReaderFileReader,提供readLine()方法。

  

那么,如果我们都使用字符,为什么人们会使用字节流。

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

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

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

答案 1 :(得分:1)

区别很简单。根据这个tutorial

  
      
  1. Byte Streams处理原始二进制数据的I / O.
  2.   
  3. Character Streams处理字符数据的I / O,自动处理与本地字符集的转换。
  4.   
  5. Buffered Streams通过减少对本机API的调用次数来优化输入和输出。
  6.