最近,我一直在学习java中的文件I/O,我认识到缓冲流通过间歇性地存储数据来提高整个过程的效率,并且只有在缓冲区满时才写入磁盘(或从磁盘读取数据)。
现在,我有一个程序,其中有一个ArrayList为256个boolean,还有一个浮点值。
我试图序列化这些数据(我不希望简单地以人类可读的形式编写数据)。
因此,我目前所做的是将一个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,我需要进行哪些更改呢?
发布于 2020-06-05 14:22:10
你对缓冲的理解是不正确的。如果您正在执行效率低下的写入/阅读(例如逐行读取和处理),而不只是尝试尽可能快地从流中读取,则流和Writer/Reader缓冲区非常有用。在编写方面,它意味着在1次调用中发送完整的消息,而不是在发送数据之前进行几次写调用。如果你的阅读和写作效率很高,你就不需要缓冲。
至于如何序列化的问题:对象流很容易使用,但最终会给您留下不兼容的数据。如果您希望您的序列化是最佳的,我建议您将boolean[]转换为可以通过常规OutputStream编写的byte[]
https://stackoverflow.com/questions/62217184
复制相似问题