Java-чтение из файла для инициализации объекта с преобразованием данных - PullRequest
0 голосов
/ 12 июня 2019

У меня есть этот файл: "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 голосов
/ 12 июня 2019

Следуя вашей текущей схеме, вот один из способов, которым я мог бы выполнить задачу.Код также проверяет данные и устанавливает значения по умолчанию, если эти проверки не пройдены.

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");
0 голосов
/ 12 июня 2019

Здесь есть несколько вопросов. Прежде всего:

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

собирается просто превратить ваш список строк в массив строк. Чтобы разбить каждую строку на составные части, вы можете использовать что-то вроде String.split (","). Это вернет массив строк. Обратите внимание, что если вы ожидаете, что какое-либо из последних значений будет пустым, т. Е. Оканчивается одной или несколькими запятыми, то возвращаемый массив будет таким же, как и последняя позиция значения, которую он найдет. то есть, если строка 1,cont,details,,, которую вы разделите, вернет массив длины 3, а не 5. Вы должны защищаться от этого.

Чтобы преобразовать String в 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]));
            }
        }
0 голосов
/ 12 июня 2019

вы можете создать поток из строк, затем вы можете применить интерфейс

Function (ArrayList , ArrayList )

для получения данных путем определения пользовательского поведения с помощью лямбда-функции.Чтобы преобразовать данные в целое число из String, используйте Integer.parse (String), а для двойных данных - Double.parse (string)
0 голосов
/ 12 июня 2019

Использование потока 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());
    }
0 голосов
/ 12 июня 2019

Для int вы можете использовать

int a = Integer.parseInt(string);

Почти то же самое для двойного

double b = Double.parseDouble(string);

Но имейте в виду, что оба могут генерировать NumberFormatException, если строка не соответствуетбудет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...