- PR -

ファイル圧縮について NO2

1
投稿者投稿内容
迷い猫
常連さん
会議室デビュー日: 2004/08/13
投稿数: 30
投稿日時: 2004-08-25 19:20
以前にも同じような内容で質問させていただきました。
そのときは出来たんですが、別の問題が発生してしまい、またご教授を頂きたく質問をさせていただきました。
質問内容ですが、Javaでファイルの圧縮処理を作成しているのですが、変な動きをしてしまいます。
普通に実行をすると、zipファイルは作成されるのですが、圧縮もとのファイルがzipファイルの中に入っておらず、
空のzipファイルが出来てしまいます。
コマンドプロンプトで実行すると、うまく圧縮されています。
又、コマンドプロンプトで1度実行したファイルで普通に実行かけると、
きちんと圧縮されるようになります。
文章が下手で伝わりにくいかと思いますが
、一応私の作成したソースを載せます。
申し訳ありませんがみなさんのお力を貸してください<m(__)m>

package study.struts.action;

import java.io.*;
import java.util.*;

public class SimpleZip {

protected static final int EOF = -1;

protected static File zf;

public static void Compression( String inFile ) {

try {
File file = new File( inFile );
zf = new File(inFile + ".zip" );
compressFile( file );
}
catch( FileNotFoundException e ){
System.out.println( "file not found" );
}
catch( ZipException e ){
System.out.println( "Zip error..." );
}
catch( IOException e ){
System.out.println( "IO error..." );
}
}

public static void compressFile( File file )
throws FileNotFoundException,ZipException,IOException {

try {
FileInputStream fis = new FileInputStream( file );
BufferedInputStream bis = new BufferedInputStream( fis );

FileOutputStream fos = new FileOutputStream( zf );
ZipOutputStream zos = new ZipOutputStream( fos );
ZipEntry target = new ZipEntry( file.getPath() );
zos.putNextEntry( target );

byte buf[] = new byte[1024];
int count;
while( ( count = bis.read( buf, 0, 1024 ) ) != EOF ) {
zos.write( buf, 0, count );
}
bis.close();
fis.close();
zos.closeEntry();
zos.close();
fos.close();
}
catch( FileNotFoundException e ){
throw e;
}
catch( ZipException e ){
throw e;
}
catch( IOException e ){
throw e;
}
}
}

環境
WindowsXP 
Tomcat5.0 
j2sdk1.4.2_02 
struts1.1
apache-ant-1.5.3-1
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-08-25 19:28
「コマンドプロンプトで実行すると、うまく圧縮されています。」とのことですが、コマンド
プロンプトで何を実行したんでしょうか。

環境はWebアプリケーションのようですが、このコードはサーブレットから呼び出されている
のでしょうか。詳細をチェックしてはいませんが、少なくともこのコードはスレッドセーフ
ではないので、複数のスレッドから同時に呼び出されたらおかしな動くをするでしょうね。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-08-25 20:00
コマンドから起動した時は、圧縮したいファイルがカレントディ
レクトリにあったからうまく行ったのでしょうね。

サービスとして起動したときには、ファイルが見つからなかった
のでしょう。迷い猫さんの文章からは断言できないですが、
多分、そんな気がする。
迷い猫
常連さん
会議室デビュー日: 2004/08/13
投稿数: 30
投稿日時: 2004-08-27 10:43
要点をまとめると、下記の通りです。

(1)「実行方法A」で実行すると、zipファイルは作成されるものの、
空のzipファイルができる(=圧縮がうまくいっていない)

(2)「実行方法B」で実行すると、うまく圧縮される

(3)Bの直後にAを行うと、うまく圧縮される

ただ、ソースがどぉーのとかじゃないような気がしてきました。
昨日までは、上記のような動作をしてやっと圧縮ファイルが出来ていたのですが、
次の日に(1)の方法で実行をすると正常に圧縮されました。(ソースの変更はしていない)
そうすると、開発環境の問題となってくるのでしょうか?

uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-08-27 20:53
「実行方法A」と「実行方法B」とはいったいなんですか?
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2004-08-28 01:41
Tomcatを実行した時のカレントディレクトリってどこでしょう?
Tomcatを起動した時点のカレントディレクトリがWebアプリにとってのカレントになったような覚えがあるのですが、、、。

Kissingerさんの記述の内容と上記から考えるとTomcatを起動した時点のカレントディレクトリがどこかによって成功したり失敗するのでは?
引用:
コマンドから起動した時は、圧縮したいファイルがカレントディ
レクトリにあったからうまく行ったのでしょうね。

サービスとして起動したときには、ファイルが見つからなかった
のでしょう。迷い猫さんの文章からは断言できないですが、
多分、そんな気がする。


曖昧なので間違ってたらすみません。
迷い猫
常連さん
会議室デビュー日: 2004/08/13
投稿数: 30
投稿日時: 2004-09-02 11:44
返信が遅くなって申し訳ありません。

ukさん、Kissingerさん、ちょま吉さん回答ありがとうございました。
なにが原因かわからないのですが、
今では、毎回きちんと圧縮処理が出来るようになりました。
お手数をおかけしてすみませんでした。

今後とも宜しくお願い致します。
1

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