Самый простой способ прочитать файл в 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
в локальной переменной лучше.
См. также
Связанные вопросы
Опции сторонних библиотек
Для полноты, это некоторые действительно хорошие варианты, если у вас есть эти очень уважаемые и очень полезные сторонние библиотеки:
com.google.common.io.Files
содержит много полезных методов. Вот некоторые из них:
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();
}