Utils для чтения текстового файла ресурсов в String (Java)

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

Ответ 1

Да, Guava предоставляет это в классе Resources. Например:

URL url = Resources.getResource("foo.txt");
String text = Resources.toString(url, Charsets.UTF_8);

Ответ 2

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

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

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

Ответ 3

Для java 7:

new String(Files.readAllBytes(Paths.get(getClass().getResource("foo.txt").toURI())));

Ответ 4

В 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 в предыдущем ответе).

Ответ 5

Чистое и простое, удобное для jar решение на Java 8+

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

/**
 * Reads given resource file as a string.
 *
 * @param fileName path to the resource file
 * @return the file contents
 * @throws IOException if read fails for any reason
 */
static String getResourceFileAsString(String fileName) throws IOException {
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    try (InputStream is = classLoader.getResourceAsStream(fileName)) {
        if (is == null) return null;
        try (InputStreamReader isr = new InputStreamReader(is);
             BufferedReader reader = new BufferedReader(isr)) {
            return reader.lines().collect(Collectors.joining(System.lineSeparator()));
        }
    }
}

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


Избегайте ненужных зависимостей

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

"Простой" метод? Ты, должно быть, шутишь

Я понимаю, что чистая Java не очень хорошо справляется с такими простыми задачами, как эта. Например, вот как мы читаем из файла в Node.js:

const fs = require("fs");
const contents = fs.readFileSync("some-file.txt", "utf-8");

Просто и легко читать (хотя людям все равно нравится полагаться на многие зависимости, в основном из-за невежества). Или в Python:

with open('some-file.txt', 'r') as f:
    content = f.read()

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

Ответ 7

У 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

Ответ 8

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

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, и так на самом деле довольно быстро.

Ответ 9

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

new String(Files.readAllBytes(Paths.get(getClass().getResource("example.txt").toURI())));

Ответ 10

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

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

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

Ответ 11

Используйте Apache commons FileUtils. У него есть метод readFileToString

Ответ 12

Я использую следующее для чтения файлов ресурсов из classpath:

import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.Scanner;

public class ResourceUtilities
{
    public static String resourceToString(String filePath) throws IOException, URISyntaxException
    {
        try (InputStream inputStream = ResourceUtilities.class.getClassLoader().getResourceAsStream(filePath))
        {
            return inputStreamToString(inputStream);
        }
    }

    private static String inputStreamToString(InputStream inputStream)
    {
        try (Scanner scanner = new Scanner(inputStream).useDelimiter("\\A"))
        {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }
}

Никаких зависимостей третьих сторон не требуется.

Ответ 13

Вот мой подход работал нормально

public String getFileContent(String fileName) {
    String filePath = "myFolder/" + fileName+ ".json";
    try(InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath)) {
        return IOUtils.toString(stream, "UTF-8");
    } catch (IOException e) {
        // Please print your Exception
    }
}

Ответ 14

package test;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try {
            String fileContent = getFileFromResources("resourcesFile.txt");
            System.out.println(fileContent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //USE THIS FUNCTION TO READ CONTENT OF A FILE, IT MUST EXIST IN "RESOURCES" FOLDER
    public static String getFileFromResources(String fileName) throws Exception {
        ClassLoader classLoader = Main.class.getClassLoader();
        InputStream stream = classLoader.getResourceAsStream(fileName);
        String text = null;
        try (Scanner scanner = new Scanner(stream, StandardCharsets.UTF_8.name())) {
            text = scanner.useDelimiter("\\A").next();
        }
        return text;
    }
}

Ответ 15

По крайней мере, с Apache commons-io 2.5, метод IOUtils.toString() поддерживает аргумент URI и возвращает содержимое файлов, расположенных внутри jars в пути к классам:

IOUtils.toString(SomeClass.class.getResource(...).toURI(), ...)

Ответ 16

Guava также имеет Files.readLines(), если вы хотите, чтобы возвращаемое значение как List<String> по очереди:

List<String> lines = Files.readLines(new File("/file/path/input.txt"), Charsets.UTF_8);

Пожалуйста, обратитесь к здесь, чтобы сравнить 3 пути (BufferedReader против Guava Files и Guava Resources)), чтобы получить String из текстового файла.

Ответ 17

С набором статических импортных решений решение Guava может быть очень компактным однострочным:

toString(getResource("foo.txt"), UTF_8);

Требуются следующие импорт:

import static com.google.common.io.Resources.getResource
import static com.google.common.io.Resources.toString
import static java.nio.charset.StandardCharsets.UTF_8

Ответ 18

Я написал методы readResource() здесь, чтобы иметь возможность сделать это одним простым вызовом. Это зависит от библиотеки Guava, но мне нравятся методы JDK-only, предложенные в других ответах, и я думаю, что я изменю их таким образом.

Ответ 19

Если вы включите Guava, то вы можете использовать:

String fileContent = Files.asCharSource(new File(filename), Charset.forName("UTF-8")).read();

(в других решениях упоминается другой метод для гуавы, но они устарели)

Ответ 20

public static byte[] readResoureStream(String resourcePath) throws IOException {
    ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
    InputStream in = CreateBffFile.class.getResourceAsStream(resourcePath);

    //Create buffer
    byte[] buffer = new byte[4096];
    for (;;) {
        int nread = in.read(buffer);
        if (nread <= 0) {
            break;
        }
        byteArray.write(buffer, 0, nread);
    }
    return byteArray.toByteArray();
}

Charset charset = StandardCharsets.UTF_8;
String content = new   String(FileReader.readResoureStream("/resource/...*.txt"), charset);
String lines[] = content.split("\\n");