16

私はこれについてかなり長い間グーグルで検索してきましたが、すべての結果は 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)
{
    //...
}

これは機能しますが、Java 7 の NIO でこれを行うためのより簡単でより良い方法があることを望んでいました。クラスパスでこのパスを表すPathオブジェクトを取得する必要があると思いますが、それを行う方法がわからない。

これが非常に簡単なことである場合は申し訳ありません。私はそれを理解することはできません。助けてくれてありがとう。

4

4 に答える 4

30

これは私にとってはうまくいきます。

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())));
}
于 2015-03-04T16:51:57.047 に答える
8

Path は、ファイル システム上のファイルを表します。クラスパスからリソースを読み取ることは役に立ちません。あなたが探しているのは、ストリームからすべてを読み取り (現在の方法よりも効率的に)、それをバイト配列に書き込むヘルパー メソッドです。Apache commons-io または Guava がそれを支援します。たとえばグアバの場合:

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

そのためだけに依存関係に Guava や commons-io を追加したくない場合は、いつでもそれらのソース コードを読み込んで、独自のヘルパー メソッドに複製することができます。

于 2013-02-04T18:24:52.740 に答える
2

私が理解している限り、あなたが望むのはReadableByteChannelあなたのリソースに a を開くことです。そうすれば、NIOを使ってそれを読むことができます。

これは良いスタートになるはずです。

// Opens a resource from the current class' defining class loader
InputStream istream = getClass().getResourceAsStream("/filename.txt");

// Create a NIO ReadableByteChannel from the stream
ReadableByteChannel channel = java.nio.channels.Channels.newChannel(istream);
于 2013-02-04T18:24:43.163 に答える
1

あなたはを見る必要がありますClassLoader.getResource()。これは、リソースを表すURLを返します。ファイルシステムに対してローカルの場合は、file://URLになります。その時点で、スキームなどを取り除くことができます。そうすれば、好きなことを実行できるファイル名が得られます。

ただし、file://パスでない場合は、通常のInputStreamにフォールバックできます。

于 2013-02-04T18:22:15.350 に答える