最近我在学习Java中的文件I/O,了解到缓冲流通过间歇性地存储数据,并仅在缓冲区充满时才将数据写入磁盘(或从磁盘读取)可以使整个过程更有效率。
现在,我有一个程序,其中有一个由256个布尔值和一个浮点数值组成的ArrayList
。
我正在尝试将这些数据序列化(我不希望简单地以人类可读的形式写入数据)。
所以我目前使用FileOutputStream
链接到ObjectOutputStream
,并使用它的writeObject()
方法首先写入boolean
数组,然后是float
变量。当使用FileInputStream
和ObjectInputStream
读取时,我也同样处理。
现在,由于我好奇如何在这里使用BufferedOutputStream
,因此我查看了文档,但它拥有的两个重载写入方法对我来说似乎不够灵活-
- 第一个方法需要一个字节数组和一些额外的参数用于偏移和长度
- 第二个方法需要一个字节。
那么,这是否意味着我必须将我的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
呢?