首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中使用BufferedOutputStream

在Java中使用BufferedOutputStream
EN

Stack Overflow用户
提问于 2020-06-05 14:04:37
回答 1查看 251关注 0票数 3

最近,我一直在学习java中的文件I/O,我认识到缓冲流通过间歇性地存储数据来提高整个过程的效率,并且只有在缓冲区满时才写入磁盘(或从磁盘读取数据)。

现在,我有一个程序,其中有一个ArrayList为256个boolean,还有一个浮点值。

我试图序列化这些数据(我不希望简单地以人类可读的形式编写数据)。

因此,我目前所做的是将一个FileOutputStream链接到一个ObjectOutputStream,并使用它的writeObject()方法首先编写boolean数组,然后编写float变量。在使用FileInputStreamObjectInputStream阅读时,我也会这样做。

现在,由于我很好奇如何在这里使用BufferedOutputStream,我浏览了文档,但是这两种重载的写方法在我看来不够灵活-

  1. 第一种方法,它接受一个字节数组,并为偏移量和长度增加几个参数。
  2. 第二个,它需要一个字节。

那么,这是否意味着我必须将我的boolean数组转换为一个字节数组,才能使用BufferedOutputStream对象?那么我将如何将我的浮点数转换成一个字节呢?对于如何使用BufferedInputStream读取数据,我也感到困惑。

在进行了所有的转换之后,这里是否值得使用缓冲区呢?

这是我的原始代码,没有缓冲区

代码语言:javascript
复制
public class MySaveListener implements ActionListener { //this is an inner class by the way
        public void actionPerformed(ActionEvent ev) {
            JFileChooser fileSave = new JFileChooser();
            fileSave.showSaveDialog(theFrame);
            saveFile(fileSave.getSelectedFile());
        }
    }

private void saveFile(File file){
        boolean[] checkboxState = new boolean[256];

        for(int i = 0; i < 256; i++){
            JCheckBox check = (JCheckBox) checkboxList.get(i);
            if (check.isSelected()){
                checkboxState[i] = true;
            }
        }

        try{
            FileOutputStream fileStream = new FileOutputStream(file);
            ObjectOutputStream os = new ObjectOutputStream(fileStream);
            os.writeObject(checkboxState);
            os.writeObject(1239.87f);
            os.close();
        } catch(Exception ex){ex.printStackTrace();}
    }

public class MyLoadListener implements ActionListener {
        public void actionPerformed(ActionEvent ev) {
            JFileChooser fileOpen = new JFileChooser();
            fileOpen.showOpenDialog(theFrame);
            loadFile(fileOpen.getSelectedFile());
        }
    }

private void loadFile(File file){
        boolean[] checkboxState = null;
        try{
            FileInputStream fileIn = new FileInputStream(file);
            ObjectInputStream is = new ObjectInputStream(fileIn);
            checkboxState = (boolean[]) is.readObject();
            float loadTempo = (float)is.readObject();
            is.close();
        } catch(Exception ex){ex.printStackTrace();}

        for(int i = 0; i < 256; i++){
            JCheckBox check = (JCheckBox) checkboxList.get(i);
            if (checkboxState[i]){
                check.setSelected(true);
            }
            else{
                check.setSelected(false);
            }
        }
    }

那么,为了使用BufferedOutputStreamBufferedInputStream,我需要进行哪些更改呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-05 14:22:10

你对缓冲的理解是不正确的。如果您正在执行效率低下的写入/阅读(例如逐行读取和处理),而不只是尝试尽可能快地从流中读取,则流和Writer/Reader缓冲区非常有用。在编写方面,它意味着在1次调用中发送完整的消息,而不是在发送数据之前进行几次写调用。如果你的阅读和写作效率很高,你就不需要缓冲。

至于如何序列化的问题:对象流很容易使用,但最终会给您留下不兼容的数据。如果您希望您的序列化是最佳的,我建议您将boolean[]转换为可以通过常规OutputStream编写的byte[]

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

https://stackoverflow.com/questions/62217184

复制
相关文章

相似问题

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