
No.4ベストアンサー
- 回答日時:
その現象とプログラムから、 ava = bis.available() 得た ava と、 bis.read(bs); でbsに読み込んだバイト数とに齟齬がある(読み込んだバイト数の方が1少ない)のではないだろうか、と予測します。
そこで、 InputStream.availavle のマニュアルを読みます。
http://docs.oracle.com/javase/jp/6/api/java/io/I …
> この入力ストリームのメソッドの次の呼び出しによって、ブロックせずにこの入力ストリームから読み込むことができる (またはスキップできる) 推定バイト数を返します。(略) 読み込むまたはスキップするバイト数が少なくなることがあります。
ということで、bs[ava]と確保したものを全て書き出すのは問題がありそうです。
と思って検索の続きを見ると、まったく同じ問題について書かれたブログが見付かりました。
> [Java]zipファイルの解凍ではまる(ファイル末尾にヌル文字が1バイトできる)
http://daybreaksnow.hatenablog.jp/entry/2013/10/ …
available は参考程度にして、readの戻り値で正確に何バイト読んだかを求めて、writeでも正確にそのバイト数だけ書きだすのがよいようです。
No.2
- 回答日時:
実行環境もプログラムも無しに正確な判断はできません。
ありがちな物で予想するなら、xlsxをASCIIモードで書き出している、というあたりが疑われます。
まず、元のzipが正しいかどうか確認するために。
(1)元のxlsxが正常に読めるか、Excelで開いて確認する。(保存終了すると内容が変わってしまうので、保存はしないで閉じる)
(2)他のZIPツールで解凍する。
(3)(2)で解凍したxlsxと。圧縮元のxlsxが等しいか確認する。(バイナリーファイル比較ツールを使う)
以上で、ZIP自体に問題が無い、と確認できたら
(4)あなたのプログラムで解凍したxlsx と、元のxlsxが等しいか確認する。(バイナリーファイル比較ツールを使う)
(4)で比較した内容によって
・先頭とか末尾とかが増えている→余計なものまで出力してしまっている
・0x0Aや0x0Dが増えたり減ったりしている→ ASCIIモードでの書き出し。あるいは、改行付きでの書き出し
・ぜんぜん違う→根本的に何か間違えている
とかが考えられます
この回答への補足
環境等提示せずに質問したにも関わらず、丁寧な回答ありがとうございます。
環境
java1.7
バイナリ比較ツールで比較した結果は
解凍後のファイルの末尾に「00」が常についておりました。
コードは以下になります。
何か問題がありますでしょうか?
/**
* Zipファイル解凍
*
* @param String 解凍するファイルパス
* @param String 解凍ファイル格納フォルダパス
* @param boolean すでに解凍フォルダパスが存在した場合中身を空にするか trueで消す。
* @return List 解凍後出力パスファイルのリスト
*/
public List<String> decompressionZipFile(String inputPath, String outputPath,boolean outPutPathDellFlg) throws Exception{
org.apache.tools.zip.ZipFile zipFile = new org.apache.tools.zip.ZipFile(inputPath,"MS932");
File decoPath = new File(outputPath);
ArrayList<String> returnList = new ArrayList<String>();
if(!decoPath.isDirectory()){
//作成
decoPath.mkdir();
}else{
if(outPutPathDellFlg){
//中身削除する。
delFolderAllFile(outputPath);
}
}
Enumeration<? extends org.apache.tools.zip.ZipEntry> entries = zipFile.getEntries();
while (entries.hasMoreElements()) {
org.apache.tools.zip.ZipEntry ze = entries.nextElement();
//出力先ファイル
File outFile = new File(decoPath, ze.getName());
if (ze.isDirectory()) {
outFile.mkdirs();
} else {
returnList.add(outFile.getPath());
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
InputStream is = zipFile.getInputStream(ze);
bis = new BufferedInputStream(is);
if (!outFile.getParentFile().exists()) {
// ディレクトリ作成
outFile.getParentFile().mkdirs();
}
// 出力先OutputStreamを作成。
bos = new BufferedOutputStream(new FileOutputStream(outFile));
//書込
int ava;
while ((ava = bis.available()) > 0) {
byte[] bs = new byte[ava];
// 入力
bis.read(bs);
// 出力
bos.write(bs);
}
bos.flush();
bis.close();
bos.close();
}
}
zipFile.close();
return returnList;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
容量の大きいzipファイルの解凍...
-
ゲームMODのpakファイルを開けない
-
Zip解凍時にパスワードが入...
-
○○.7z.001~●●.7z.003という圧...
-
ファイルの先頭よりも前にファ...
-
アーカイブファイルではありません
-
WINRARで、・・・構文が間違っ...
-
リドルジョーカーのダウンロー...
-
Win RARの解凍ができません
-
.pakファイルを見るには?
-
FFFTPの起動ができない・エラー...
-
JW-CADへのJPEG画像の読み込み...
-
JW-CADでTIFF画像が表示されない
-
2chの用語を教えてください
-
右クリック→新規作成→圧縮(zip...
-
免許証をPDFでメール送信
-
cdrファイルを開きたい
-
フォルダ内の動画ファイルを自...
-
メールにフォルダを添付したい!
-
『.MD2』の画像ファイルを『.JP...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
容量の大きいzipファイルの解凍...
-
ゲームMODのpakファイルを開けない
-
○○.7z.001~●●.7z.003という圧...
-
マンガミーヤの機能拡張について
-
会社のメールで、 よその会社か...
-
アーカイブファイルではありません
-
ファイルの先頭よりも前にファ...
-
JW-CADでTIFF画像が表示されない
-
リドルジョーカーのダウンロー...
-
7zip 右クリックのメニューを...
-
空き容量があるのに「空き容量...
-
解凍した後のZIPファイルっ...
-
アーカイブファイルの破損
-
Winrar コマンドラインから解凍
-
Boothというところでダウンロー...
-
ファイルの解凍 メロンブックス
-
Zip解凍時にパスワードが入...
-
RAR形式の動画ファイルを再生で...
-
cueとtakの拡張子の展開の方法
-
WINRARで、・・・構文が間違っ...
おすすめ情報