Самый простой способ прочитать файл в String?

Я пытаюсь прочитать простой текстовый файл в String. Конечно, есть обычный способ получения входного потока и итерации с readLine() и чтения содержимого в String.

Проделав это сотни раз в прошлом, мне просто интересно, как я могу это сделать в минимальных строках кода? Разве что-то не в java, как String fileContents = XXX.readFile(myFile/*File*/).. скорее все, что выглядит так просто, как это?

Я знаю, что есть такие библиотеки, как Apache Commons IO, которые предоставляют такие упрощения, или даже я могу написать простой класс Util для этого. Но все, что мне интересно, - это настолько частая операция, что каждый нуждается в том, почему Java не обеспечивает такую ​​простую функцию? Разве нет ни одного метода где-то читать файл в строку с определенной по умолчанию или указанной кодировкой?

Ответ 1

Да, вы можете сделать это в одной строке (хотя для надежной обработки IOException вы не захотите).

String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);

Здесь используется java.util.Scanner, сообщая ему разграничить ввод с помощью \Z, который является концом привязки строки. Это в конечном счете делает входным, чтобы иметь один фактический токен, который является полным файлом, поэтому его можно читать одним вызовом next().

Существует конструктор, который принимает File и String charSetName (среди многих других перегрузок). Эти два конструктора могут бросать FileNotFoundException, но, как и все методы Scanner, no IOException может быть выведен за пределы этих конструкторов.

Вы можете запросить сам Scanner с помощью метода ioException(), если произошел или IOException. Вы также можете явно указать close() Scanner после чтения содержимого, поэтому, возможно, сохраните ссылку Scanner в локальной переменной лучше.

См. также

Связанные вопросы


Опции сторонних библиотек

Для полноты, это некоторые действительно хорошие варианты, если у вас есть эти очень уважаемые и очень полезные сторонние библиотеки:

Guava

com.google.common.io.Files содержит много полезных методов. Вот некоторые из них:

Apache Commons/IO

org.apache.commons.io.IOUtils также предлагают аналогичную функциональность:

  • String toString(InputStream, String encoding)
    • Используя указанную кодировку символов, содержимое InputStream получает как String
  • List readLines(InputStream, String encoding)
    • ... как (raw) List из String, по одной записи в строке

Связанные вопросы

Ответ 2

Из Java 7 (описание API) и далее вы можете:

new String(Files.readAllBytes(Paths.get(filePath)));

Где filePath - это строка, представляющая файл, который вы хотите загрузить.

Ответ 3

Вы можете использовать apache commons IO..

FileInputStream fisTargetFile = new FileInputStream(new File("test.txt"));

String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8");

Ответ 4

Это должно сработать для вас:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public static void main(String[] args) throws IOException {
    String content = new String(Files.readAllBytes(Paths.get("abc.java")));
}

Ответ 5

Использование Apache Commons IO.

import org.apache.commons.io.FileUtils;

//...

String contents = FileUtils.readFileToString(new File("/path/to/the/file"), "UTF-8")

Подробнее о javadoc для метода.

Ответ 6

Не записывайте свой собственный класс util для этого - я бы рекомендовал использовать Guava, который полон всех видов благость. В этом случае вам понадобится класс Files (если вы действительно просто читаете файл) или CharStreams для более общего чтения. Он имеет методы для чтения данных в список строк (readLines) или полностью (toString).

Он также имеет похожие полезные методы для двоичных данных. А потом остальная библиотека...

Я согласен с тем, что это раздражает, что в стандартных библиотеках ничего подобного нет. Черт, просто быть в состоянии CharSet до FileReader сделать жизнь немного проще...

Ответ 7

Другой альтернативный подход:

Как создать строку Java из содержимого файла?

Другим вариантом является использование утилит, предоставляемых библиотеками с открытым исходным кодом
http://commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html

Почему Java не предоставляет такой общий API-интерфейс?
a), чтобы поддерживать общие API-интерфейсы таким образом, чтобы программирование выполнялось кодированием, буферизацией и т.д.

b) заставляют программистов выполнять некоторые работы и записывать/совместно использовать библиотеки с открытым исходным кодом: D; -)

Ответ 8

К сожалению, нет.

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

Ответ 9

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

String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);

Поэтому я предлагаю незначительную настройку, которая все еще не всегда работает, но по крайней мере бросает исключение в этих случаях:

final String CHARSET = "UTF-8";
final String DELIMITER = "Some text that is unlikely to occur in the file";
File file = new File("filename")
Scanner scanner = new Scanner(file,CHARSET).useDelimiter(DELIMITER);
String content = null;
if (scanner.hasNext())
    content = scanner.next();
if (scanner.hasNext())
    throw new IllegalStateException("DELIMITER occurs in file. Use a different delimiter");
if (file.length() != content.getBytes(CHARSET).length)
    throw new IllegalStateException("Inconsistent file lengths. Probably a charset related problem.");
System.out.println(content);

Ответ 10

ниже - это простой код для чтения содержимого файла в строку

   try {            
        String line;
        File file = new File("C:/LEO/abc.txt");
        FileReader fr = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fr);
        HashMap< String, Integer> objHashMap = new HashMap<>();

        while((line = bufferedReader.readLine()) != null) {

            String lineWords[] = line.split(" ");
            for(String singleWord:lineWords) {

                System.out.println(singleWord);             
            }
        }

        for(String keyObject:objHashMap.keySet()) {

            System.out.println(keyObject + ": " + objHashMap.get(keyObject));
        }
    } catch(Exception exception) {

        System.out.println("IOException occured");
        exception.printStackTrace();
    }