2009-08-29
■[java]javaでzip作成

javaでディレクトリ以下のzip化してる。不要ファイルが多くなったから、有無を言わさずzip化するため。
文字化け化けだ。ZipOutputStream#getUTF8Bytesとかがprivateで存在するし、外からどうこうしてもどうしようもないのかな。
import java.io.*; import java.util.zip.*; public class Zipper { public static void main(String[] args) { if (args.length < 1) { System.out.println("usage: - path"); return; } new Zipper(args); } public Zipper(String[] args) { ZipOutputStream zipStream = null; try { File root = new File(args[0]); File zip = new File(root.getName() + ".zip"); zipStream = new ZipOutputStream( new BufferedOutputStream(new FileOutputStream(zip))); directory(root , zipStream); zipStream.finish(); } catch(Exception e) { e.printStackTrace(); } finally { try { zipStream.close(); } catch(Exception ignore) {} } } void directory(File file, ZipOutputStream zip) throws IOException { for (File f : file.listFiles()) { if (f.isDirectory()) { createDirEntry(f, zip); directory(f, zip); } else if (f.isFile()) { file(f, zip); } } } void file(File file, ZipOutputStream zip) throws IOException { ZipEntry entry = new ZipEntry(file.getName()); BufferedInputStream stream = new BufferedInputStream(new FileInputStream(file)); zip.putNextEntry(entry); int i; while((i = stream.read()) != -1) { zip.write((byte)i); } stream.close(); zip.closeEntry(); } void createDirEntry(File file, ZipOutputStream zip) throws IOException { ZipEntry entry = new ZipEntry(file.getName() + "/"); entry.setSize(0); entry.setCrc(0); zip.putNextEntry(entry); zip.closeEntry(); } }
やったことないけど、rubyとかならあっさり出来そうだ。
2009-07-02 Fireofoxのファイルアップロードでロック

2008-09-23
■[java]既存クラスにフィールド追加ではまり中。

こんなクラスを作っておく。
class Hoge { String hoge = "hoge"; }
これをこんな感じで呼び出してみる。
public class AddFieldTest { public static void main(String args[]) { Hoge hoge = new Hoge() { String foo = "foo"; }; } }
まぁ、こんな書き方、普通のクラスに出来るとは知らなかった事が問題か。
ここで作ったfooにアクセス。
public class AddFieldTest { public static void main(String args[]) { Hoge hoge = new Hoge() { String foo = "foo"; }; System.out.println(hoge.foo); } }
こうすると、コンパイルエラー。
AddFieldTest.java:12: シンボルを見つけられません。 シンボル: 変数 foo
場所 : Hoge の クラス
System.out.println(hoge.foo); エラー 1 個
らしい。
どうなってるのかわからないけど、全フィールドを拾えば解る筈。
Hoge hoge = new Hoge() {
String foo = "foo";
};
Class clazz = hoge.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
これの実行結果がこれ。
C:\Hoge\Hoge>java AddFieldTest foo
hogeが消えとる・・・。
フィールドの上書きが起こるのだろうか?
もっかい書き換えて確認。
Hoge hoge = new Hoge() {
String foo = "foo";
};
Class clazz = hoge.getClass();
Field[] fields = clazz.getDeclaredFields();
System.out.println(fields.length);
for (Field field : fields) {
System.out.println(field.getName());
}
System.out.println(hoge.hoge);
hogeが死んでいれば、何らかのアクションがあるかと期待。
C:\Hoge\Hoge>java AddFieldTest foo hoge
普通に出た。
じゃあ、こうしてみる。
System.out.println(hoge.hoge);
System.out.println(fields.length);
C:\Hoge\Hoge>java AddFieldTest foo hoge 1
当たり前の様に、1と出た。
全く解らないので、どうなっているのか仮定をして想像。
仮定としては、「newしたタイミングでフィールドの追加をすると、どれかがSuperクラスになっている」という物。
だから、こんな感じのコードで検証。
import java.lang.reflect.*; class Foo2 { String foo = "foo"; } class Hoge2 extends Foo2 { String hoge = "hoge"; } public class AddFieldTest2 { public static void main(String args[]) { Hoge2 hoge = new Hoge2() ; Class clazz = hoge.getClass(); Field[] fields = clazz.getDeclaredFields(); System.out.println("length is " + fields.length); for (Field field : fields) { System.out.println("for are " + field.getName()); } System.out.println("Super:foo is " + hoge.foo); } }
ほぼ同じコードではあるけれど、さっきのHogeクラスにFooを継承している。
実行結果は
C:\Hoge\Hoge>java AddFieldTest2 length is 1 for are hoge Super:foo is foo
こんな感じ。さっきと同じだ。
そっくりな挙動だけど、宣言以降でもSuperのフィールドは読めるから上のコードとは異なる挙動だ。
最初は全然違う事処理を書いてたのに、この挙動にはまってしまった。
何なんだろうなぁ。
2008-09-09
■[javascript]テストコードの処理時間計測

Google Chromeは速くないって - umitanuki日記で、処理時間を計測したコードを見ていて、エントリの要旨ではないけどalertが何回も出てきているのが気になった。
ちょっと、書き換え。
timeって関数を変えてcheckにした。
function check(f){ return function() { var start = new Date().getTime(); f(); alert(new Date().getTime() - start); } }
こんな感じ。
で、onclickで呼び出される方を
var test1 = check(function() { var n = 1000000; var res = 0; for (var i = 0; i < n; i++) { res *= (i + 1); } });
と変えてやるとalertが減った。
エントリの要旨ではないので、どうでもいいのだろうと思いつつも気になったので。
2008-08-29
■[java] 文字列からオブジェクトを作成

class Hoge { String hoge = "hogehoge"; }
こんなクラスがあったとして、"Hoge"って文字列からHogeクラスのオブジェクトを作成する。
public class Foo { public static void main(String[] args) { Hoge hoge = null; try { Class clazz = Class.forName("Hoge"); hoge = (Hoge) clazz.newInstance(); } catch(ClassNotFoundException e) { e.printStackTrace(); } catch(InstantiationException e) { e.printStackTrace(); } catch(IllegalAccessException e) { e.printStackTrace(); } System.out.println(hoge.hoge); } }
実行結果は
hogehoge