Чтение простого текстового файла на Java - PullRequest
878 голосов
/ 17 января 2011

Кажется, есть разные способы чтения и записи данных файлов в Java.

Я хочу прочитать данные ASCII из файла.Каковы возможные пути и их отличия?

Ответы [ 25 ]

9 голосов
/ 15 ноября 2016

Ниже приведен пример использования Java 8. Предполагая, что файл text.txt находится в корне каталога проекта Eclipse.

Files.lines(Paths.get("text.txt")).collect(Collectors.toList());
7 голосов
/ 26 декабря 2015

Использование BufferedReader:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

BufferedReader br;
try {
    br = new BufferedReader(new FileReader("/fileToRead.txt"));
    try {
        String x;
        while ( (x = br.readLine()) != null ) {
            // Printing out each line in the file
            System.out.println(x);
        }
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}
catch (FileNotFoundException e) {
    System.out.println(e);
    e.printStackTrace();
}
7 голосов
/ 19 июля 2016

Это в основном то же самое, что и ответ Иисуса Рамоса, за исключением File вместо FileReader плюс итерация для просмотра содержимого файла.

Scanner in = new Scanner(new File("filename.txt"));

while (in.hasNext()) { // Iterates each line in the file
    String line = in.nextLine();
    // Do something with line
}

in.close(); // Don't forget to close resource leaks

... бросков FileNotFoundException

6 голосов
/ 31 декабря 2014

Вероятно, не так быстро, как с буферизованным вводом / выводом, но довольно кратко:

    String content;
    try (Scanner scanner = new Scanner(textFile).useDelimiter("\\Z")) {
        content = scanner.next();
    }

Шаблон \Z сообщает Scanner, что разделителем является EOF.

3 голосов
/ 26 сентября 2018

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

Вот пример:

Path path = Paths.get("/myfolder/myfile.ext");
try (BufferedReader reader = Files.newBufferedReader(path)) {
    // Read from the stream
    String currentLine = null;
    while ((currentLine = reader.readLine()) != null)
        //do your code here
} catch (IOException e) {
    // Handle file I/O exception...
}

Вы можете заменить этот код

BufferedReader reader = Files.newBufferedReader(path);

на

BufferedReader br = new BufferedReader(new FileReader("/myfolder/myfile.ext"));

Я рекомендую эту статьюизучить основные направления использования Java NIO и IO.

3 голосов
/ 17 января 2011

Я пока не вижу упоминания в других ответах.Но если «Наилучший» означает скорость, то новый Java I / O (NIO) может обеспечить самое быстрое предварительное выполнение, но не всегда самое простое для изучения.

http://download.oracle.com/javase/tutorial/essential/io/file.html

3 голосов
/ 02 февраля 2015

Самый простой способ чтения данных из файла в Java - это использование класса File для чтения файла и класса Scanner для чтения содержимого файла.

public static void main(String args[])throws Exception
{
   File f = new File("input.txt");
   takeInputIn2DArray(f);
}

public static void takeInputIn2DArray(File f) throws Exception
{
    Scanner s = new Scanner(f);
    int a[][] = new int[20][20];
    for(int i=0; i<20; i++)
    {
        for(int j=0; j<20; j++)
        {
            a[i][j] = s.nextInt();
        }
    }
}

PS: не забудьте импортировать java.util. *;для работы сканера.

2 голосов
/ 04 февраля 2018

Вы можете использовать readAllLines и метод join для получения всего содержимого файла в одной строке:

String str = String.join("\n",Files.readAllLines(Paths.get("e:\\text.txt")));

Он использует кодировку UTF-8 по умолчанию, которая правильно читает данные ASCII.

Также вы можете использовать readAllBytes:

String str = new String(Files.readAllBytes(Paths.get("e:\\text.txt")), StandardCharsets.UTF_8);

Я думаю, что readAllBytes быстрее и точнее, потому что он не заменяет новую строку на \n, а новая строка может быть \r\n.В зависимости от ваших потребностей, какой из них подходит.

2 голосов
/ 16 мая 2017

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

со следующим кодом,

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class InputReader{

    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s="";
        while((s=br.readLine())!=null){
            System.out.println(s);
        }
    }
}

просто продолжайте и запустите с:

java InputReader < input.txt

Это прочитает содержимое input.txt и выведет его на вашу консоль.

Вы также можете сделать свой System.out.println() для записи в определенный файл через командную строку следующим образом:

java InputReader < input.txt > output.txt

Это будет читать из input.txt и писать в output.txt.

2 голосов
/ 12 октября 2016

Гуава предоставляет для этого одну строку:

import com.google.common.base.Charsets;
import com.google.common.io.Files;

String contents = Files.toString(filePath, Charsets.UTF_8);
...