メソッドは認識してgetResourceAsStream()
いますが、ファイルを読み取るパーサーに問題があり、構造全体が a を期待するように実装されてFileInputStream()
おり、getResourceAsStream()
キャストできない入力ストリームが返されます。この状況の簡単な「修正」はありますか?
3 に答える
JAR ファイルに含まれるリソース自体はファイルではないため、FileInputStream
. を絶対に必要とするコードがある場合はFileInputStream
、 を使用してデータを抽出し、getResourceAsStream()
それを一時ファイルにコピーしてから、FileInputStream
その一時ファイルの をコードに渡す必要があります。
もちろん、将来的には、 のようなものの具体的な実装を期待するコードを書くことは決してありませんInputStream
。あなたはいつもそれを後悔するでしょう。
私は最近同じ問題に遭遇しました。私たちが使用するサードパーティのライブラリは 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();
}
}
解析が FileInputStream でのみ機能し、InputStream では機能しないとは思わないでください
それが本当のケースであり、そのパーサーを使用する必要がある場合
2つのオプション
アダプター パターンを使用して CustomFileInputStream を作成し、それぞれのメソッドを上書きし、さらに getResourceAsStream データを CustomFileInputStream にリダイレクトします。
getResourceAsStream を一時ファイルに保存し、一時ファイルを解析してから、完了したらファイルを削除します