为什么PDF InputStream.read()返回-1?

时间:2018-11-12 12:20:40

标签: java

我从SOAP响应中获取PDF文档并将其存储在文件中(即使我不使用它也是如此)。

InputStream in = ( ( InputStream ) att.getContent() );

// TODO For now save in the file system
OutputStream outputStream = new FileOutputStream( "Sample.pdf" );

int read = 0;
byte[] bytes = new byte[1024];

// Write the data to the pdf file created
while((read=in.read(bytes))!=-1)
{
    outputStream.write( bytes, 0, read );
}
outputStream.flush();
outputStream.close();

return in;

我直接return in而不关闭与另一个功能的连接:

DataOutputStream dataStream = new DataOutputStream(submitConnection.getOutputStream()); 

int read;
byte[] buffer = new byte[1024];
while((read = documentInputStream.read(buffer)) != -1) {
    dataStream.write(buffer, 0 , read);
}

dataStream.flush();
dataStream.close();
documentInputStream.close();

但是当我尝试执行此操作时,documentInputStream.read(buffer)返回-1,因此我正在向连接submitConnection发送空缓冲区

PS:我进行了调试,当这种情况发生时,documentInputStreamcount = size of my Sample.pdf文件,因此我认为这是正确的。

为什么我不能再次读取输入流并将其发送到另一个输出流?

2 个答案:

答案 0 :(得分:1)

医生说:

  

返回:数据的下一个字节;如果流的末尾为,则返回-1。   到达。

意味着您已经达到了流的结尾,因此在该流中没有更多内容可以阅读...要么重新打开它,要么倒带它。

答案 1 :(得分:0)

您只能读取一次流,因为当您读取流时数据会流掉。

您可以倒带一些流以再次读取它们,但是通过网络进入的流通常不具有这种性质。

您需要做的是将内容缓冲在某个位置(可能在磁盘文件上),然后从那里进行处理。这也使保持网络连接打开所需的时间最少,这通常是一件好事。