[英]Using BufferedOutputStream in Java
最近,我一直在学习 java 中的文件 I/O,我开始知道 Buffered Streams 通过间歇性地存储数据并且只在缓冲区写入磁盘(或读取它)时使整个过程更加高效已满。
现在,我有一个程序,其中我有一个 256 ArrayList
的boolean
和一个浮点值。
我正在尝试序列化这些数据(我不希望简单地以人类可读的形式编写数据)。
所以我目前所做的是将FileOutputStream
链接到ObjectOutputStream
并使用它的writeObject()
方法首先写入boolean
数组,然后写入float
变量。 使用FileInputStream
和ObjectInputStream
阅读时我也会这样做。
现在,由于我很好奇我将如何 go 在这里使用BufferedOutputStream
,我浏览了文档,但它的两个重载写入方法对我来说似乎不够灵活-
那么,这是否意味着我必须将我的boolean
数组转换为字节数组才能使用BufferedOutputStream
object? 那么我如何将我的浮点数转换为一个字节? 我也对如何使用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
?
您对缓冲的理解是不正确的。 Stream 和 Writer/Reader 缓冲区在您进行低效的写入/读取时很有用,例如逐行读取和处理,而不是尽可能快地尝试从 stream 读取。 在写入方面,这意味着在 1 次调用中发送完整的消息,而不是在发送数据之前进行多次写入调用。 如果您正在进行高效的读写,则不需要缓冲区。
至于如何序列化的问题:Object 流很容易使用,但最终会给您留下不兼容的数据。 如果您希望您的序列化是最佳的,我建议您将 boolean[] 转换为 byte[] ,您可以通过常规 OutputStream 编写它
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.