[解決済み] InputStreamをクローンする方法は?
2022-04-15 13:53:51
質問
あるメソッドに渡すInputStreamがあり、何らかの処理を行っています。同じInputStreamを他のメソッドで使用しますが、最初の処理の後、InputStreamはメソッド内でクローズされるようです。
InputStreamをクローンして、クローズしたメソッドに送るにはどうしたらよいでしょうか?他の解決策がありますか?
EDIT: InputStreamをクローズするメソッドは、ライブラリの外部メソッドです。私は閉じるかどうかを制御することはできません。
private String getContent(HttpURLConnection con) {
InputStream content = null;
String charset = "";
try {
content = con.getInputStream();
CloseShieldInputStream csContent = new CloseShieldInputStream(content);
charset = getCharset(csContent);
return IOUtils.toString(content,charset);
} catch (Exception e) {
System.out.println("Error downloading page: " + e);
return null;
}
}
private String getCharset(InputStream content) {
try {
Source parser = new Source(content);
return parser.getEncoding();
} catch (Exception e) {
System.out.println("Error determining charset: " + e);
return "UTF-8";
}
}
解決方法は?
同じ情報を複数回読み込むだけで、入力データがメモリに収まるほど小さい場合は、データを自分の
InputStream
を追加しました。
バイトアレイアウトプットストリーム
.
そして、関連するバイトの配列を取得し、多くの "clone" を開くことができます。 バイトアレイインプットストリーム を好きなだけ使うことができます。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Code simulating the copy
// You could alternatively use NIO
// And please, unlike me, do something about the Exceptions :D
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) > -1 ) {
baos.write(buffer, 0, len);
}
baos.flush();
// Open new InputStreams using recorded bytes
// Can be repeated as many times as you wish
InputStream is1 = new ByteArrayInputStream(baos.toByteArray());
InputStream is2 = new ByteArrayInputStream(baos.toByteArray());
しかし、新しいデータを受け取るためにオリジナルのストリームを開いておく必要が本当にあるのなら、外部呼び出しの
close()
. を防ぐ必要があります。
close()
が何らかの方法で呼び出されないようにします。
UPDATE(2019年)。
Java 9以降では、中間ビットを
InputStream.transferTo
:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
input.transferTo(baos);
InputStream firstClone = new ByteArrayInputStream(baos.toByteArray());
InputStream secondClone = new ByteArrayInputStream(baos.toByteArray());
関連
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] JavaでStringをInputStreamに変換する方法を教えてください。
-
[解決済み] JavaでInputStreamをバイト配列に変換する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
java の例外が発生しました java
-
Spring Boot による HTTPS アクセスの設定
-
Dateが型に解決できない問題を解決する
-
javaで非静的な解を静的な参照にすることができない
-
プロローグでのコンテンツは禁止されています
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
[オリジナル】java学習ノート【II】よくあるエラー クラスパス上のクラスファイルが見つからない、またはアクセスできない場合
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。