6

メソッドは認識してgetResourceAsStream()いますが、ファイルを読み取るパーサーに問題があり、構造全体が a を期待するように実装されてFileInputStream()おり、getResourceAsStream()キャストできない入力ストリームが返されます。この状況の簡単な「修正」はありますか?

4

3 に答える 3

20

JAR ファイルに含まれるリソース自体はファイルではないため、FileInputStream. を絶対に必要とするコードがある場合はFileInputStream、 を使用してデータを抽出し、getResourceAsStream()それを一時ファイルにコピーしてから、FileInputStreamその一時ファイルの をコードに渡す必要があります。

もちろん、将来的には、 のようなものの具体的な実装を期待するコードを書くことは決してありませんInputStream。あなたはいつもそれを後悔するでしょう。

于 2009-12-16T09:59:31.410 に答える
5

私は最近同じ問題に遭遇しました。私たちが使用するサードパーティのライブラリは FileInputStream から読み取りますが、リソースは JAR またはリモートのどこにでも置くことができます。以前は一時ファイルに書き込んでいましたが、オーバーヘッドが大きすぎます。

より良い解決策は、InputStream をラップする FileInputStream を作成することです。使用するクラスは次のとおりです。

public class VirtualFileInputStream extends FileInputStream {

    private InputStream stream;

    public VirtualFileInputStream(InputStream stream) {
        super(FileDescriptor.in); // This will never be used
        this.stream = stream;
    }




    public int available() throws IOException {
        throw new IllegalStateException("Unimplemented method called");
    }


    public void close() throws IOException {
        stream.close();
    }


    public boolean equals(Object obj) {
        return stream.equals(obj);
    }


    public FileChannel getChannel() {
        throw new IllegalStateException("Unimplemented method called");
    }


    public int hashCode() {
        return stream.hashCode();
    }


    public void mark(int readlimit) {
        stream.mark(readlimit);
    }


    public boolean markSupported() {
        return stream.markSupported();
    }


    public int read() throws IOException {
        return stream.read();
    }


    public int read(byte[] b, int off, int len) throws IOException {
        return stream.read(b, off, len);
    }


    public int read(byte[] b) throws IOException {
        return stream.read(b);
    }


    public void reset() throws IOException {
        stream.reset();
    }


    public long skip(long n) throws IOException {
        return stream.skip(n);
    }


    public String toString() {
        return stream.toString();
    }

}
于 2009-12-16T15:26:12.253 に答える
0

解析が FileInputStream でのみ機能し、InputStream では機能しないとは思わないでください

それが本当のケースであり、そのパーサーを使用する必要がある場合

2つのオプション

  1. アダプター パターンを使用して CustomFileInputStream を作成し、それぞれのメソッドを上書きし、さらに getResourceAsStream データを CustomFileInputStream にリダイレクトします。

  2. getResourceAsStream を一時ファイルに保存し、一時ファイルを解析してから、完了したらファイルを削除します

于 2009-12-16T12:48:22.320 に答える