使用 Java 7 NIO 从类路径读取文件

2022-09-03 04:02:46

为此,我已经用谷歌搜索了很长一段时间,但所有的结果都指向Java 7 NIO之前的解决方案。我使用NIO的东西从文件系统上的特定位置读取文件,它比以前容易得多()。现在,我想读取打包在我的 WAR 和类路径中的文件。我们目前使用类似于以下内容的代码来执行此操作:Files.readAllBytes(path)

Input inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName);
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();

/* iterate through the input stream to get all the bytes (no way to reliably find the size of the 
 *     file behind the inputStream (see http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()))
 */
int byteInt = -1;
try
{
    byteInt = inputStream.read();
    while (byteInt != -1)
    {
        byteStream.write(byteInt);
        byteInt = inputStream.read();
    }

    byteArray = byteStream.toByteArray();
    inputStream.close();
    return byteArray;
}
catch (IOException e)
{
    //...
}

虽然这很有效,但我希望有一种更简单/更好的方法来使用Java 7中的NIO内容来做到这一点。我想我需要得到一个在类路径上表示此路径的 Path 对象,但我不确定如何做到这一点。

我很抱歉,如果这是一些超级容易的事情。我只是想不通。感谢您的帮助。


答案 1

这对我有用。

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

// fileName: foo.txt which lives under src/main/resources
public String readFileFromClasspath(final String fileName) throws IOException, URISyntaxException {
    return new String(Files.readAllBytes(
                Paths.get(getClass().getClassLoader()
                        .getResource(fileName)
                        .toURI())));
}

答案 2

路径表示文件系统上的文件。从类路径中读取资源没有帮助。您需要的是一个帮助器方法,该方法从流中读取所有内容(比您正在执行的操作更有效),并将其写入字节数组。Apache commons-io或Guava可以帮助您。例如番石榴:

byte[] array = 
    ByteStreams.toByteArray(this.getClass().getClassLoader().getResourceAsStream(resourceName));

如果您不想为此将Guava或commons-io添加到您的依赖项中,您可以随时读取它们的源代码并将其复制到您自己的帮助程序方法中。


推荐