ブログランキング・にほんブログ村へ


iPhone/iPad用ゲーム AirForce-U/AirForce-U LITE iTunesにて公開中

2012年10月23日

Java Zipの解凍をするエントリ数でプログレス処理

JavaっつーかAndroidっつーか。
Javaはいろんなライブラリが全部組み込みであるかのようにさくっと使えてとっても便利。
Zipもその一つ。
ZipInputStreamを使うと、あっさりと解凍できちゃう。始めのころのJavaはこんなに便利じゃなかったのにそれでもinflaterとか素で使えて感動したってのに凄いな。
でも、解凍するエントリの数をあらかじめ知りたい場合はどうしよう?プログレスバーとか出したいときとか。あるよね。
そんなの
ZipInputStream in = new ZipInputStream(new BufferedInputStream(new FileInputStream( srcFile ) ) );
ZipEntry zipEntry;
int entryNum = 0;
try {
while( (zipEntry = in.getNextEntry()) != null){
entryNum++;
}
} catch (IOException e) {
}
で簡単じゃーん、そう思ったらこれがすっげー遅い。
どうもgetNextEntryが解凍を既にやっちゃってるか、それに近い処理をやっちゃうのか?

そういうときはZipFileを使うらしい。つかZipInputStreamもどうやらZipFileを使ってる上位クラスに過ぎないらしい。

File srcFile = new File( Zipファイルを置いたディレクトリ,Zipファイル名 );

ZipFile zipFile;
int entryNum = 0;
try {
zipFile = new ZipFile( srcFile );
entryNum = zipFile.size();

} catch (ZipException e) {
}


こんだけだす。処理速度は格段にあがりました。で、ついでに前処理もちょっとやっちゃおう、とか。
例えば必要なディレクトリだけ先行でmkdirしちゃおう、とか。

そしたら
ZipFile zipFile;
int entryNum = 0;
try {
zipFile = new ZipFile( srcFile );
entryNum = zipFile.size();

{
Enumeration<? extends ZipEntry> enums = zipFile.entries();

while( enums.hasMoreElements() ){
ZipEntry zipEntry = ( ZipEntry )enums.nextElement();

if( zipEntry.isDirectory() ){
String name = zipEntry.getName();

File file = new File( 展開先のベースディレクトリ, name );

if (file.exists() == false) { //ディレクトリがなければ作る
file.mkdir();
}
}
}
}
} catch (ZipException e) {
} catch (IOException e) {
}
こんな感じ。
しかる後にZipInputStream使って

// _progressDialog.setMax( entryNum ); //Android ASyncTask progressの最大値設定

ZipInputStream in = new ZipInputStream(new BufferedInputStream(new FileInputStream( srcFile ) ) );
ZipEntry zipEntry;
try {

for( int i=0;;i++ ){
if( i >= entryNum ){
break; //OK
}
// if( isCancelled() ){ //Android ASyncTaskの場合Cancel検出
// break; //Cancelされた
// }
zipEntry = in.getNextEntry();
if( zipEntry == null ){
break; //error
}
// publishProgress( i ); //Android ASyncTask progressを進める

String name = zipEntry.getName();
File file = new File( 展開先ディレクトリ, name );
if( !zipEntry.isDirectory() ){
BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream( file ) );

byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
in.closeEntry();
out.close();
out = null;
}
}
} catch (IOException e) {
e.printStackTrace();
}


こんな感じ。非同期処理用に少々くどい書き方になってるけど。でもプログレス出すってことは非同期にならざるを得ないし。
タグ:android JAVA
posted by みこあいさ at 12:02| JAVA

2012年10月20日

Java テキストファイルの読み書き

Javaでテキストファイルの読み書きする例。
こんな基本的なのどこにでも転がってるだろうとぐぐると、書くほうはともかく何故か読む方は1文字ずつのがほとんどでたまに1行毎とかで実行速度とか改行コード化けとか実用上問題あるんで一気に読むやつを置いとく。

static public boolean saveTextFile( File file,String text ){
//テキストファイルを保存
try {
FileWriter writer = new FileWriter(file);
BufferedWriter bw = new BufferedWriter( writer );
bw.write( text );
bw.close();
writer.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}

static public String loadTextFile( File file ){
//テキストファイルを読み込み
String s = "";
try {
FileReader in = new FileReader( file );
StringBuffer sbuf = new StringBuffer();

char[] cbuf = new char[(int) file.length()];
in.read( cbuf );
sbuf.append(cbuf);
s = sbuf.toString();
in.close();
} catch (IOException e) {
System.out.println(e);
}
return s;
}
タグ:JAVA
posted by みこあいさ at 09:25| JAVA

2012年07月03日

Java簡単な設定ファイルの読み書き

Javaプログラムで、簡単な設定を保存しておきたい場合。
xmlを使うほど構造とかあるわけでもない、おおげさなものじゃないやつ。
windowsのiniとかその程度のもの。

srcfile=/asasasasaswewe/asas/asas/test.aaa
windowSize=300,222,11,22
sound=on

こういうやつ。

まず保存先だが、
System.getProperty("user.dir");
でそのときの作業ディレクトリを得る。
WindowsだとUsers下のローミングとかOS毎にこういうファイルを置く場所の作法ってのがあるけど、Javaはそんなこと知らないし、かまうべきでない。

以下自分の例そのまんまコピペ。
aryRecentSrcFilesというArrayListにある文字列をrecent0,recent1,recent2...と書き出し、読み込む。
気を付ける点はたいしたものはないが、
読み込み時BufferedReaderで行毎に読み出すためにreadLine()を使っていることと、
書き込み時BufferedWriterで改行コードをnewLine()で出しているところ。
あと、BufferedReader.readLine()は昔DataInputStream.readLine()だったみたいだが、これは現在非推薦となっていて、BufferedReaderを使うようにとのことらしい。

private File getSettingFile(){
String s = System.getProperty("user.dir");
String filePath = s + "/obj2aob.ini";
return new File( filePath );
}
private void saveSettings(){
//設定を保存
File file = getSettingFile();
try {
FileWriter writer = new FileWriter(file);
BufferedWriter bw = new BufferedWriter( writer );
for( int i=0;i<aryRecentSrcFiles.size();i++ ){
String line = "recent"+i+"="+aryRecentSrcFiles.get( i );
bw.write( line );
bw.newLine(); //改行
}
bw.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void loadSettings(){
//設定を読み込み
File file = getSettingFile();
try {
FileReader reader = new FileReader( file );

BufferedReader in = new BufferedReader( reader );

HashMap<String,String> map = new HashMap();
for( ;; ){
String line = in.readLine();

if( line == null )break;

String[] words = line.split( "=",2 );

if( words != null && words.length == 2 ){
map.put( words[ 0 ],words[ 1 ] );
}
}
for( int i=0;;i++ ){
String value = map.get( "recent"+i );
if( value==null )break;
if( value.isEmpty() )break;
aryRecentSrcFiles.add( value );
}
} catch( FileNotFoundException e ){
//設定ファイルなし
} catch (IOException e) {
e.printStackTrace();
}
}
タグ:JAVA
posted by みこあいさ at 12:20| JAVA