- PR -

BufferedInputStreamのreadについて

1
投稿者投稿内容
JS
会議室デビュー日: 2002/07/15
投稿数: 17
投稿日時: 2005-06-16 22:38
お世話になります。

ぽぽと申します。

環境:jdk1.4

ZipOutputStreamを使用してファイルの圧縮を行う処理を実装し、
アスキー形式のファイルは問題なく圧縮出来たのですが、バイナリ
形式のファイルでうまくいかないことがあります。

--------ソース抜粋----------------
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("C:\\java\\FindDirTest\\test.zip"));
for (int i = 0; i < vec1.size(); i++) {
File f = new File(((File)vec1.get(i)).getPath());
if (f.isFile()) {
// 指定のファイルを読み込む(FileInputStreamでも駄目でした)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
//FileInputStream bis = new FileInputStream(f);
// ZipEntry を生成
ZipEntry target = new ZipEntry(f.getAbsolutePath());
// 書き込み
zos.putNextEntry(target);
// バッファリングは自動的に行われます。
// ここで指定しているバッファサイズは、意味はないです
byte buf[] = new byte[1024];
int count;
// 1024で指定する場合も駄目でした
//while ((count = bis.read(buf, 0, 1024)) != -1) {
while ((count = bis.read(buf)) != -1) {
zos.write(buf, 0, count);
}
bis.close();
// 書き込み終了
zos.closeEntry();
}
}
zos.close();
--------ソース抜粋----------------

・アスキー形式は問題なし
・バイナリ形式であるサイズ以上のファイルだと、read処理のwhileで
 無限ループとなってしまう。
 (ごくまれに成功することもあります。)

上記のプログラムは、私、Streamなどにあまり詳しくなく、
WEBのサンプルを元にカスタマイズして作成したものです。

バイナリ形式の際に、サイズに関わらずread処理をしたいのですが
今回の現象について何かご存知の方がいらっしゃいましたら
解決方法について教えて頂けますでしょうか。

よろしくお願い致します。
四十路
会議室デビュー日: 2005/02/25
投稿数: 2
投稿日時: 2005-06-21 18:42
どれ位のサイズで無限ループとなるのでしょうか?

ソースを見たところ、Stream関連は特におかしくはないと思います。
怪しいといえばZipEntryに渡すものがgetAbsolutePath()の戻り値
になってますが、ここはディレクトリ名またはファイル名を渡すのが
正しいと思います。
JS
会議室デビュー日: 2002/07/15
投稿数: 17
投稿日時: 2005-07-11 19:19
返答遅くなって申し訳ありません。

その後調査をしたところ、Stream処理には問題がなく
ZipEntryにファイルオブジェクトを追加している
再帰処理に問題があったことが分かりました。

また、ご指摘のあった
>ZipEntryに渡すものがgetAbsolutePath()の戻り値
>になってますが、ここはディレクトリ名またはファイル名を渡すのが
>正しいと思います。
こちらについてはご指摘頂いたディレクトリ名またはファイル名に
しないと解凍時にフルパスで復元してしまったので、修正しました。

本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)