使用Java 7 NIO从classpath读取文件

dnc*_*253 13 java io classpath java-7

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

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)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

虽然这很有效,但我希望有一个更容易/更好的方法来使用Java 7中的NIO.我猜我需要在类路径上获得一个表示此路径的Path对象,但我是不知道该怎么做.

如果这是一件非常容易的事,我道歉.我只是想不出来.谢谢您的帮助.

shr*_*yas 27

这适合我.

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())));
}
Run Code Online (Sandbox Code Playgroud)


JB *_*zet 7

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

byte[] array = 
    ByteStreams.toByteArray(this.getClass().getClassLoader().getResourceAsStream(resourceName));
Run Code Online (Sandbox Code Playgroud)

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