我用Java编写了一个小型HTML Web服务器。我刚刚实现了fileupload功能,但是遇到了问题。
浏览器通过XMLHttpRequest()发送文件,而我的Web服务器按照下面的描述读取文件的字节流。
char[] buffer = new char[1024 * 8];
int n;
int total = 0;
for(int count = 0; count < length; count++){
System.out.println(count + "." + length);
n = input.read( buffer );
fileWriter.write( buffer, 0, n );
count += n;
total = count;
}
fileWriter.close();
长度是后主体的大小->因此for循环知道何时该结束。此方法非常有效-在Windows上。但不是在linux上!实际上,字节流小于主体长度,因此我的脚本等待新的字节/数据包,直到达到后主体长度为止。例如,最后的输出是:
229404.280212
237597.280212
245790.280212
253983.280212
262176.280212
数字“ 262176”应为280212。这时,我的服务器正在等待新的数据包...
谢谢你的帮助。
最佳答案
我认为这里存在一些问题以及一些误解。
为什么用++运算符递增count
?每次读取时,只能通过在其上添加n
来增加它。total
变量只是计数的另一个名称,您只是使用它将其从for
的范围导出?为什么不循环创建count
?
同样,当前循环将永远不会打印最后一次递增n
的结果,因为当count
递增到-或大于length
时,循环终止。这意味着迫使循环终止的值不会被循环打印。
如果这段代码完全符合您的意图,我将感到惊讶。
我将用while循环替换for循环。
char[] buffer = new char[1024 * 8];
int total = 0;
while (total < length){
int n = input.read( buffer );
fileWriter.write( buffer, 0, n );
total += n;
System.out.println(total + "." + length);
}
fileWriter.close();
您还希望在try-with-resources构造中使用文件编写器,而不是显式使用close()。
您还应确保在wile循环中添加一个超时,并添加一个套接字超时,这样您就不会陷入无限循环或读取过程中的无限块中。
还要注意,在Java中char是2个字节长。