Java从文件读取以初始化数据转换对象

时间:2019-06-12 16:02:51

标签: java file object bufferedreader

我有这个文件:“ Test.txt”-> 1,cont,details,950.5,asd

我的班级是自动,构造函数是int, string, string, double, string

如何读取此文件,然后使用正确的数据转换初始化我的对象?

我想我也需要使用逗号分隔符。

    FileReader inFile2=null;
    BufferedReader outBuffer2=null;
    inFile2=new FileReader("Test.txt");
    outBuffer2 = new BufferedReader(inFile2);
    List<String> lines = new ArrayList<String>();
    String line="";

    while((line = outBuffer2.readLine()) != null) {
        lines.add(line);
        System.out.println(lines);
    }
    outBuffer2.close();
    inFile2.close();

    // 

    String[] splitTranzactie = lines.toArray(new String[]{});
    Auto t = new Auto(Int32(splitTranzactie[0]), splitTranzactie[1], splitTranzactie[2],
        ToDouble(splitTranzactie[3]), splitTranzactie[4]);

5 个答案:

答案 0 :(得分:0)

对于int,您可以使用

int a = Integer.parseInt(string);

双打几乎相同

double b = Double.parseDouble(string);

但是请注意,如果字符串不是它的本意,则两者都可能引发NumberFormatException。

答案 1 :(得分:0)

您可以从各行创建流,然后可以应用

Function(ArrayList ,ArrayList

接口通过lambda函数定义自定义行为来获取数据。要将数据从String转换为整数,请使用Integer.parse(String);对于双精度数据,请使用Double.parse(string)

答案 2 :(得分:0)

使用Java 8流:

 try (Stream<String> fileStream = Files.lines(Paths.get("Test.txt"))) {
        fileStream.map(line -> line.split(",")).forEach(array -> {
            Auto auto = new Auto(Integer.parseInt(array[0]), array[1], array[2], Double.parseDouble(array[3]), array[4]);
        });
    }

您可以通过以下方式收集自动列表:

    List<Auto> autoList;
    try (Stream<String> fileStream = Files.lines(Paths.get("Test.txt"))) {
        autoList = fileStream.map(line -> {
            String[] array = line.split(",");
            return new Auto(Integer.parseInt(array[0]), array[1], array[2], Double.parseDouble(array[3]), array[4]);
        }).collect(Collectors.toList());
    }

答案 3 :(得分:0)

这里有一些问题。首先:

 String[] splitTranzactie = lines.toArray(new String[]{});

只是将您的行列表变成行数组。要将每一行拆分成各个组成部分,可以使用String.split(“,”)之类的东西。这将返回一个字符串数组。请注意,如果您期望最后一个值中的任何一个为空,即以一个或多个逗号结尾,则返回的数组将与找到的最后一个值位置一样长。也就是说,如果您将行拆分为1,cont,details,,,则返回的数组长度为3而不是5。您应该对此进行防御性编码。

要将字符串转换为int或double类型,可以分别使用Integer.parseInt()Double.parseInt()。同样,如果值不是数字值,则可能需要考虑进行防御性编码,因为如果这两种方法无法解析输入,则会抛出异常。

您还应该将close()方法放在finally块中以确保它们被调用,但是由于它们AutoCloseable可以通过使用try-with-resources语法来完全避免这种情况,该语法将关闭阅读器。

    try(Reader in = new Reader()) {
    }

在您的示例之后执行上述所有操作(但没有任何防御性代码)的示例可能类似于以下内容:

        List<Auto> autos = new ArrayList<>();
        try (BufferedReader in = new BufferedReader(new FileReader("Test.txt"))) {
            String line = null;
            while((line = in.readLine()) != null) {
                String[] values = line.split(",");
                autos.add(new Auto(
                        Integer.parseInt(values[0]),
                        values[1],
                        values[2],
                        Double.parseDouble(values[3]),
                        values[4]));
            }
        }

答案 4 :(得分:0)

按照您当前的方案,在这里我可以执行任务的一种方式。该代码还将验证数据并在验证失败时放置默认值。

public List<Auto> getAutoListFromFile(String filePath) {
    List<Auto> list = new ArrayList<>(); // Declare a List Interface
    Auto auto;  // Declare Auto
    // Open a file reader. Try With Resourses is used here so as to auto close reader.
    try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
        String line = "";
        // Iterate through the file lines
        while((line = reader.readLine()) != null) {
            line = line.trim(); // Trim lines of any unwanted leading or trailing whitespaces, tabs, etc.
            // Skip blank lines.
            if (line.equals("")) {
                continue;
            }
            System.out.println(line); // Display file line to console (remove if desired).
            /* Split the current comma delimited file line into specific components.
               A regex is used here to cover all comma/space scenarios (if any). */
            String[] lineParts = line.split("\\s{0,},\\s{0,}");
            // Establish the first Auto memeber value for the Auto class constructor. 
            int id = -1;  // default
            // Make sure it is an unsigned Integer value. RegEx is used here again.
            if (lineParts[0].matches("\\d+")) {
                id = Integer.parseInt(lineParts[0]);
            }
            // Establish the second Auto memeber value for the Auto class constructor.
            String cont = !lineParts[1].equals("") ? lineParts[1] : "N/A";  //Ternary Used
            // Establish the third Auto memeber value for the Auto class constructor.
            String details = !lineParts[2].equals("") ? lineParts[2] : "N/A";  //Ternary Used
            // Establish the fourth Auto memeber value for the Auto class constructor.
            double price = 0.0d;  //default
            // Make sure it is a signed or unsigned Integer or double value. RegEx is used here again.
            if (lineParts[3].matches("-?\\d+(\\.\\d+)?")) {
                price = Double.parseDouble(lineParts[3]);
            }
            // Establish the fifth Auto memeber value for the Auto class constructor.
            String asd = !lineParts[4].equals("") ? lineParts[4] : "N/A"; //Ternary Used
            auto = new Auto(id, cont, details, price, asd); // Create an instance of Auto
            list.add(auto); // Add Auto instance to List.
            // Go and read next line if one exists
        }   
    }
    // Handle Exceptions.
    catch (FileNotFoundException ex) {
        Logger.getLogger("getAutoListFromFile() Method Error!").log(Level.SEVERE, null, ex);
    }
    catch (IOException ex) {
        Logger.getLogger("getAutoListFromFile() Method Error!").log(Level.SEVERE, null, ex);
    }
    return list;  // Return the filled list.
}

要使用此方法,您可以执行以下操作:

List<Auto> list = getAutoListFromFile("Test.txt");