java BufferedOutputStream

时间:2017-05-31 16:06:46

标签: java stream

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();
        }

    }
}

但是这段代码的结果是真空。

我认为第一个代码和第二个代码非常相似。

为什么不(第二代码)运作良好?

2 个答案:

答案 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)

啊年龄flushBuffered Stream问题。

使用flush方法。

将它放在while循环之后

bos.flush();

来自文档

  

该类实现缓冲输出流。通过设置这样一个   输出流,应用程序可以将字节写入底层输出   流不必导致对底层系统的调用   写下每个字节。

这里的关键点是

  

不必为每个系统调用底层系统   字节写。

这基本上意味着数据在内存中缓冲,而不是在每次write方法调用时写入输出流。

您应该以适当的间隔刷新缓冲区并使用close方法关闭流以强制退出最终缓冲区。