Utils将资源文本文件读取为String(Java)

时间:2011-05-20 06:23:29

标签: java string text resources

是否有任何实用程序可以帮助将资源中的文本文件读入String。我想这是一个很受欢迎的要求,但是在Googling之后我找不到任何实用程序。

25 个答案:

答案 0 :(得分:274)

是的,GuavaResources课程中提供此功能。例如:

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

答案 1 :(得分:151)

您可以使用旧的Stupid Scanner trick oneliner来执行此操作,而不需要任何其他依赖项,例如guava:

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

伙计们,除非你真的需要,否则不要使用第三方的东西。 JDK中已经有很多功能。

答案 2 :(得分:79)

对于java 7:

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

答案 3 :(得分:57)

Guava有一个“toString”方法,用于将文件读入String:

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上一个答案中所述)。

答案 4 :(得分:39)

纯粹而简单的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,否则将这些库添加到项目中只是为了能够将文件作为字符串读取似乎有点太多了。

从静态上下文加载

由于这通常是一个实用程序函数,因此可能希望可以从静态实用程序类访问它。我稍微更改了实现,因此可以将方法声明为static。它的工作原理是一样的。这是:

/**
 * 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;
}

答案 5 :(得分:38)

yegor256找到nice solution using Apache Commons IO

import org.apache.commons.io.IOUtils;

String text = IOUtils.toString(this.getClass().getResourceAsStream("foo.xml"),
                               "UTF-8");

答案 6 :(得分:36)

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

答案 7 :(得分:16)

我自己经常遇到这个问题。为了避免依赖小项目,我经常这样做 当我不需要公共等等时,写一个小的实用函数。这是 用于在字符串缓冲区中加载文件内容的代码:

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编辑你的文件,然后把它放在一个jar和打开的计算机中 该文件可能具有CP-1251作为其本机文件编码(例如);所以 这种情况你永远不知道目标编码,因此显式 编码信息至关重要。 另外,通过char读取文件char的循环似乎效率低下,但它用于a BufferedReader,实际上非常快。

答案 8 :(得分:11)

您可以使用以下代码形式Java

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

答案 9 :(得分:4)

如果要从项目资源(如文件)中获取String 在项目的src / main / resources中的testcase / foo.json,执行以下操作:

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

请注意,其他一些示例中缺少getClassLoader()方法。

答案 10 :(得分:3)

我喜欢akosicki的“愚蠢扫描程序技巧”答案。这是我看到的最简单的,没有外部依赖性的,可以在Java 8中使用的方法(实际上一直到Java 5)。 如果您可以使用Java 9或更高版本,这是一个更简单的答案(因为Java 9中添加了InputStream.readAllBytes()

String text = new String(AppropriateClass.class.getResourceAsStream("foo.txt").readAllBytes());

答案 11 :(得分:2)

使用Apache commons的FileUtils。它有一个方法readFileToString

答案 12 :(得分:2)

我使用以下内容从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 :(得分:1)

这是我的方法很好

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 :(得分:1)

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 :(得分:0)

通过一组静态导入,Guava解决方案可以非常紧凑的单行:

<stdlib.h>

需要以下导入:

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

答案 16 :(得分:0)

我写了readResource() methods here,以便能够在一次简单的调用中完成。它取决于Guava库,但我喜欢在其他答案中建议的仅使用JDK的方法,我想我会改变这些方式。

答案 17 :(得分:0)

至少从Apache commons-io 2.5开始,IOUtils.toString()方法支持URI参数,并返回位于类路径上jar内的文件的内容:

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

答案 18 :(得分:0)

如果包含番石榴,则可以使用:

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

(其他解决方案提到了番石榴的其他方法,但已弃用)

答案 19 :(得分:0)

以下鳕鱼对我有用:

compile group: 'commons-io', name: 'commons-io', version: '2.6'

@Value("classpath:mockResponse.json")
private Resource mockResponse;

String mockContent = FileUtils.readFileToString(mockResponse.getFile(), "UTF-8");

答案 20 :(得分:0)

这是使用Java 11的Files.readString的解决方案:

public class Utils {
    public static String readResource(String name) throws URISyntaxException, IOException {
        var uri = Utils.class.getResource("/" + name).toURI();
        var path = Paths.get(uri);
        return Files.readString(path);
    }
}

答案 21 :(得分:0)

我做了这样的无依赖静态方法:

response = self.client.patch(
    reverse('main:user_edit', kwargs={'pk': user.pk}),
    post_data
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
user.refresh_from_db()
self.assertEqual(user.first_name, '')

答案 22 :(得分:0)

我喜欢Apache commons utils用于此类内容,并在测试时广泛使用此确切的用例(从类路径读取文件),尤其是在单元/集成测试中从/src/test/resources读取JSON文件时。例如

public class FileUtils {

    public static String getResource(String classpathLocation) {
        try {
            String message = IOUtils.toString(FileUtils.class.getResourceAsStream(classpathLocation),
                    Charset.defaultCharset());
            return message;
        }
        catch (IOException e) {
            throw new RuntimeException("Could not read file [ " + classpathLocation + " ] from classpath", e);
        }
    }

}

出于测试目的,最好抓住IOException并抛出RuntimeException-您的测试类可能看起来像例如

    @Test
    public void shouldDoSomething () {
        String json = FileUtils.getResource("/json/input.json");

        // Use json as part of test ...
    }

答案 23 :(得分:0)

如果你希望返回值为Files.readLines(),那么Guava也有List<String>

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

请参考here比较3种方式(BufferedReader与番石榴Files与番石榴Resources)以从文本文件中获取String

答案 24 :(得分:-2)

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");