最近,我一直在学习Java中的文件I / O,我知道缓冲流通过间歇性地存储数据并仅在写入磁盘(或从磁盘读取)时使整个过程更高效。缓冲区已满。
[现在,我有一个程序,其中ArrayList
为256 boolean
,并且有一个浮点值。我正在尝试序列化此数据(我不希望简单地以人类可读的形式写入数据)。因此,我目前要做的是将FileOutputStream
链接到ObjectOutputStream
,并使用其writeObject()
方法首先写入boolean
数组,然后写入float
变量。当使用FileInputStream
和ObjectInputStream
进行阅读时,我也这样做。
现在,由于我很好奇在这里如何使用BufferedOutputStream
,因此我经历了documentation,但是两个重载的写方法对我来说似乎不够灵活-
因此,这是否意味着我必须将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); } } }
所以,要使用
BufferedOutputStream
和BufferedInputStream
,我必须在此处进行哪些更改?
最近,我一直在学习Java中的文件I / O,并且我知道缓冲流通过间歇性地存储数据并仅写入磁盘(或...)来提高整个过程的效率。
您对缓冲的理解不正确。如果您正在执行低效写入/读取
,例如逐行读取和处理,而不仅仅是尝试尽快读取流,则Stream和Writer / Reader缓冲区将非常有用。在写方面,这意味着在一次调用中发送完整的消息,而不是在发送数据之前进行多次写调用。如果您要进行效率