I / O从文件中读取对象数据

时间:2014-01-13 12:11:22

标签: java object io bufferedreader filereader

我有一个Vehicle类,其中包含有关Vehicle对象的所有信息,包括get和set方法。还有一个Showroom类,它维护所有Vehicle对象的列表,以及添加/删除和滚动列表的方法。

在我的main(一个名为VehicleDriverClass的单​​独类)中,我试图使用I / O将Vehicle数据写入文件并从文件中读取Vehicle数据。我可以写一个文件。我正在使用记事本和.txt文件来读取。我遇到的问题是如何在从文件中读取时终止行的结尾。这是Vehicle类的构造函数,所以你知道参数。

public Vehicle(String man, String mod, String VIN, String dateOfMan, char taxBand, int     costOfVehicle)
{
    this.manufacturer = man;
    this.model = mod;
    this.VIN = VIN;
    this.dateOfManufacture = dateOfMan;
    this.taxBand = taxBand;
    this.costOfVehicle = costOfVehicle;
}

这就是我目前对Input方法的看法(不试图创建对象,只是从文件中读取)。传递给它的陈列室将在以后使用,当我创建车辆对象并将其添加到陈列室时。

//代码替换如下。

使用此实现,当dataFromFile输出到控制台时,它全部在一行上,而不是在新行上。当读入'\ n'时,readline()不会终止该行吗?

以下是我的数据存储在输入文件中的方式。

Fordtest\n Focus\n frank\n ioCheck\n 09/01/1989\n 23/11/2013\n true\n d\n 1995\n

所以现在,我如何让终止线?这样我就可以从中实现对象的创建。

编辑:I / O现在正在运行。我现在遇到的问题是我的Vehicle对象的构造函数需要最后两个变量的数据类型char和int。使用当前方法,它们处于字符串数组中。

我已从上面删除了代码,并在下面添加了新的实现.public static void

addNewVehicleFromFile(Showroom s)     {         String dataFromFile;         String [] tokens = null;

    try
    {
        File fileReader = new File("AddNewVehicleFromFile.txt");
        FileReader fr = new FileReader(fileReader);
        BufferedReader br = new BufferedReader(fr);

        while ((dataFromFile = br.readLine()) != null)
        {
            tokens = dataFromFile.split("~");
        }

        System.out.println(Arrays.toString(tokens));

        Vehicle inputVehicle = new Vehicle(tokens[0], tokens[1], tokens[2], tokens[3],
                tokens[4], tokens[5]); 
        /*
        Erorr above here with these two. token[4] should be a char and [5] an int
        */

        s.addVehicle(inputVehicle);

        System.out.println("addNewVehicleFromFile Complete");

    }
    catch (FileNotFoundException fnfe)
    {
        System.out.println("File not found exception: " + fnfe.toString());
    }
    catch (IOException ioe)
    {
        System.out.println("I/O exception: " + ioe.toString());
    }

}

我应该编写自己的toChar和toInt方法来调用这两个变量吗?或解析为int或类似。

2 个答案:

答案 0 :(得分:1)

如果您更改输入数据格式,我认为您会做得更好。这就是XML和JSON诞生的原因。如果必须坚持当前的安排,请将数据元素之间的分隔符更改为代字号'〜'而不是\ n。

所以你的输入如下:

Fordtest~Focus~frank~ioCheck~09/01/1989~23/11/2013~true~d~1995

现在很容易解析:

String [] tokens = data.split("~");

为自己写一些工厂方法来创建车辆:

public class VehicleFactory {
    private static final VehicleFactory INSTANCE= new VehicleFactory();

    private VehicleFactory() {}

    public static VehicleFactory getInstance() { return INSTANCE; }

    public static Vehicle createVehicle(String data) {
        Vehicle value = null;
        String [] tokens = data.split("~");
        if ((tokens != null) && (tokens.length > X)) {
            // Map String to int or Date here
            value = new Vehicle(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5]);
        }
        return value;
    }

    public static List<Vehicle> createVehicles(File f) {
        List<Vehicle> values = new ArrayList<Vehicle>();
        // implementation left for you
        return values;
    }
}

答案 1 :(得分:0)

当读取与readLine() Java语法匹配的字符时,

\n终止该行。在大多数文本编辑器中,这是换行符。要在Java字符串中表示换行符,请在源代码中使用\n,但在手动创建文件时,请使用:

Fordtest
Focus
frank
ioCheck
09/01/1989
23/11/2013
true
d1995