【问题标题】:I/O Reading in object data from a fileI/O 从文件中读取对象数据
【发布时间】:2014-01-13 12:11:22
【问题描述】:

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

在我的主要(一个名为 VehicleDriverClass 的单独类)中,我试图使用 I/O 将车辆数据写入文件并从文件中读取车辆数据。我可以很好地写入文件。我正在使用记事本和一个 .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;
}

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

// 代码替换如下。

使用此实现,当 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) { 字符串数据从文件; 字符串[] 标记 = 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 或类似的。

【问题讨论】:

    标签: java object io bufferedreader filereader


    【解决方案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;
        }
    }
    

    【讨论】:

    • 很遗憾,我不能使用 XML 或 JSON 来完成这项任务。更改分隔符是我考虑过的,但也不确定如何更改,所以谢谢。这工作得更好。现在只需要创建对象,谢谢。
    • 我很高兴它有帮助。我建议编写一个方法来解析单行并返回 Vehicle 和另一个来读取文件并返回 List.
    【解决方案2】:

    readLine() 在读取与\nJava 语法 匹配的字符时终止该行。在大多数文本编辑器中,这是一个换行符。要在 Java 字符串中表示换行符,请在源代码中使用 \n,但在手动创建文件时,请使用:

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

    【讨论】:

    • 谢谢,我确实尝试过,但是当输出到控制台时,一些值会彼此相邻。意识到这是因为记事本以某种方式隐藏了空格(即,当两个单词相邻时,我可以在连接处按退格键,直到我再次按下它才会改变)。
    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2020-06-26
    • 2018-04-27
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多