Используется для чтения текстового файла ресурса в строку (Java) - PullRequest
187 голосов
/ 20 мая 2011

Существует ли какая-либо утилита, которая помогает читать текстовый файл ресурса в строку.Я полагаю, это популярное требование, но я не смог найти никакой утилиты после Google.

Ответы [ 20 ]

278 голосов
/ 20 мая 2011

Да, Гуава обеспечивает это в классе Resources. Например:

URL url = Resources.getResource("foo.txt");
String text = Resources.toString(url, Charsets.UTF_8);
152 голосов
/ 19 сентября 2013

Вы можете использовать старый трюк Stupid Scanner oneliner, чтобы сделать это без каких-либо дополнительных зависимостей, таких как guava:

String text = new Scanner(AppropriateClass.class.getResourceAsStream("foo.txt"), "UTF-8").useDelimiter("\\A").next();

Ребята, не используйте сторонние вещи, если вам действительно не нужнотот.В JDK уже много функциональности.

81 голосов
/ 17 октября 2014

Для Java 7:

new String(Files.readAllBytes(Paths.get(getClass().getResource("foo.txt").toURI())));
57 голосов
/ 12 октября 2011

Guava имеет метод "toString" для чтения файла в строку:

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

String content = Files.toString(new File("/home/x1/text.log"), Charsets.UTF_8);

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

42 голосов
/ 06 октября 2017

Чистое и простое решение Java 8

Этот простой метод, приведенный ниже, отлично подойдет, если вы используете Java 8:

/**
 * Reads given resource file as a string.
 *
 * @param fileName the path to the resource file
 * @return the file's contents or null if the file could not be opened
 */
public String getResourceFileAsString(String fileName) {
    InputStream is = getClass().getClassLoader().getResourceAsStream(fileName);
    if (is != null) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        return reader.lines().collect(Collectors.joining(System.lineSeparator()));
    }
    return null;
}

И он также работает с ресурсами в файлах jar.

Нет необходимости в больших, толстых библиотеках.Если вы уже не используете Guava или Apache Commons IO, добавление этих библиотек в ваш проект просто для возможности чтения файла в виде строки кажется слишком сложным.


Загрузка из статического контекста

Поскольку обычно это служебная функция, возможно, вы захотите, чтобы она была доступна из класса статических утилит.Я немного изменил реализацию, чтобы метод мог быть объявлен как статический.Это работает точно так же.Вот оно:

/**
 * Reads given resource file as a string.
 *
 * @param fileName the path to the resource file
 * @return the file's contents or null if the file could not be opened
 */
public static String getResourceFileAsString(String fileName) {
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    InputStream is = classLoader.getResourceAsStream(fileName);
    if (is != null) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        return reader.lines().collect(Collectors.joining(System.lineSeparator()));
    }
    return null;
}
38 голосов
/ 24 января 2014

yegor256 нашел хорошее решение с использованием Apache Commons IO :

import org.apache.commons.io.IOUtils;

String text = IOUtils.toString(this.getClass().getResourceAsStream("foo.xml"),
                               "UTF-8");
36 голосов
/ 20 мая 2011

apache-commons-io имеет служебное имя FileUtils:

URL url = Resources.getResource("myFile.txt");
File myFile = new File(url.toURI());

String content = FileUtils.readFileToString(myFile, "UTF-8");  // or any other encoding
16 голосов
/ 01 октября 2012

У меня часто была эта проблема сама.Чтобы избежать зависимостей от небольших проектов, я часто пишу небольшую служебную функцию, когда мне не нужны обычные и т. Д.Вот код для загрузки содержимого файла в строковый буфер:

StringBuffer sb = new StringBuffer();

BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("path/to/textfile.txt"), "UTF-8"));
for (int c = br.read(); c != -1; c = br.read()) sb.append((char)c);

System.out.println(sb.toString());   

В этом случае важно указать кодировку , поскольку вы могли редактировать свой файл в UTF-8, а затем поместите его в банку, и компьютер, открывающий файл, может иметь CP-1251 в качестве собственной кодировки файла (например);поэтому в этом случае вы никогда не узнаете целевую кодировку, поэтому информация о явной кодировке имеет решающее значение.Также цикл чтения файла char с помощью char кажется неэффективным, но он используется в BufferedReader, и поэтому на самом деле довольно быстрый.

12 голосов
/ 04 февраля 2015

Вы можете использовать следующую форму кода Java

new String(Files.readAllBytes(Paths.get(getClass().getResource("example.txt").toURI())));
4 голосов
/ 16 июня 2015

Если вы хотите получить свою строку из ресурса проекта, такого как файл testcase / foo.json в src / main / resources в вашем проекте, сделайте это:

String myString= 
 new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("testcase/foo.json").toURI())));

Обратите внимание, что метод getClassLoader () отсутствует в некоторых других примерах.

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