2017-05-28 31 views
-4

我試圖將一個對象數組保存到一個文件,然後能夠讀取該文件中的對象並將它們添加到數組。我沒有得到任何錯誤,但它似乎沒有做任何事情。我不確定我的問題在於我的讀取或寫入方法。讀取/寫入對象數組到文件

Movie allmovies = new Movie[4] 
public void writeFile() 
    { 
     try 
     { 
      FileOutputStream fos = new FileOutputStream("movies.txt"); 
      ObjectOutputStream oos = new ObjectOutputStream(fos); 
      oos.writeObject(allmovies); 
      oos.close(); 
      System.out.println("File Saved"); 
     } 
     catch(Exception e) { 
      System.out.println("Error in output:" + e.toString()); 
     } 
    } 
    public void readFile() 
    { 
     try 
     { 
      FileInputStream fis = new FileInputStream("movies.txt"); 
      ObjectInputStream ois = new ObjectInputStream(fis); 
      Movie[] allmovies = (Movie[]) ois.readObject(); 
      ois.close(); 
      System.out.println("File Imported"); 
     } 
     catch(Exception e) 
     { 
      System.out.println("Error in output:" + e.toString()); 
     } 
    } 

編輯:此外,我們已經考慮到我們需要閱讀示例文件的格式是

電影標題:

導演:

作品尺寸:

時間:

我能夠得到它寫1個對象和重新廣告1對象,但當我查看保存的文件時,它的格式不同。無論如何,它要採用與例子相同的格式?

+3

a)您的代碼不「按兵不動」,因爲..你還沒有寫你的代碼做任何可觀察到的。沒有顯示任何內容的打印語句,並且您只是將電影讀入** local **變量'allmovies'中,而不是返回/打印等。(您還有一個在方法外部聲明的變量'allmovies',但是您沒有讀到這個 ​​- 無論如何你也不打印它)。所以..也許你沒有顯示你的真實代碼,但是上面的代碼不會「做」任何事情。 –

+2

「另外我們給出的示例文件的格式是我們需要閱讀的」..並且這裏顯示的是基於文本的文件格式。所以如果這就是你應該讀/寫的方式,那麼你不應該使用對象序列化。 –

+1

長話短說:提供[mcve] – GhostCat

回答

0

這是使用沒有任何集合的數組完成的。我修改了一下你的代碼,希望這會有所幫助。你可以直接複製這段代碼並運行。它將成功讀取對象並顯示其中的所有四個對象。在將要上傳的未來版本中,我將添加更多評論以增加相同的清晰度。

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 


public class Test { 
Movie[] allMovies = new Movie[4]; 
public static void main(String[] args) { 
    Test t = new Test(); 
    t.allMovies[0] = new Movie("A","B",1L,2L); 
    t.allMovies[1] = new Movie("C","D",1L,2L); 
    t.allMovies[2] = new Movie("E","F",1L,2L); 
    t.allMovies[3] = new Movie("G","H",1L,2L); 
    t.writeFile(); 
    t.readFile(); 
} 
public void writeFile() 
{ 
    try 
    { 
     FileOutputStream fos = new FileOutputStream("movies.txt"); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(allMovies); 
     oos.close(); 
     System.out.println("File Saved"); 
    } 
    catch(Exception e) { 
     System.out.println("Error in output:" + e.toString()); 
    } 
} 
public void readFile() 
{ 
    try 
    { 
     FileInputStream fis = new FileInputStream("movies.txt"); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     Movie[] allmovies = (Movie[]) ois.readObject(); 
     for(int i = 0; i < 4; i++){ 
      System.out.println("Movie = " + allmovies[i].movieTitle + " Director = " + allmovies[i].director + " FileSize = " + allmovies[i].fileSize + " Duration = " + allmovies[i].duration); 
     } 
     ois.close(); 
     System.out.println("File Imported"); 
    } 
    catch(Exception e) 
    { 
     System.out.println("Error in output:" + e.toString()); 
    } 
} 
} 
class Movie implements Serializable{ 
private static final long serialVersionUID = 1647631086810497694L; 
String movieTitle; 
String director; 
Long fileSize; 
Long duration; 
Movie(String m, String d, Long fs, Long dur){ 
    this.movieTitle = m; 
    this.director = d; 
    this.fileSize = fs; 
    this.duration = dur; 
} 
} 
+0

我不認爲這是完全正確的。 writeFile()工作,但readFile()打印文件中的內容,但給出一個空指針異常,但它不會崩潰? –

+0

你可以分享它拋出的異常,我的意思是堆棧跟蹤,因爲我沒有任何問題運行代碼。 –

+0

「輸出錯誤:java.lang.NullPointerException」。我不確定它是否真的將它們添加到數組中,而不是僅僅打印文件中的內容。另外,我編輯了我的原始文章,包括我希望它是字符串格式,而不是二進制。 –

1

也是我們一直考慮到我們需要 讀取示例文件的格式是

電影標題:

導演:

作品尺寸:

持續時間:

我能夠讓它寫1個對象並讀取1個對象,但當我查看保存的文件時,它的格式是 。

Java序列化允許將對象編碼爲字節而不是對序列化對象的文本人類可理解表示進行編碼。
如果你真的要寫你展示的格式文件,你應該使用:

  • 寫電影中的文本表示:一個BufferedWriter包裝一FileWriter
    例如:new BufferedWriter(new FileWriter("myFile"))
    它有一個append(CharSequence)方法來追加String對象和一個newLine()方法來追加一個換行符。

  • 以文字表示形式閱讀電影:A BufferedReader包裝FileReader
    例如:new BufferedReader(new FileReader("myFile"))
    它有一個readLine()方法來讀取流的一行。


如果你想序列化的電影以字節爲單位,只有使它們作爲一個文本表示,保持使用Java序列化,並添加處理,以顯示在所需要的文本格式的電影陣列。
反序列化數組後,您只需對其進行迭代即可生成電影所需的文本表示。
例如呈現在標準輸出的讀取對象,你可以寫:

Movie[] movies = (Movie[]) ois.readObject(); 
for (Movie movie : movies){ 
     System.out.println("Movie Title:" + movie.getTitle()); 
     System.out.println("Director:" + movie.getDirector()); 
     System.out.println("fileSize:" + String.valueOf(movie.getTitle())); 
     System.out.println("duration:" + movie.getTitle()); 
} 
+0

嗨,有沒有辦法我可以下午你?我現在無法發佈我的代碼,因爲它太長了。我已經設法讓它將名稱保存爲字符串到文本文件,但想要保存整個對象(名稱,導演,文件大小,持續時間) –