package byte_base;
import java.io.FileInputStream;
import java.io.IOException;
public class FileViewer {
public static void main(String[] args) {
int a;
try{
FileInputStream fis = new FileInputStream("FileViewerln.txt");
while((a = fis.read())!=-1){
System.out.write(a);
}
}catch(IOException ioe){
System.err.println(ioe);
ioe.printStackTrace();
}
}
}
是程序,从文件打印文本。 当我使用FileInputStream Class和System.out.write()方法时,它运行得很好。
但我尝试了另一种方式。 我使用BufferedOutputStream而不是System.out.write()方法。
底部是使用BufferedOutputStream类的代码。
package byte_base;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class CopyOfFileViewer {
public static void main(String[] args) {
int a;
try{
FileInputStream fis = new FileInputStream("FileViewerln.txt");
BufferedOutputStream bos = new BufferedOutputStream(System.out);
while((a = fis.read())!=-1){
bos.write(a);
}
}catch(IOException ioe){
System.err.println(ioe);
ioe.printStackTrace();
}
}
}
但是这段代码的结果是真空。
我认为第一个代码和第二个代码非常相似。
为什么不(第二代码)运作良好?
答案 0 :(得分:1)
您忘记关闭OutputStream bos
。
bos.close();
实际上,在try-with-resources
中进行操作要好得多 try (FileInputStream fis = new FileInputStream("FileViewerln.txt");
BufferedOutputStream bos = new BufferedOutputStream(System.out);
) {
while((a = fis.read())!=-1){
bos.write(a);
}
} catch(IOException ioe){
System.err.println(ioe);
ioe.printStackTrace();
}
类InputStream
实现Closeable
。所以它的子类可以用于try-with-resources。
答案 1 :(得分:0)
啊年龄flush
和Buffered Stream
问题。
使用flush方法。
将它放在while循环之后
bos.flush();
来自文档
该类实现缓冲输出流。通过设置这样一个 输出流,应用程序可以将字节写入底层输出 流不必导致对底层系统的调用 写下每个字节。
这里的关键点是
不必为每个系统调用底层系统 字节写。
这基本上意味着数据在内存中缓冲,而不是在每次write
方法调用时写入输出流。
您应该以适当的间隔刷新缓冲区并使用close
方法关闭流以强制退出最终缓冲区。