【发布时间】:2020-06-05 14:04:37
【问题描述】:
最近,我一直在学习 java 中的文件 I/O,我开始知道 Buffered Streams 通过间歇性地存储数据并且只写入磁盘(或从中读取)使整个过程更加高效当缓冲区满时。
现在,我有一个程序,其中有 256 个 boolean 的 ArrayList 和一个浮点值。
我正在尝试序列化这些数据(我不希望简单地以人类可读的形式编写数据)。
所以我目前所做的是将FileOutputStream 链接到ObjectOutputStream 并使用其writeObject() 方法首先编写boolean 数组,然后编写float 变量。我在使用FileInputStream 和ObjectInputStream 阅读时也是如此。
现在,由于我很好奇如何在此处使用 BufferedOutputStream,我查看了 documentation,但它的两个重载写入方法对我来说似乎不够灵活-
- 第一个,它接受一个字节数组和几个偏移量和长度参数
- 第二个,占用一个字节。
那么,这是否意味着我必须将 boolean 数组转换为字节数组才能使用 BufferedOutputStream 对象?那么我如何将我的浮点数转换为一个字节?我也对如何使用BufferedInputStream 读取数据感到困惑。
在进行了所有转换之后,是否值得在这里使用 Buffers?
这是我没有缓冲区的原始代码
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,我必须在这里进行哪些更改?
【问题讨论】:
-
是的,我现在的工作。不过,我希望让它变得更好。您能否详细说明我也可以如何使用布尔值,因为该方法的签名只允许字节数组?
-
不要查看 DataOutputStream。这是一种纯 Java 传输协议,距今已有数十年的历史。
标签: java