Java: Как считать текстовый файл

Я хочу читать, текстовый файл, содержащий пространство, разделил значения. Значения являются целыми числами. Как я могу считать его и поместить его в список массива?

Вот пример содержания текстового файла:

1 62 4 55 5 6 77

Я хочу иметь его в arraylist как [1, 62, 4, 55, 5, 6, 77]. Как я могу сделать это в Java?

81
задан Erfan 13 January 2016 в 08:05
поделиться

4 ответа

Вы можете использовать Files # readAllLines () , чтобы поместить все строки текстового файла в Список .

for (String line : Files.readAllLines(Paths.get("/path/to/file.txt"))) {
    // ...
}

Учебное пособие: Базовый ввод-вывод> Файловый ввод-вывод> Чтение, запись и создание текстовых файлов


Вы можете использовать String # split () , чтобы разделить String частями на основе регулярного выражения.

for (String part : line.split("\\s+")) {
    // ...
}

Учебное пособие: Числа и строки> Строки> Управление символами в строке


Вы можете использовать Integer # valueOf () , чтобы преобразовать String в ] Целое число .

Integer i = Integer.valueOf(part);

Учебное пособие: Числа и строки> Строки> Преобразование между числами и строками


Вы можете использовать Список # add () , чтобы добавить элемент в список .

numbers.add(i);

Учебное пособие: Интерфейсы> Интерфейс списка


Итак, в двух словах (при условии, что файл не имеет пустых строк или конечных / ведущих пробелов).

List<Integer> numbers = new ArrayList<>();
for (String line : Files.readAllLines(Paths.get("/path/to/file.txt"))) {
    for (String part : line.split("\\s+")) {
        Integer i = Integer.valueOf(part);
        numbers.add(i);
    }
}

Если вы уже используете Java 8, вы можете даже использовать для этого Stream API , начиная с Files # lines () .

List<Integer> numbers = Files.lines(Paths.get("/path/to/test.txt"))
    .map(line -> line.split("\\s+")).flatMap(Arrays::stream)
    .map(Integer::valueOf)
    .collect(Collectors.toList());

Учебное пособие: Обработка данных с помощью потоков Java 8

170
ответ дан 24 November 2019 в 09:26
поделиться

В Java 1.5 появился класс Scanner для обработки ввода из файла и потоков.

Он используется для получения целых чисел из файла и будет выглядеть примерно так:

List<Integer> integers = new ArrayList<Integer>();
Scanner fileScanner = new Scanner(new File("c:\\file.txt"));
while (fileScanner.hasNextInt()){
   integers.add(fileScanner.nextInt());
}

Однако проверьте API. Есть еще много вариантов работы с разными типами источников ввода, разными разделителями и разными типами данных.

34
ответ дан 24 November 2019 в 09:26
поделиться

Посмотрите на этот пример и попробуйте сделать свой собственный:

import java.io.*;

public class ReadFile {

    public static void main(String[] args){
        String string = "";
        String file = "textFile.txt";

        // Reading
        try{
            InputStream ips = new FileInputStream(file);
            InputStreamReader ipsr = new InputStreamReader(ips);
            BufferedReader br = new BufferedReader(ipsr);
            String line;
            while ((line = br.readLine()) != null){
                System.out.println(line);
                string += line + "\n";
            }
            br.close();
        }
        catch (Exception e){
            System.out.println(e.toString());
        }

        // Writing
        try {
            FileWriter fw = new FileWriter (file);
            BufferedWriter bw = new BufferedWriter (fw);
            PrintWriter fileOut = new PrintWriter (bw);
                fileOut.println (string+"\n test of read and write !!");
            fileOut.close();
            System.out.println("the file " + file + " is created!");
        }
        catch (Exception e){
            System.out.println(e.toString());
        }
    }
}
10
ответ дан 24 November 2019 в 09:26
поделиться

Ради удовольствия, вот что я, вероятно, сделал бы в реальном проекте, где я уже использую все свои любимые библиотеки (в данном случае Guava , ранее известная как Google Collections ).

String text = Files.toString(new File("textfile.txt"), Charsets.UTF_8);
List<Integer> list = Lists.newArrayList();
for (String s : text.split("\\s")) {
    list.add(Integer.valueOf(s));
}

Преимущество: не так много собственного кода, который нужно поддерживать (в отличие, например, от this ). Edit : Хотя стоит отметить, что в этом случае решение сканера tschaible больше не имеет кода!

Недостаток: очевидно, что вы можете не захотеть добавлять новые зависимости библиотеки только для этого. (Опять же, было бы глупо не использовать Guava в своих проектах.; -)

5
ответ дан 24 November 2019 в 09:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: