我想从网络流中读取,并将字节直接写入文件。但是每次我运行这个程序时,实际上很少有字节被写入文件中。
爪哇:
InputStream in = uc.getInputStream();
int clength=uc.getContentLength();
byte[] barr = new byte[clength];
int offset=0;
int totalwritten=0;
int i;
int wrote=0;
OutputStream out = new FileOutputStream("file.xlsx");
while(in.available()!=0) {
wrote=in.read(barr, offset, clength-offset);
out.write(barr, offset, wrote);
offset+=wrote;
totalwritten+=wrote;
}
System.out.println("Written: "+totalwritten+" of "+clength);
out.flush();发布于 2014-12-30 14:42:36
那是因为可得()没有做你想做的事情。阅读它的API文档。您应该直接读取,直到读取的字节数(由read()返回)为-1。或者更简单,使用Files.copy()
Files.copy(in, new File("file.xlsx").toPath());使用具有输入流大小的缓冲区也大大超出了使用缓冲区的目的,缓冲区的目的是内存中只有几个字节。
如果要重新实现copy(),一般模式如下:
byte[] buffer = new byte[4096]; // number of bytes in memory
int numberOfBytesRead;
while ((numberOfBytesRead = in.read(buffer)) >= 0) {
out.write(buffer, 0, numberOfBytesRead);
}发布于 2014-12-30 14:40:16
使用.available()是错误的。来自Java文档:
available()返回可以从此输入流中读取(或跳过)的字节数的估计值,而无需在下次调用该输入流的方法时阻塞这些字节数。
这意味着当您的流第一次比您的文件写入速度慢(很可能很快)时,时间结束。
您应该准备一个线程,等待输入,直到它读取了所有预期的内容长度(当然有相当大的超时时间),或者在等待中阻塞您的程序,如果用户交互不是什么大不了的事情。
https://stackoverflow.com/questions/27707222
复制相似问题