ファイル圧縮についての質問

このQ&Aのポイント
  • ファイル圧縮についての質問について、圧縮メソッドを作成した際に生じる問題について詳細を述べています。
  • 特定の条件下で、ファイルの圧縮中に空の圧縮ファイルが作成される現象について、ログを確認した結果を共有しています。
  • この問題が発生する原因や解決策について、詳細な情報を提供しているので、アドバイスがある方は教えてください。
回答を見る
  • ベストアンサー

ファイル圧縮について。

ファイル圧縮について質問させてください。 以下のようなメソッドを作成したのですが、 public run(String strFiles[], String strZipFileName) { int i = 0; int iLen = 0; FileInputStream fis = null; FileOutputStream fos = null; ZipOutputStream zos = null; ZipEntry zent = null; byte[] buf = new byte[1024*10*10]; try { fos = new FileOutputStream(strZipFileName); zos = new ZipOutputStream(fos); for (i = 0; i < strFiles.length(); i++) { fis = new FileInputStream(strFiles[i]); zent = new ZipEntry(strFiles[i]); zos.putNextEntry(zent); while (-1 != (iLen = fis.read(buf))) { zos.write(buf, 0, iLen); } zos.flush(); zos.closeEntry(); fis.close(); } } catch(Exception e) { System.err.println(e); } finally { try { zos.close(); // ※1 fos.close(); // ※2 } catch(Exception e) { System.err.println(e); } } } サイズの小さいファイルや、 特定のサイズのファイル(13k程度)を対象とした時、 高い確率で、空の圧縮ファイルが作成される事があります。 ログを出力しながら確認すると、このような現象が起きた場合、 圧縮ファイルをcloseする直前(※1)では作成されたファイルはサイズがあるのですが、 圧縮ファイルをcloseした直後(※2)ではファイルのサイズが0になってしまいます。 また、2台あるサーバの内、1台だけでこの現象が起こっています。 javaのバージョンは1.3です。 何故このような現象が起こってしまうのか、 ご存知の方がいらっしゃいましたら教えていただけないでしょうか。 宜しくお願いします。

  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • akanekor
  • ベストアンサー率52% (102/194)
回答No.2

実は、その現象3,4年前に自分も同じように苦しんだ記憶が あります。 結局、原因がわからず、何か他の対策をして逃げたんですが、、 最後は、何やったか、よく憶えてません(--; 色々やったんで、、。 たぶん、ファイルが消える場合は dummy.txtみたいな余分なファイルをzipに入れて 解決?した気がする、、。 (複数ファイルなら消える現象が起こらなかった、、はず) まあ、昔の記憶なのでハッキリ憶えてません。 (コードも無いです) 何にせよ、仕様って事で許してもらいました(=-=;

kawakami2005
質問者

お礼

ありがとうございます。 サーバを再起動したら現象が発生しなくなりました。 結局原因はわからぬままですが、 サーバ自体にも問題があったようです(win2003server) どちらにせよ、close処理が正常に行われなかったので 例外かエラーが発生しても良いと思うのですが・・・。 色々とありがとうございました。

その他の回答 (1)

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.1

まったく関係ないかもしれませんが(=w=; http://java.sun.com/j2se/1.3/ja/ReleaseNotes.html#131_01 #4764567 この現象で、アプリ自体が落ちて正常にcloseされなかったため、ファイルが消えたとか、。

kawakami2005
質問者

補足

ありがとうございます。 拝見させていただきました。 OutputStream.close() メソッドの潜在バグ、 結果としてアプレットがハングアップしてしまうと記載されているので、直接関係は無さそうなのですが、 akanekorさんの仰る通り、このバグの影響でclose処理が上手く機能していない可能性もありそうですね。 詳細なバージョンを確認してみることにします。

関連するQ&A

  • Zipファイル解凍処理について

    こんにちわ。 Javaの解凍処理について質問です。 Test.zipがあって、その中身が「テスト.xls」とした時、うまく解凍ができません。 Zipファイルの中身が日本語名ではなく、「Test.xls」であれば正常に解凍ができます。 下記の書き方では日本語名のファイルの入ったZipファイルを解凍することはできないのでしょうか? どなたかご教授お願い致します。 String fname = null; FileInputStream fis = null; BufferedInputStream bis = null; ZipInputStream zis = null; ZipEntry zent = null; FileOutputStream fos = null; try { fis = new FileInputStream(FilePath); bis = new BufferedInputStream(fis); zis = new ZipInputStream(bis); byte[] buf = new byte[1024]; int len; // アーカイブ中に含まれるファイル情報の取得 while ((zent = zis.getNextEntry()) != null) { int intResult = zent.toString().indexOf("."); int intLength = zent.toString().length(); //ファイル名の変更(フォルダ名+社員コード)StringBuffer BuffRename = new StringBuffer(); BuffRename.append("D:\\test\\"); BuffRename.append(zent.getName().substring(0,intResult)); BuffRename.append(SyainCd); BuffRename.append(zent.getName().substring(intResult,intLength)); fname = BuffRename.toString(); //書き込みファイルをオープン fos = new FileOutputStream(fname); while (-1 != (len = zis.read(buf, 0, buf.length))) { fos.write(buf, 0, len); } //★★★ fos.close(); } Catch・finallyは省略

  • UNICODEへの文字コード変換

    以下のようにして、 日本語で書かれたファイルを読み込んで、 UNICODEに変換したいのですが、 できません。。。 どこが間違っているのでしょうか?(;;) 元の日本語ファイル「こんにちは」 >>できたファイル「\u3053\u3093\u306b\u3061\u306f」 という風にしたいのですが。。 //FileIOSteramの作成 FileInputStream fis = new FileInputStream(iFile); FileOutputStream fos = new FileOutputStream(oFile); //Stream ラップ InputStreamReader in = new InputStreamReader(fis, "EUC-JP-LINUX"); OutputStreamWriter out = new OutputStreamWriter(fos, "UTF16"); System.out.println(System.getProperty("file.encoding")); //読み込みと書き込み int c; InputStreamReader in = new InputStreamReader(fis, "Unicode"); Writer out = new Writer(fos); while((c = in.read()) != -1){ out.write(c); }

  • ファイル書き込みに関して

    FileOutputStream fos = new FileOutputStream("test"); OutputStreamWriter out = new OutputStreamWriter(fos, "UTF-8"); out.write("なに"); out.close(); fos.close(); 以上のコードを実行させて、ファイルtestをUTF8で開いたら、文字化けしています。どう直したらいいですか?

    • ベストアンサー
    • Java
  • キャラクタ?バイト?

    下記プログラムを作成しましたが、 b1,b2の配列結果が等しくなりません。 b1の結果はキャラクタデータ(文字)のようですが、 b2の結果はバイトデータのようです。 原因は何故なのでしょうか??? b1は、String型をbyteデータに変換してbyte配列へ b2は、直接byteデータをbyte配列へ import java.io.*; public class Sample { private static final String FILE_NAME = "Output01.txt"; public static void main(String[] args) { // FileOutputStreamクラス宣言 FileOutputStream fos = null; try { fos = new FileOutputStream(FILE_NAME); byte[] b1 = "AB".getBytes(); for (int i = 0; i < b1.length; i++) { fos.write(b1[i]); } byte [] b2 = {(byte)A, (byte)B}; for (int i = 0; i < b2.length; i ++){ fos.write(b2[i]); } } catch (Exception e) { System.out.println("Exception : " + e); } finally { try { fos.close(); } catch (Exception et) { } } } }

    • ベストアンサー
    • Java
  • 固定長データの情報処理について

    現在情報処理についての勉強中ですが import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; public class dat_stream { public static void main(String[] args) { // 読み込むファイルの名前 String inputFileName = "ファイル名"; // 書き込むファイルの名前 String outputFileName = "ファイル名"; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); File outputFile = new File(outputFileName); try { // 入力ストリームの生成 FileInputStream fis = new FileInputStream(inputFile); BufferedInputStream bis = new BufferedInputStream(fis); // 出力ストリームの生成 FileOutputStream fos = new FileOutputStream(outputFile); BufferedOutputStream bos = new BufferedOutputStream(fos); // 読み込み用バイト配列 byte[] buf = new byte[9]; // ファイルへの読み書き int len = 0; while ( ( len = bis.read(buf) ) != -1 ) { bos.write(buf, 0, len); } // 後始末 bos.flush(); bos.close(); bis.close(); // エラーがあった場合は、スタックトレースを出力 } catch(Exception e) { e.printStackTrace(); } } } を使用してDATデータの入出力を考えています。 F0 F2 12 34 56 78 9C 00 50といった9byteの固定長データが あったとします。 (1)1byteから2byteはそのまま入出力 F0 F2 →F0 F2 (2)3byte~7byteパック10進数からアンパック(ゾーン)10進数に変換 12 34 56 78 9C →F1 F2 F3 F4 F5 F6 F7 F8 F9 こちらに関しては上位桁・下位桁で計算し正の数・負の数等も 考えなければいけないと思うのですが・・・ (3)バイナリ進数からゾーン10進数に変換 00 50→F0 F0 F8 F0 計算方法)0*16進数3剰 + 0*16進数2剰 + 5*16進数1剰+ 0 このような(1)~(3)のようなバイナリ入出力を考えた場合 1レコードが9byteで 10レコードで90byteだった場合の 書き出し方法について情報処理について詳しい方いましたら アドバイスください。 なお数値変換については今後勉強していければと思っております。 どうぞよろしくお願い致します。

    • ベストアンサー
    • Java
  • ファイルの入出力をするプログラム

    1週間前からJAVAを勉強しております。 簡単な練習で、テキストファイル(test.txt)に縦一列に並んでいる数字を読み込み別のテキストファイルに書き込むプログラムを作っておりますが FileInputStream file = new FileInputStream("test.txt"); file.read(buf_byte); for(i=0;i<=10;i++)buf_char[i]=(char)buf_byte[i]; という感じで恐らく回りくどいことをしてると思いますが、ダイレクトに文字を読み込む方法がわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • JPEG画像の書き出し

    JPEG画像を読み込んで別ファイルに出力するという操作を行いたくて、以下のように書きました。 //画像情報の取得 try { FileInputStream fis = new FileInputStream(fileName); JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(fis); image = decoder.decodeAsBufferedImage(); fis.close(); } catch (IOException e) { System.err.println("Can't open the file."); } //** 中略 **// //画像情報の出力 try{ FileOutputStream fos = new FileOutputStream(fileName); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image); param.setQuality((float)1.0, false); encoder.setJPEGEncodeParam(param); encoder.encode(image); fos.close(); } catch (IOException e){ System.out.println("Can't save the new file."); } これで、実際に入出力はできるのですが、圧縮されるのかオリジナルとは違うものが出力されてしまいます。 コピーではなく、画素値の変更が一切ないように出力したい場合はどうしたらいいでしょうか?

    • ベストアンサー
    • Java
  • ファイルロック後の書き込みについて

    ファイルAをロックしファイルBを読み込み ファイルAに書き込むプログラムを作成しています。 単体起動では問題無く動くのですが 複数起動するとファイルの書き込みが行われなくなってしまいます。 ロックしたプログラム以外はロックエラーになり ロックについては正常に動いているように見えます。 なぜ書き込みが行われなくなってしまうかご教授いただけますか? import java.io.* ; import java.nio.*; import java.nio.channels.*; public class CopyFile { public static void main(String[] args) throws Exception { try{ FileInputStream fis = null; FileOutputStream output = null; FileChannel outChannel = null; FileLock outFileLock = null; byte buf[] = new byte[2048]; int len; int count = 0; if (args.length != 2) { System.out.println("使用法: java CopyFile ファイル名1 ファイル名2"); System.exit(0); } //if String source= args[0]; String target= args[1]; File sourceFile = new File(source); File targetFile = new File(target); fis = new FileInputStream(sourceFile); output = new FileOutputStream(targetFile); outChannel = output.getChannel(); outFileLock = outChannel.tryLock(); if (outFileLock == null) { System.out.println("rock error!!"); System.exit(0); } else { while ((len = fis.read(buf)) != -1) { output.write(buf, 0, len); count += len; } Thread.sleep(5000); output.flush(); output.close(); fis.close(); } }catch(Exception e){ System.out.println(e); } } } // Class CopyFile

    • ベストアンサー
    • Java
  • javaによるファイル送信のプログラム

    ユニキャスト通信のおけるプログラミングで、1のプログラムを2のプログラムを使ってファイル送信ができるようにしたいのですがうまくいきません。私のjavaの知識が授業についていかなくて図書館でいろいろと本を探したのですが見つかりませんでした。誰か教えていただけませんか? /*1*/ import java.net.*; import java.io.*; public class udpechoServer{ static final int echo_PORT = 7; //エコーポート番号 static final int BUFSIZE = 1024; //バッファサイズ public static void main(String[] args) throws IOException{ int port = echo_PORT; //ポート番号 int cliport; //クライアントポート番号 int len; //データ長 int i; //キーインバッファクリアインデックス DatagramSocket sock = null; //データグラムソケット宣言,初期化 byte[] buf = new byte[BUFSIZE]; byte[] wbuf = new byte[BUFSIZE]; String recvdata; //受信データ try{ sock = new DatagramSocket(port); DatagramPacket recvpacket = new DatagramPacket(buf,BUFSIZE); DatagramPacket sendpacket = new DatagramPacket(buf,BUFSIZE); System.out.println("Connected to echo server"); while(true){ sock.receive(recvpacket); //データ受信 recvdata = new String(recvpacket.getData(),0,recvpacket.getLength()); recvdata = recvdata.trim(); //トリミング(CRLF) wbuf = recvdata.getBytes(); //文字列→バイト配列変換 i = 0; len = wbuf.length; buf = new byte[BUFSIZE]; while(wbuf[i] != 0x0d){ //途中のCR検出 buf[i] = wbuf[i]; //データコピー i++; if(i >=len){ break; } } recvdata = new String(buf,0,i); //バイト配列→文字列変換 System.out.println(recvdata); //画面出力 InetAddress ipadr = recvpacket.getAddress(); cliport = recvpacket.getPort(); buf = recvdata.getBytes(); len = buf.length; sendpacket = new DatagramPacket(buf,len,ipadr,cliport); sock.send(sendpacket); //データ送信 recvpacket.setLength(BUFSIZE); //データグラムパケット長リセット } }catch(SocketException e){ e.printStackTrace(); } } } /*2 */ import java.io.*; class FileCopy { public static void main(String argv[]){ try{ InputStream in = new FileInputStream(argv[0]); //入力ファイルを開く //BufferedInputStreamオブジェクトの生成 BufferedInputStream bin = new BufferedInputStream(in); OutputStream out = new FileOutputStream(argv[1]); //出力ファイルを開く //BufferedOutputStreamオブジェクトの生成 BufferedOutputStream bout = new BufferedOutputStream(out); byte buf[] = new byte[1024]; int c; //読み込みデータがなくなるまで読み込み while((c = bin.read(buf, 0, buf.length)) != -1){ bout.write(buf, 0, c); //データの書き込み処理 } System.out.println("\""+argv[0]+"\" was converted into \""+argv[1]+"\""); bin.close(); //入力ファイルを閉じる bout.close(); //出力ファイルを閉じる }catch(Exception e){} } }

    • ベストアンサー
    • Java
  • ストリームの問題について【至急】

    import java.io.*; public class FileStreamDemo { public static void main(String[] args){ try{ byte[] buffer=new byte[1024]; FileInputStream fileInputStream= new FileInputStream(new File(args[0])); FileOutputStream fileOutputStream= new FileOutputStream(new File(args[1])); System.out.println("コピーファイル: "+fileInputStream.available()+"バイト"); while(true){ if(fileInputStream.available()<1024){ int remain=-1; while((remain=fileInputStream.read())!=-1){ fileOutputStream.write(remain); } break; } else{ fileInputStream.read(buffer); fileOutputStream.write(buffer); } } fileInputStream.close(); fileOutputStream.close(); System.out.println("コピー完了"); } catch(ArrayIndexOutOfBoundsException e){ System.out.println( "using:java FileStreamDemo src des"); e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } } } JAVAの入門者です。 JAVAの教科書に書いてあるように、上のプログラムを書きましたけど… コンパイルすると、エラーメッセージが出て来ます。 エラー中身は下記のとおりです。 【using:java FileStreamDemo src des java.lang.ArrayIndexOutOfBoundsException: 0 at FileStreamDemo.main(FileStreamDemo.java:8) 】 どうすればいいのか悩んでいます。 誰か、助けていただけないのでしょうか?どこか間違ってるか、教えてください。 よろしく、お願いします。

専門家に質問してみよう