我们在实验室中进行了一些练习,其中之一是将文件传输方法从FileInputStream转换为BufferedInputStream。它是客户端向Web服务器发送GET请求,然后Web服务器发送请求的文件。
我想出了一个简单的解决方案,我只是想检查一下是否正确。

原始代码:

try {
      FileInputStream fis = new FileInputStream(req);
      // req, String containing file name
      byte[] data = new byte [fis.available()];
      fis.read(data);
      out.write(data); // OutputStream out = socket.getOutputStream();
    } catch (FileNotFoundException e){
      new PrintStream(out).println("404 Not Found");
    }


我的尝试:

try {
      BufferedInputStream bis = new BufferedInputStream (new FileInputStream(req));
      byte[] data = new byte[4];

      while(bis.read(data) > -1) {
        out.write(data);
        data = new byte[4];
      }
    } catch (FileNotFoundException e){
      new PrintStream(out).println("404 Not Found");
    }


该文件是一个名为index.html的网页,其中包含一个简单的html页面。
我每次都必须重新分配数组,因为在while循环的最后一次执行时,如果文件的大小不是4的倍数,则数据数组将包含上一次执行的字符,这些字符在浏览器中显示。
我选择4作为数据大小以进行调试。
输出正确。

这是一个好的解决方案还是我可以做得更好?

最佳答案

无需每次都重新创建字节数组-只需覆盖它即可。但更重要的是,您的循环中存在一个概念上的错误。假设每次迭代都是有效的,则每次迭代仅将其写入流中。如果查看BufferedInputStream#read的文档,您会发现它可能无法读取足够的数据来填充整个数组,并且会返回它实际读取的字节数。您应该使用此数字来限制要写入的字节数:

while((int len = bis.read(data)) > -1) {
    out.write(data, 0, len);
}

关于java - 从FileInputStream到BufferedInputStream的转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36371771/

10-09 08:20