【问题标题】:BufferedOutputStream writing garbage dataBufferedOutputStream 写入垃圾数据
【发布时间】:2011-09-21 03:20:38
【问题描述】:

我正在编写下载 servlet,它读取一个 html 文件并写入 servletOutputStream,问题就在传输的文件中,它添加了一些垃圾数据,对此有任何建议,

下面是我使用的代码


        int BUFFER_SIZE = 1024 * 8;
        servOut   = response.getOutputStream();
        bos       = new BufferedOutputStream(servOut);
        fileObj = new File(file);
        fileToDownload = new FileInputStream(fileObj);
        bis = new BufferedInputStream(fileToDownload);
        response.setContentType("application/text/html");
          response.setHeader("ContentDisposition","attachment;filename="+dump+".html");
        byte[] barray = new byte[BUFFER_SIZE];
        while ((bis.read(barray, 0, BUFFER_SIZE)) != -1) {
            bos.write(barray, 0, BUFFER_SIZE);
        }
        bos.flush();

【问题讨论】:

    标签: java servlets download stream


    【解决方案1】:

    bis.read 返回读取的字节数。您需要在write 通话中考虑到这一点。

    类似:

    int rd;
    while ((rd=bis.read(...)) != -1) {
         bos.write(..., rd);
    }
    

    【讨论】:

      【解决方案2】:

      问题在于代码的以下部分:

              while ((bis.read(barray, 0, BUFFER_SIZE)) != -1) {
                  bos.write(barray, 0, BUFFER_SIZE);
              }
      

      你总是写出BUFFER_SIZE字节的倍数,即使你输入的大小不是BUFFER_SIZE的倍数。这会导致在最后一个块的末尾写入垃圾。

      你可以这样修复它:

              int read;
              while ((read = bis.read(barray, 0, BUFFER_SIZE)) != -1) {
                  bos.write(barray, 0, read);
              }
      

      【讨论】:

      • 如果您找到此答案作为解决方案.. 将其标记为正确。
      猜你喜欢
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2023-04-02
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2014-12-02
      相关资源
      最近更新 更多