2011-11-22 88 views
0

我試圖保存幾個字符串,但我目前使用ObjectInputStream,顯然不能以永久方式保存我的數據。這是我在我的項目中評論的代碼。它以暫時的方式保存字符串。每當我離開我的程序,吞雲吐霧的數據消失:在java中是否有RandomAccessFile的readObject()替代

ObjectInputStream FileIn= new ObjectInputStream(new FileInputStream("cars.txt")); 

//AND HERE IS THE CODE FOR THE RandomAccessFile VERSION: 
RandomAccessFile FileIn = new RandomAccessFile("cars.txt", "rw"); 

    au=(Cars)FileIn.readObject(); //THIS readObject(), is giving me errors 
    //Cars is a Class 

有沒有我可以用它來讀取RandomAccessFile任何其他替代...請幫助和感謝。

+0

您是否記得在關閉應用程序之前刷新並關閉OutputStream?如果不是那麼這就是爲什麼數據沒有被保存 - 而不是因爲你選擇寫入數據的類。 – Dunes

+0

如何沖洗? –

+0

只需關閉流。 –

回答

-1

那麼你必須調用writeObject()而不是readObject()這實際上是從磁盤讀到內存,當然當程序結束時,程序使用的內存也是如此。

+0

不知道,upvoting。對我來說似乎很好! – EJP

1

就像FileInputStream一樣,您需要將一個RandomAccessFile包裝在ObjectInputStream中。即RandomAccessFile不會爲你購買任何東西。

final RandomAccessFile raf = new RandomAccessFile("file.dat", "r"); 
ObjectInputStream ois = new ObjectInputStream(new InputStream() { 
    @Override 
    public int read(byte[] b, int off, int len) throws IOException { 
     return raf.read(b, off, len); 
    } 

    @Override 
    public int read() throws IOException { 
     return raf.read(); 
    } 
}); 
+0

你可以把它放在代碼PLEAAAASE!它會大大幫助我..我會給你更多的聲譽 –

+1

你不能只是做一個'新的FileInputStream(randomAccessFile.getFD())'? –

+0

@ TomHawtin-tackline,我認爲這會從頭開始讀取文件。如果他想隨機訪問,他將需要不同的東西。 –

0

對於簡單的字符串對象是更容易使用普通DataInputStream類/ DataOutputStream類:

package test; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.util.ArrayList; 
import java.util.List; 

public class TestFile { 

    static final String FILE = "/tmp/cars.txt"; 

    public static void main(String[] args) { 
    try { 
     List<String> strs = new ArrayList<String>(); 
     strs.add("Audi"); 
     strs.add("Seat"); 
     strs.add("Renault"); 

     saveStrings(strs); 

     strs = loadStrings(); 

     System.out.println("Read strings: " + strs); 

    } catch (Exception e) { 

    } 
    } 

    static List<String> loadStrings() throws Exception { 
    DataInputStream dis = null; 
    List<String> list = new ArrayList<String>(); 
    try { 
     dis = new DataInputStream(new FileInputStream(FILE)); 
     while (dis.available() > 0) { 
     list.add(dis.readUTF()); 
     } 
    } finally { 
     if (dis != null) 
     dis.close(); 
    } 

    return list; 
    } 

    static void saveStrings(List<String> list) throws Exception { 
    DataOutputStream dos = null; 

    try { 
     dos = new DataOutputStream(new FileOutputStream(FILE)); 
     for (String str : list) { 
     dos.writeUTF(str); 
     } 
    } finally { 
     if (dos != null) 
     dos.close(); 
    } 
    } 

} 
+0

可能更容易,但可能效率更低(如果您可能存儲重複的字符串)。 – jtahlborn

0

如果你問是否可以使用RandomAccessFile尋求物體周圍的流內部和閱讀的對象則簡短的回答沒有」。序列化的對象流重與向後指向先前使用的對象,包括先前傾倒類定義,等編碼..

我們有類似的要求,寫了一些代碼,它關閉並重新打開序列化的流一次又一次,並記錄這些斷點的位置。這並沒有給我們讀取特定對象的能力,但它使我們能夠追加到序列化流並跳過文件的特定部分 - 跳到下一個中​​斷。