gpt4 book ai didi

java - 更好地理解 Java I/O

转载 作者:行者123 更新时间:2023-12-04 05:47:17 25 4
gpt4 key购买 nike

在 Java 网络输入流中,为什么不建议这样做:

 PdfReader localPdfReader = new PdfReader(item.getinputStream());

其中 item 是 FileItem从客户端上传。
相反,建议这样做:
ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(item.getInputStream(), output);

两者有什么区别?
编辑
我才知道是因为这里的输入流是网络流。因此,一旦读取了一个字节,您就无法再读取它。所以你必须在使用它之前将它复制到内存(IOUtils)。我的问题是,在复制到内存时,您还必须逐字节读取流,对吗?那么为什么输入流没有在那里关闭?

最佳答案

我猜区别在于 阅读器和输入流 .在您的示例中,PDF 文档是二进制数据,不应逐字符传输,而应逐字节传输。查询 this link在同一个论坛中了解更多关于 Reader 和 InputStream 的信息。尽管它提到了 Stream 由 Reader 包装,但正如前面对于二进制数据所提到的那样,应该不鼓励这样做。

编辑:1

让我们检查 Reader 和 InputStream 的 read 方法的工作方式
Reader.read() returns 0 到 65535 范围内的整数(单个 16 位 Unicode 字符)
InputStream.read() returns数据的字节(8 位有符号二进制补码整数)

现在想象一下,如果您使用 Reader 读取二进制数据(这是 8 位整数的序列),您最终将读取两个字节(8*2),而不是假设它是一个字符。

我没有看到 PdfReader 的代码所以不确定它是否使用 java.io.Reader .本解释纯粹是为了java.io.Reader/InputStream .如果您分享一些链接或帖子,其中包含 PdfReader,我将不胜感激。如果以你提到的方式使用,是不好的。

编辑:2

记住:

  • 从网络中,您只能读取一次流字节。
  • 如果多个任务需要这些字节,最好将这些字节存储在数组中并多次使用相同的数组

  • 如果你使用
    PdfReader localPdfReader = new PdfReader(item.getinputStream());
    然后 PdfReader 在内部从流中读取字节并使用它来验证。它 将其存储以备将来使用。

    如果你使用
    IOUtils

    它将字节从网络复制到一个字节数组,稍后可以在 PdfReader 中使用。以及 JDBC 调用以将其存储在 DB 中。

    关于java - 更好地理解 Java I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10510847/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com