FileInputStream和OutputStream无法读取和写入对象到文件中

时间:2015-04-28 11:36:13

标签: java file-io arraylist fileinputstream fileoutputstream

说明

在我的程序中,要求用户输入一些值。这些值存储在ArrayList中,以便我可以将它们打印出来。现在这个问题是我终止程序后所有数据都丢失了。这就是为什么我决定将这些arrayList对象存储到文件中并从那里读取它们的原因。

问题/问题:

我已经创建了所有相关的写入和读取文件的方法。但似乎没有任何对象在文件中写入和读取。我主要关注的是ReadWrite

工作代码:

读写:

    public void writeFile(List<PersonInfo> information) {

    try {
        FileOutputStream fos = new FileOutputStream("C:\\Users\\Documents\\NetBeansProjects\\BankFile4.txt");
        ObjectOutputStream os = new ObjectOutputStream(fos);
        os.writeObject(information);
        os.flush();
        fos.close();
        os.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public List<PersonInfo> readFile() {
    List<PersonInfo> dataFromFile=null;
    try {

        FileInputStream fis = new FileInputStream("C:\\Users\\Documents\\NetBeansProjects\\BankFile4.txt");
        ObjectInputStream is = new ObjectInputStream(fis);
        dataFromFile=(List<PersonInfo>)is.readObject();
        fis.close();
        is.close();
        //return readFile();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return dataFromFile;
    }

AboutPerson:

Scanner input = new Scanner(System.in);
            List<PersonInfo> info = new ArrayList<PersonInfo>();
            List<PersonInfo> info2 = new ArrayList<PersonInfo>();
            ReadWrite rw=new ReadWrite();
            rw.writeFile(info);
            info2=rw.readFile();
            while (true) {
                System.out.println("\n");
                System.out.println("1. Input personal info\n"
                        + "2. Print them out\n"

                        + "*************"
                        + "*************");
                option1 = input.nextInt();
                input.nextLine();
                switch (option1) {
                    case 1:
                        PersonInfo personInfo = new PersonInfo();
                        //take the input
                        System.out.println("Enter a name: ");
                        personInfo.setName(input.nextLine());

                        System.out.println("Give ID: ");
                        personInfo.setId(input.nextInt());
                        System.out.println("Input credit: ");
                        personInfo.setCredit(input.nextDouble());
                        //addint them up
                        info.add(personInfo);
                        break;
                    case 2:
                        //display them 
                        System.out.println("");
                        System.out.println("Name\t\tID\t\tCredit");
                        for (PersonInfo pInfo : info) {
                            System.out.println(pInfo);
                        }
                        System.out.println("\t\t.............\n"
                                + "\t\t.............");
                        break;

        }

            }

PersonInfo:

........
........
public PersonInfo() {
        this.name = null;
        this.id = 0;
        this.credit = 0;
    }

    public void setName(String name) {
        this.name = name;
    }
.........
.........

2 个答案:

答案 0 :(得分:1)

package com.collection;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


class PersonInfo implements Serializable{
    private String name;
    private int id;
    private double credit;
    public PersonInfo(){}
    public PersonInfo(String name,int id,int credit)
    {
        this.name=name;
        this.id=id;
        this.credit=credit;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public double getCredit() {
        return credit;
    }
    public void setCredit(double credit) {
        this.credit = credit;
    }

}
class ReadWrite
{
       public void writeFile(List<PersonInfo> information){

            try {
                FileOutputStream fos = new FileOutputStream("/home/mohammad.sadik/TestReadWrite.txt");
                ObjectOutputStream os = new ObjectOutputStream(fos);
                os.writeObject(information);
                os.flush();
                fos.close();
                os.close();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public List<PersonInfo> readFile() {
            List<PersonInfo> dataFromFile=null;
            try {

                FileInputStream fis = new FileInputStream("/home/mohammad.sadik/TestReadWrite.txt");
                ObjectInputStream is = new ObjectInputStream(fis);
                dataFromFile=(List<PersonInfo>)is.readObject();
                fis.close();
                is.close();
                //return readFile();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return dataFromFile;
            }
}
public class AboutPerson {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        List<PersonInfo> info = new ArrayList<PersonInfo>();
        List<PersonInfo> info2 = new ArrayList<PersonInfo>();
        ReadWrite rw=new ReadWrite();
        while (true) {
            System.out.println("\n");
            System.out.println("1. Input personal info\n"
                    + "2. Print them out\n"

                    + "*************"
                    + "*************");
           int option1 = input.nextInt();
            input.nextLine();
            switch (option1) {
                case 1:
                    PersonInfo personInfo = new PersonInfo();
                    //take the input
                    System.out.println("Enter a name: ");
                    personInfo.setName(input.nextLine());
                    System.out.println("Give ID: ");
                    personInfo.setId(input.nextInt());
                    System.out.println("Input credit: ");
                    personInfo.setCredit(input.nextDouble());
                    //addint them up
                    info.add(personInfo);
                    rw.writeFile(info);
                    break;
                case 2:
                    //display them 
                    info2=rw.readFile();
                    System.out.println("");
                    System.out.println("Name\t\tID\t\tCredit");
                    for (PersonInfo pinfo : info2) {
                        System.out.println(pinfo.getName()+"\t\t"+pinfo.getId()+"\t\t"+pinfo.getCredit());
                    }
                    System.out.println("\t\t.............\n"
                            + "\t\t.............");
                    break;

    }

        }
    }
}

请在PersonInf类中实现可序列化的接口。当你要将对象写入文件时,你需要实现可序列化的接口,否则你会得到如下异常: java.io.NotSerializableException:com.collection.PersonInfo

答案 1 :(得分:0)

  • 第一个PersonInfo应该实现SerialiZable,
  • 并且我不确定,但PersonInfo也应该有一个默认构造函数