当前位置: 首页 > 知识库问答 >
问题:

Java中的InputStream read()如何确定要读取的字节数?

夏烨霖
2023-03-14

http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read()

文档说“从输入流中读取一些字节,并将它们存储到缓冲区数组b中”。

Java 中的 InputStream read() 如何确定字节数?

共有2个答案

曹普松
2023-03-14

我认为混淆来自“阅读”的含义。

read()返回InpuStream中的下一个字节,如果没有剩余字节,则返回-1。

但是,由于您正在使用的特定InpuStream的实现细节,包含正在读取的字节的源可能读取了多个字节以告诉您下一个字节:

>

  • 如果您的InputStream被缓冲,那么整个缓冲区长度可能会被读入内存,只是为了告诉您下一个字节是什么。但是,在内存中的缓冲区耗尽之前,后续对read()的调用可能不需要再次读取底层源代码
  • 如果您的InputStream正在读取压缩文件,那么底层源可能需要读取几个字节来解压缩数据,以便返回下一个解压缩字节。

    InputStream的层包装其他InputStream,如< code > new GZIPInputStream(new BufferedInputStream(new file inputstream(file)));将根据层使用上面的#1和#2。

  • 巴英韶
    2023-03-14

    缓冲数组有一个定义的长度,称之为 nread() 方法将读取 1 到 n 个字节。它将阻塞,直到至少有一个字节可用,除非检测到 EOF。

     类似资料:
    • 我想以UTF-8快速地逐行读取大的csv文件(大约~1GB)。我已经为它创建了一个类,但它不能正常工作。UTF-8从2字节解码西里尔符号。我使用字节缓冲区来读取它,例如,它有10个字节的长度。因此,如果文件中的符号由10和11字节组成,它将无法正常解码:(

    • 编辑:到目前为止,我所见过的每一个类似LineReader的类似乎都被缓冲了。有没有人知道一个无缓冲的类linereader类?

    • 问题内容: 我知道 bufio 包中的golang中的特定功能。 Peek返回下一个n个字节, 而不会使阅读器前进 。在下一个读取调用中,字节停止有效。如果Peek返回的字节数少于n个字节,则它还会返回一个错误,解释读取短的原因。如果n大于b的缓冲区大小,则错误为ErrBufferFull。 我需要能够从阅读器读取特定数量的字节,以 使阅读器更先进 。基本上,与上面的功能相同,但是它使阅读器更高级

    • 问题内容: 我有一个文件,其中第一个字节包含编码信息。在Matlab中,我可以使用逐位读取字节,然后通过等读取每个位。 python中是否有任何等效的阅读器? 问题答案: 从文件中读取位,首先读取低位。

    • 据我所知,缓冲阅读器比非缓冲阅读器优化了很多,因为每次读取都将从内存中完成,不需要每次都从磁盘/网络进行I/O读/写。 所以我在这里阅读答案: 缓冲读取器和文件读取器之间的特定区别 我被第二个答案弄糊涂了,这个答案似乎有很高的票数: 当向BufferedReader对象发出“read”指令时,它会使用FileReader对象从文件中读取数据。当给出指令时,FileReader对象一次读取2(或4)

    • 问题内容: 建立连接并要读取来自连接的字节后,如何读取所有字节?从我尝试过的内容中,我可以读取直到到达分隔符(如换行符)为止。但是如何获得包括换行符在内的所有信息?我试图在Go中创建一个Redis客户端,并且该协议使用\ r \ n分隔结果,因此在这种情况下,Buffer.ReadLine或Buffer.ReadSlice没有帮助。 问题答案: 要从读取器读取所有字节(例如您的TCP连接),可以使