为什么要在Java中避免IO作为字节

为什么要在Java中避免IO作为字节,java,stream,Java,Stream,CopyBytes看起来像一个普通的程序,但实际上它代表了一种您应该避免的低级I/O。有人提到,虽然所有的流都是基于ByTestStream本身构建的,但是应该优先考虑字符流、对象流等。这背后的原因是什么,与安全管理器和性能相关的问题有关系吗 来源:它可以工作,但效率非常低:它需要为每个复制的字节调用2个方法 相反,您应该使用数千字节的缓冲区,最佳大小取决于您读取的内容和其他条件,并读取/写入整个缓冲区,或者在每个方法调用中尽可能多地读取/写入。它可以工作,但效率非常低:它需要为复制的每个字节调

CopyBytes看起来像一个普通的程序,但实际上它代表了一种您应该避免的低级I/O。有人提到,虽然所有的流都是基于ByTestStream本身构建的,但是应该优先考虑字符流、对象流等。这背后的原因是什么,与安全管理器和性能相关的问题有关系吗


来源:

它可以工作,但效率非常低:它需要为每个复制的字节调用2个方法


相反,您应该使用数千字节的缓冲区,最佳大小取决于您读取的内容和其他条件,并读取/写入整个缓冲区,或者在每个方法调用中尽可能多地读取/写入。它可以工作,但效率非常低:它需要为复制的每个字节调用两个方法


相反,您应该使用数千字节的缓冲区,最佳大小取决于您读取的内容和其他条件,并读取/写入整个缓冲区,或者在每次方法调用时尽可能多地读取/写入缓冲区。

Oracle实际上是说,请不要重新实现控制盘

您几乎不需要常规字节流:

你在分析文本吗?使用字符流,它可以理解文本编码问题。 您正在解析XML吗?使用SAX或其他库。 你在分析图像吗?使用ImageIO类。 你是在把东西从A复制到B吗?使用apache commons io FileUtils。
在很少的情况下,您实际上需要使用ByTestStream。

Oracle实际上说的是,请不要重新实现轮子

您几乎不需要常规字节流:

你在分析文本吗?使用字符流,它可以理解文本编码问题。 您正在解析XML吗?使用SAX或其他库。 你在分析图像吗?使用ImageIO类。 你是在把东西从A复制到B吗?使用apache commons io FileUtils。
在很少的情况下,您实际上需要使用ByTestStream。

从您引用的文本中:

CopyBytes看起来像一个普通的程序,但实际上它代表了一种您应该避免的低级I/O。由于xanadu.txt包含字符数据,最好的方法是使用字符流,如下一节所述。还有用于更复杂数据类型的流。字节流应仅用于最基本的I/O


通常,您不希望直接使用字节。有更高级的API,例如读取文本,即必须从字节解码的字符数据。

从您引用的文本:

CopyBytes看起来像一个普通的程序,但实际上它代表了一种您应该避免的低级I/O。由于xanadu.txt包含字符数据,最好的方法是使用字符流,如下一节所述。还有用于更复杂数据类型的流。字节流应仅用于最基本的I/O


通常,您不希望直接使用字节。还有更高级别的API,例如读取文本,即必须从字节解码的字符数据。

更重要的是,如果需要读取文本文件,则不应与字节流混淆。至少在问题中引用的句子后面是这样说的。@Joachim但它也说所有流都是基于ByTestStreams本身构建的。这是否意味着这种低效率在所有流中都是继承的呢???@sand1988:还有其他方法可以在一个方法调用中读取大量字节。@Thilo:嗯,除非您只想复制数据,而不想以任何其他方式处理数据,否则字节流就可以正常工作。不过,更重要的是,如果您需要读取文本文件,您根本不应该弄乱字节流。至少在问题中引用的句子后面是这样说的。@Joachim但它也说所有流都是基于ByTestStreams本身构建的。这是否意味着这种低效率在所有流中都是继承的呢???@sand1988:还有其他方法可以在一个方法调用中读取大量字节。@Thilo:嗯,除非您只想复制数据而不以任何其他方式处理数据,否则字节流就可以正常工作。对于所有这些示例,+1。尤其是commons io是每个人都应该知道的东西。对于所有这些例子+1。尤其是commons io是每个人都应该知道的东西。我必须阅读一个我不知道是什么类型的文件。我已经把它分成了几部分,你知道文件的类型会不断变化,所以我应该使用字节流吗?你想对文件做什么?要简单地将文件读入内存,请看一下Commons-IO。是的,我想做同样的事情。虽然可重用性是软件工程的一个重要方面,但为了更好地理解这一点,我想用自制的功能来实现它。那么,在不使用Commons IO的情况下,最好的方法是什么呢。我想读取一个文件,将其拆分为
d存储回片段。@sand1988:同样,这取决于您想对片段执行什么操作:如果您只想在某个时候重新构造原始片段,那么只需使用字节即可。如果您希望每个单独的部分都是可读的,例如,您希望在单词边界处拆分,那么您需要在文本的情况下使用其他读取器/写入器。我必须读取一个我不知道是什么类型的文件。我已经把它分成了几部分,你知道文件的类型会不断变化,所以我应该使用字节流吗?你想对文件做什么?要简单地将文件读入内存,请看一下Commons-IO。是的,我想做同样的事情。虽然可重用性是软件工程的一个重要方面,但为了更好地理解这一点,我想用自制的功能来实现它。那么,在不使用Commons IO的情况下,最好的方法是什么呢。我想读取一个文件,将其拆分并存储回各个部分。@sand1988:同样,这取决于您想对这些部分做什么:如果您只想在某个时候重新构造原始文件,那么只需使用字节即可。如果您希望每个单独的部分都可读,例如,您希望在单词边界处拆分,那么在文本的情况下,您需要使用其他的读写器。