[英]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.