在Java中使用BufferedOutputStream

问题描述 投票:3回答:1

最近,我一直在学习Java中的文件I / O,我知道缓冲流通过间歇性地存储数据并仅在写入磁盘(或从磁盘读取)时使整个过程更高效。缓冲区已满。

[现在,我有一个程序,其中ArrayList为256 boolean,并且有一个浮点值。我正在尝试序列化此数据(我不希望简单地以人类可读的形式写入数据)。因此,我目前要做的是将FileOutputStream链接到ObjectOutputStream,并使用其writeObject()方法首先写入boolean数组,然后写入float变量。当使用FileInputStreamObjectInputStream进行阅读时,我也这样做。

现在,由于我很好奇在这里如何使用BufferedOutputStream,因此我经历了documentation,但是两个重载的写方法对我来说似乎不够灵活-

  1. 第一个,它需要一个字节数组和一些用于偏移量和长度的参数
  2. 第二个,需要一个字节。
  3. 因此,这是否意味着我必须将boolean数组转换为字节数组才能使用BufferedOutputStream对象?那我怎么将我的浮点数转换成一个字节呢?我也对如何使用BufferedInputStream读取数据感到困惑。在进行所有转换之后,在这里使用缓冲区是否值得?

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

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,我必须在此处进行哪些更改?

最近,我一直在学习Java中的文件I / O,并且我知道缓冲流通过间歇性地存储数据并仅写入磁盘(或...)来提高整个过程的效率。

java
1个回答
2
投票

您对缓冲的理解不正确。如果您正在执行低效写入/读取

,例如逐行读取和处理,而不仅仅是尝试尽快读取流,则Stream和Writer / Reader缓冲区将非常有用。在写方面,这意味着在一次调用中发送完整的消息,而不是在发送数据之前进行多次写调用。如果您要进行效率
© www.soinside.com 2019 - 2024. All rights reserved.