我用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个字节长。

07-26 09:29