我们在实验室中进行了一些练习,其中之一是将文件传输方法从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/