Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将对象数组读/写到文件_Java - Fatal编程技术网

Java 将对象数组读/写到文件

Java 将对象数组读/写到文件,java,Java,我试图将对象数组保存到文件中,然后能够从该文件中读取对象并将其添加到数组中。我没有收到任何错误,但它似乎没有任何作用。我不确定我的问题是否在于我的读写方法 Movie allmovies = new Movie[4] public void writeFile() { try { FileOutputStream fos = new FileOutputStream("movies.txt"); ObjectOu

我试图将对象数组保存到文件中,然后能够从该文件中读取对象并将其添加到数组中。我没有收到任何错误,但它似乎没有任何作用。我不确定我的问题是否在于我的读写方法

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个对象,但当我查看保存的文件时,它的格式不同。有没有办法以与示例相同的格式获取它?

这是使用没有任何集合的数组完成的。我对你的代码做了一些修改,希望对你有所帮助。你可以直接复制代码并运行。它将成功读取对象并显示所有四个对象。在我将上传的未来版本中,我将添加更多的评论,以提高相同内容的清晰度

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;
}
}
import java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
导入java.io.Serializable;
公开课考试{
电影[]所有电影=新电影[4];
公共静态void main(字符串[]args){
测试t=新测试();
t、 所有电影[0]=新电影(“A”、“B”、1L、2L);
t、 所有电影[1]=新电影(“C”、“D”、1L、2L);
t、 所有电影[2]=新电影(“E”、“F”、1L、2L);
t、 所有电影[3]=新电影(“G”、“H”、1L、2L);
t、 writeFile();
t、 readFile();
}
公共无效写入文件()
{
尝试
{
FileOutputStream fos=新的FileOutputStream(“movies.txt”);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(所有电影);
oos.close();
System.out.println(“文件已保存”);
}
捕获(例外e){
System.out.println(“输出错误:+e.toString());
}
}
公共void readFile()
{
尝试
{
FileInputStream fis=新的FileInputStream(“movies.txt”);
ObjectInputStream ois=新ObjectInputStream(fis);
电影[]所有电影=(电影[])ois.readObject();
对于(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(“文件导入”);
}
捕获(例外e)
{
System.out.println(“输出错误:+e.toString());
}
}
}
类电影实现可序列化{
私有静态最终长serialVersionUID=1647631086810497694L;
弦乐电影;
字符串控制器;
长文件大小;
持续时间长;
电影(字符串m、字符串d、长fs、长dur){
this.movieTitle=m;
这个。导演=d;
this.fileSize=fs;
这个时间=dur;
}
}

另外,我们得到的示例文件的格式需要 阅读是

电影名称:

主任:

文件大小:

持续时间:

我能让它写一个对象,读一个对象,但它在 查看保存的文件时使用不同的格式

Java序列化允许将对象编码为字节,而不是序列化对象的文本表示形式。
如果确实要以显示的格式写入文件,应使用:

  • 以文本形式编写电影:一个
    BufferedWriter
    包装一个
    FileWriter

    例如:
    newbufferedwriter(newfilewriter(“myFile”))

    它有一个
    append(CharSequence)
    方法来追加
    String
    对象,还有一个
    newLine()
    方法来追加换行符

  • 以文本形式阅读电影:一个
    BufferedReader
    包装一个
    FileReader

    例如:
    newbufferedreader(newfilereader(“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());
}

a) 您的代码没有“做任何事情”,因为。。您还没有编写代码来执行任何可观察的操作。没有显示任何内容的print语句,您只需将您的电影读入一个局部变量
allmovies
,而不返回/打印该变量,等等(您还有一个变量
allmovies
,在方法之外声明,但您没有读入该变量,而且在任何情况下,您也没有打印它)。所以也许你还没有展示你真正的代码,但是上面的代码不应该“做”任何事情。。这里显示的是一种基于文本的文件格式。因此,如果你应该这样读/写,那么你就不应该使用对象序列化。长话短说:提供@ErwinBolwidt我只发布了方法…我认为这不太正确。writeFile()可以工作,但readFile()会打印文件中的内容,但会出现空指针异常,但不会崩溃?您能否共享它引发的异常,我指的是堆栈跟踪,因为我运行代码时没有任何问题。“输出错误:java.lang.NullPointerException”。我不确定它是否真的将它们添加到数组中,而不仅仅是打印文件中的内容。另外,我编辑了我的原始帖子,希望它是字符串格式,而不是二进制。我想我知道这里出了什么问题,你能把文件名从'movies.txt'改为'newmovies.txt'并试着运行它吗?名称出现在代码中的两个位置,请更改为bot