2004年09月08日(水)
- 加藤あいと鈴木杏樹がちょっと似てた。
■ [web] WebDAV
debian-users MLでジャストシステムのWebDAV解説ページが紹介されていたのでメモ。
■ [dev][java] Sun Enterprise Newsより
いくつかなんとなくメモ。要会員登録。
JFluid は、Sun の研究機関である Sun Labs にて開発されたツールです。もともとは実験的なプロジェクトでしたが、JFluid のプロファイリング機能の実現を望む声が多くありました。そのため現在、JFluidで提供されている機能がオープンソースの開発ツール Netbeans にて統合される予定となっています。
■ [windows] 「Port Reporter ツールの概要と入手方法」 (マイクロソフト)
Port Reporter ツールは Windows Server 2003、Windows XP、および Windows 2000 を実行しているコンピュータ上のサービスとして動作し、TCP ポートおよび UDP ポートの動作状況をログに記録します。
■ [tdiary] 「ReferrerSPAM」 (HSBT Hiki)
tDiaryでのReferer spam対策がまとめられている。tDiary-users-talk MLより。
■ [link] 「Perfect Suit FActory」
スーツを買えるオンラインストアがあったのでメモ。
アフィリエイトもやっているようだから広告表示してみようかな。でもおれのサイトから辿って洋服を買う人なんかいないか。
■ やること
- プリンタ処分
- リンク元のスリム化
- 蛍光灯の紐
2008年09月08日(月)
- 何もやる気にならず週末ずっとゴロゴロしてしまった。これはいかんよ。掃除しないと。
- 外出したとしても雷ゴロゴロで大変だったけどな。
- ずっと忙しい。才能なーい。
- ずっと健康だったが昨日から体調不良気味。最近暑かったり寒かったりするからなあ。
■ [java][net] JavaでIPv4とIPv6の判別
文字列で与えられたIPアドレスがIPv4なのかIPv6なのかを判別したいとき、Javaではどう書けばいいのか。
InetAddress#getByName()の戻り値をinstanceofでチェックする方法しか思いつかなかった。次のテストは成功したのでメモ。
import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import static org.junit.Assert.*; import org.junit.Test; public class InetAddressTest { @Test public void v4test() throws Exception { InetAddress address = InetAddress.getByName("192.0.2.10"); assertTrue(address instanceof Inet4Address); } @Test public void v6test() throws Exception { InetAddress address = InetAddress.getByName("2001:DB8::10"); assertTrue(address instanceof Inet6Address); } }
2009年09月08日(火)
2013年09月08日(日)
■ [java] java.util.PropertiesでWindowsのパス表記をエスケープせずに読み込みたい
問題点
Javaのプログラムで
path = C:\aaa\bbb bbb\あああ\ccc
とWindowsのパス表記で書いたファイルを次のコードのようにしてjava.util.Properties#load()を使って読み込むと、
C:aaabbb bbbあああccc
とバックスラッシュが削除されてしまう。
import java.io.IOException; import java.io.Reader; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Properties; public class PropertiesでのWindowsパス表記読込 { public static void main(String[] args) throws IOException { try (Reader r = Files.newBufferedReader( Paths.get("test.properties"), Charset.forName("UTF-8"))) { Properties p = new Properties(); p.load(r); System.out.println(p.getProperty("path")); } } }
こうなるのは、load()メソッドが
このメソッドは、無効なエスケープ文字の前のバックスラッシュ文字 \ をエラーとして処理しない。バックスラッシュは自動的に削除される。
という仕様だから。
この問題はパス区切りのバックスラッシュを2つ重ねて書くかバックスラッシュの代わりにスラッシュを使うようにすれば解決されるんだけど、この対処は面倒だ。そんなことせずにそのまま読み込みたい。
そもそもPropertiesクラスがバックスラッシュを特別扱いする機能って必要なのかな?なんでこんな仕様なんだっけ…
バックスラッシュを二重化するフィルタを挟んで対処してみる
バックスラッシュを特別扱いする機能は要らない(バックスラッシュは単にバックスラッシュとして解釈すればよい)ので、ファイル内の「\」を「\\」に変換するフィルタを作ってそれを挟んで読み込むようにしたらどうだろうか。
import java.io.FilterReader; import java.io.IOException; import java.io.Reader; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Properties; public class PropertiesでのWindowsパス表記読込2 { public static void main(String[] args) throws IOException { try (Reader r = new Backslash二重化フィルタ(Files.newBufferedReader( Paths.get("test.properties"), Charset.forName("UTF-8")))) { Properties p = new Properties(); p.load(r); System.out.println(p.getProperty("path")); } } } class Backslash二重化フィルタ extends FilterReader { private boolean inInBackslash = false; public Backslash二重化フィルタ(Reader r) { super(r); } @Override public int read() throws IOException { synchronized (lock) { return read1(); } } @Override public int read(char[] cbuf, int off, int len) throws IOException { if (len <= 0) return 0; int result = 0; synchronized (lock) { for (int i = 0; i < len; ++i) { int c = read1(); if (c < 0) break; cbuf[off + i] = (char)c; ++result; } } return result == 0 ? -1 : result; } @Override public long skip(long n) throws IOException { throw new IOException("not supported"); } @Override public boolean ready() throws IOException { return inInBackslash; } @Override public boolean markSupported() { return false; } @Override public void mark(int readAheadLimit) throws IOException { throw new IOException("not supported"); } @Override public void reset() throws IOException { throw new IOException("not supported"); } private int read1() throws IOException { if (inInBackslash) { inInBackslash = false; return '\\'; } int result = super.read(); if (result == '\\') inInBackslash = true; return result; } }
このプログラムを動かすと、
C:\aaa\bbb bbb\あああ\ccc
とファイルに書いた文字列がそのまま表示された。OKOK。
こういう対処は見かけないけれど、何か問題あるかな?