Java - чтение свободно структурированных данных из файла - PullRequest
0 голосов
/ 05 декабря 2018

В настоящее время я пытаюсь узнать, как код Java ведет себя и обрабатывает входные и выходные файлы.Насколько я понимаю, как читать содержимое файла построчно и помещать их в массив, у меня возникают проблемы с пониманием того, как читать определенные значения из файла, которые встречаются при каждом n-числе строк, а затем помещать их в массив,Например, у меня есть входной тестовый файл, который выглядит следующим образом:

2
Australia
John
42
Blue
USA
Jeremmy
15
Black

Первая строка - это размер массива.Следующие строки представляют собой содержимое, которое я хочу прочитать из файла и поместить в указанный массив (в этом примере я сделал это: страна, имя, возраст, цвет глаз).Другими словами, я хочу прочитать некоторые свойства объектов, которые встречаются каждые четыре строки, поэтому я могу распечатать их позже, когда выберу, например, один из людей.Пока я застрял здесь и не знаю, как двигаться дальше, так как большинство людей не пытались работать с таким файлом.

   private static String[] readPeople(File file) {
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String sizeText = br.readLine();
        int size = Integer.parseInt(sizeText);
        String[] peopleSet= new String[size];

        for (int i = 1; i < size; i++) {
            if (i % 2 != 0) {
                String peopleInfo= br.readLine();
                peopleSet[i] = peopleInfo;
            }
        }
        return peopleSet;
    } catch (IOException ex) {
        System.err.println(ex);
        return new String[0];
    }
}

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Может быть проще сделать строки разделенными двоеточиями

Если у вас записи разделяются двоеточиями между значениями в файле:

Australia:John:42:Blue
USA:Jeremmy:15:Black

Тогда в вашем анализаторе файлов:

private static List<Person> readPeople(File file) {
    List<Person> people = new ArrayList<>();
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
      String line = "";
      while((line = br.readLine()) != null) {
        String[] args = line.split(":");
        String country = args[0];
        String name = args[1];
        int age = Integer.parseInt(args[2]);
        String eyeColor = args[3];

        Person p = new Person(name, country, age, eyeColor);
        people.add(p);
      }
    } catch (IOException ex) {
      System.err.println(ex);
    } 
    return people;
}

Наконец, определите класс Person

class Person {
   String name;
   String country;
   int age;
   String eyeColor;

   public Person(String name, String country, int age, String eyeColor) {
      this.name = name;
      this.country = country;
      this.age = age;
      this.eyeColor = eyeColor;
   }

   @Override
   public String toString() {
     return String.format("%s:%s:%d:%s", country, name, age, eyeColor);
   }
}

Добавьте ваши проверки ошибок и получателей / установщиков по мере необходимости

Это вернет список людей, как определено в вашем файле, и вы можетепроверьте размер списка, вызвав .size() для объекта списка возврата.

Обновление

Добавлено переопределение toString() для создания отдельных записей двоеточия, когда онодолжен быть записан в файл или консоль

Надеюсь, это поможет

0 голосов
/ 05 декабря 2018

Проблема в том, что ваш код читает из файла, только когда условие выполнено.Не имеет значения, сколько раз вы проходите цикл, содержимое файла продвигается только тогда, когда вы действительно читаете с br.readLine().

for (int i = 1; i < size; i++) {
    if (i % 2 != 0) {
        String peopleInfo= br.readLine();
        peopleSet[i] = peopleInfo;
    }
}

Также не ясно, какие строки выхочу почитать.Этот код будет зацикливаться size раз (2), но будет читать только строку через раз, поэтому он будет читать только «Австралия».

Если вы хотите прочитать имена людей («Джон» и «Джеремми»)"), которые являются третьими строками в каждой группе из четырех человек, вы можете сделать это:

for (int i = 1; i < size; i++) {
    for (int j = 0; j < 4; j++) {
        String line = br.readLine();
        if (j % 4 != 2) {
            people[i] = line;
        }
    }
}

Это читает все восемь строк (от" Австралия "до" Черный ").Для каждого человека значения j будут варьироваться от 0 до 3;третья строка, таким образом, - это когда j % 4 == 2.

. Он будет хранить имена в массиве people длиной 2. Я переименовал его в peopleSet, потому что это не Java Set.Оригинальное имя вводит в заблуждение.

0 голосов
/ 05 декабря 2018

Я предлагаю вам этот код.

    File Read_File = new File("file_path"); 

    BufferedReader br = null;

    try {
        br = new BufferedReader(new FileReader(Read_File));
        String line;
        int line_number = 0;

        int size = Integer.parseInt(br.readLine());



        for (int try_ = 0; try_ < size; try_++) {
            String read = br.readLine();
            for(int try_four = 0; try_four<4; try_four++) {
                //save input operation
            }
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null)
            try {
                br.close();
            } catch (IOException e) {
            }
    } 

, но использование списка - лучший способ.

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