首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java BufferedOutputStream

java BufferedOutputStream
EN

Stack Overflow用户
提问于 2017-06-01 00:06:46
回答 2查看 513关注 0票数 0
代码语言:javascript
复制
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类和System.out.write()方法时,它运行得很好。

但我试过另一种方法。我使用了BufferedOutputStream而不是System.out.write()方法。

底部是使用BufferedOutputStream类编写的代码。

代码语言:javascript
复制
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();
        }

    }
}

但是这段代码的结果是vacuum。

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

为什么它(第二个代码)不能正常工作?

EN

回答 2

Stack Overflow用户

发布于 2017-06-01 00:12:11

您忘记关闭OutputStream bos

代码语言:javascript
复制
bos.close();

实际上,在try-with-resources中执行操作要好得多

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2017-06-01 00:10:58

啊,古老的flushBuffered Stream问题。

使用flush方法。

将其放在while循环之后

bos.flush();

从文档中

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

这里的关键点是

,而不必为写入的每个字节调用底层系统。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44289660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档