我从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:我进行了调试,当这种情况发生时,documentInputStream
有count = size of my Sample.pdf
文件,因此我认为这是正确的。
为什么我不能再次读取输入流并将其发送到另一个输出流?
答案 0 :(得分:1)
医生说:
返回:数据的下一个字节;如果流的末尾为,则返回-1。 到达。
意味着您已经达到了流的结尾,因此在该流中没有更多内容可以阅读...要么重新打开它,要么倒带它。
答案 1 :(得分:0)
您只能读取一次流,因为当您读取流时数据会流掉。
您可以倒带一些流以再次读取它们,但是通过网络进入的流通常不具有这种性质。
您需要做的是将内容缓冲在某个位置(可能在磁盘文件上),然后从那里进行处理。这也使保持网络连接打开所需的时间最少,这通常是一件好事。