簡體   English   中英

在 Java 中使用 BufferedOutputStream

[英]Using BufferedOutputStream in Java

最近,我一直在學習 java 中的文件 I/O,我開始知道 Buffered Streams 通過間歇性地存儲數據並且只在緩沖區寫入磁盤(或讀取它)時使整個過程更加高效已滿。

現在,我有一個程序,其中我有一個 256 ArrayListboolean和一個浮點值。
我正在嘗試序列化這些數據(我不希望簡單地以人類可讀的形式編寫數據)。
所以我目前所做的是將FileOutputStream鏈接到ObjectOutputStream並使用它的writeObject()方法首先寫入boolean數組,然后寫入float變量。 使用FileInputStreamObjectInputStream閱讀時我也會這樣做。

現在,由於我很好奇我將如何 go 在這里使用BufferedOutputStream ,我瀏覽了文檔,但它的兩個重載寫入方法對我來說似乎不夠靈活-

  1. 第一個,它接受一個字節數組和幾個偏移量和長度參數
  2. 第二個,它占用一個字節。

那么,這是否意味着我必須將我的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);
            }
        }
    }

那么,我必須在這里進行哪些更改才能使用BufferedOutputStreamBufferedInputStream

您對緩沖的理解是不正確的。 Stream 和 Writer/Reader 緩沖區在您進行低效的寫入/讀取時很有用,例如逐行讀取和處理,而不是盡可能快地嘗試從 stream 讀取。 在寫入方面,這意味着在 1 次調用中發送完整的消息,而不是在發送數據之前進行多次寫入調用。 如果您正在進行高效的讀寫,則不需要緩沖區。

至於如何序列化的問題:Object 流很容易使用,但最終會給您留下不兼容的數據。 如果您希望您的序列化是最佳的,我建議您將 boolean[] 轉換為 byte[] ,您可以通過常規 OutputStream 編寫它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM