2017-05-28 58 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

嗨,有没有办法我可以下午你?我现在无法发布我的代码,因为它太长了。我已经设法让它将名称保存为字符串到文本文件,但想要保存整个对象(名称,导演,文件大小,持续时间) –