Java如何从InputStream中读取收入大小? [复制]
Posted
技术标签:
【中文标题】Java如何从InputStream中读取收入大小? [复制]【英文标题】:Java how to read from an InputStream the incomed size? [duplicate] 【发布时间】:2014-11-03 22:20:09 【问题描述】:byte[] b = new byte[10000];
len = readerIn.read(b); // InputStream
我的字节大小是 10000,但 InputStream
的大小可能会更低或更高。有没有办法只读取进入InputStream
的数据大小?
【问题讨论】:
您是在问如何将输入流完全读入正确长度的字节数组中?或者你只是想知道流的大小,而不阅读它? @Duncan 是的,我想读取正确的大小,确切的大小,不多或少到字节数组或任何其他可以帮助我保存读取的字节的类 不加载就无法获取大小。 Grrrrrr,您编辑了您的评论,就像我关闭了另一个问题的副本一样。正确的副本是:Convert InputStream to byte array in Java。你赢得了我的反对票,因为这是一个很容易研究的话题。 【参考方案1】:在read方法中不加参数,可以逐字节读取数据的总大小:
len = readerIn.read();
你可以读到流的结尾
while((readerIn.read())!=-1)
[your code]
【讨论】:
如果我这样读,如果没有字节缓冲区参数,数据会放在哪里? 读取一个字节,然后返回一个字节。我不认为这是你想要的。 这是完全错误的。这会从输入流中读取一个字节。 我已经编辑了答案。我没有表达好。我忘了添加循环 @RafaRomero 还有一个问题,如果没有明确指出大小字节 [] = 新字节 [1024],我如何阅读它,我希望使它成为动态的,但在这里我必须创建这个字节数组再次【参考方案2】:您可以为此使用ByteArrayOutputStream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int reads = is.read();
while(reads != -1)
baos.write(reads);
reads = is.read();
byte[] data = baos.toByteArray();
数据数组大小合适,包含InputStream
的所有数据
【讨论】:
一次读取和写入一个字节的效率非常低,特别是如果传入的流没有内部缓冲。 this answer from the linked duplicate question 会更好,它通过临时固定大小的缓冲区使用批量读写。以上是关于Java如何从InputStream中读取收入大小? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Java -- 如何从 inputStream (socket/socketServer) 中读取未知数量的字节?
如何读取服务器套接字 JAVA 中的所有 Inputstream
Java InputStream 无法从 JAR 中读取文件
无法从 Java 进程(Runtime.getRuntime().exec() 或 ProcessBuilder)读取 InputStream