【问题标题】:Conceptual confusion about Java IO read() from InputStream and write() function to OutputStream关于 Java IO read() 从 InputStream 和 write() 函数到 OutputStream 的概念混淆
【发布时间】:2017-09-11 11:39:29
【问题描述】:

我目前正在学习 Java IO 函数和编码,但在阅读在线教程时有点困惑。这是参考此处发布的问题:InputStream/OutputStream read()/write() function relevance and usage

这似乎暗示了基本 write() 函数和 write(byte[] bytes, int offset, int length) 函数的时间效率很高,但我不太明白它的意思。

在教程中是这样说的:

public int read(byte[] bytes, int offset, int length) throws IOException
// Read "length" number of bytes, store in bytes array starting from offset 
of index.

public int read(byte[] bytes) throws IOException
// Same as read(bytes, 0, bytes.length)

这两行代码究竟做了什么来说明 read() 在 java IO 中的作用?第一行也是读取文件信息的长度或文件的实际信息本身。

为了更加混乱,OutputStream 的 Write() 函数解释如下:

“类似于输入对应,抽象超类 OutputStream 声明了一个抽象方法 write() 将数据字节写入输出接收器。write() 接受一个 int。写入 int 参数的最低有效字节out; 高 3 个字节被丢弃。如果发生 I/O 错误(例如,输出流已关闭),则抛出 IOException。"

这是否意味着实际信息或参数被写入?有点混淆了该段落想要表达的意思。

public void abstract void write(int unsignedByte) throws IOException\

public void write(byte[] bytes, int offset, int length) throws IOException
// Write "length" number of bytes, from the bytes array starting from offset 
of index.

public void write(byte[] bytes) throws IOException
// Same as write(bytes, 0, bytes.length)

提前感谢您对此的任何解释。

【问题讨论】:

  • “写入的实际信息或参数”到底是什么意思?

标签: java


【解决方案1】:

这似乎暗示了基本的 write() 函数和 write(byte[] bytes, int offset, int length) 函数之间的区别在于它的时间效率,但我不太明白那个意思.

“基本”write(b) 方法只写入一个数据字节。

如果你想用它来写入大量数据,你会进行大量的方法调用。

这就是为什么为了提高效率,还有write 的版本可以在一次调用中占用多个字节。这是通过在数组(“缓冲区”)中传递这些字节来实现的。

除了减少调用次数之外,有效使用(和重用)这个缓冲区还可以节省大量工作。但这使得代码使用起来有点复杂:您必须管理这些字节数组,而不仅仅是接收方法调用的结果。

read 方法也是如此。


public int read(byte[] bytes, int offset, int length) throws IOException

// 读取“length”字节数,存储在从索引偏移开始的字节数组中。

那么第一行是读取文件信息的长度还是文件的实际信息本身?

  • 该方法最多从文件中读取length 字节(它可能会读取较少,例如当文件太短时)
  • 它读取的数据不是从方法返回的,而是放在数组bytes中。这也避免了复制太多(如果要返回数据,则需要创建一个新的byte[])。
  • 该方法返回的是已读取的字节数(您需要知道这一点,因为它可能比您要求的要少,见上文)。
  • 还有一个参数offset 告诉方法不要在开始时将数据写入缓冲区(bytes),而是在其他地方。这允许您将缓冲区重用于其他事情(再次避免复制过多数据)。

【讨论】:

  • 所以在将它放入数组字节后,我可以在字节上使用 println 语句来显示文件包含的内容?感谢您的信息!
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 2019-09-24
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2019-04-03
相关资源
最近更新 更多