質問: inet.getHostName(); System.out.println("ホスト名:" + hostName); } } 上記の流れ1~6に書いた通りにソースコードを書いてみました。
回答: > > ◆.bakファイルを読み込むのにもっと最適な方法があれば教えてください。 > > > BufferedReader のままで良いと思います。ただしその際に、データを List に突っ込むかどうかで効率的かどうかが変わります。 ログが数万件あるかもしれませんが、ログで必要な箇所はその一部ですからね。 > > ◆Substring以外でIPアドレスを抜き出す方法があれば教えてください。 > > すべてがすべてXXX.XXX.XXX.XXXの形ではないのでSubstringだとズレが起きるのではと > > > コードを見る限り Substring でなく正規表現が使われていますね。 Java でこれをやるのであれば正規表現のままで良いかと思います。 ただ今の正規表現を見る限り行の先頭に IP アドレスがある様ですね。場合によっては先頭に日付が付く場合がありますが、そういった場合は一度トークンの区切り(例:カンマ)などで一旦 Substring してしまった方が正規表現で誤爆する事が少ないです。 > > ◆eclipseを使用しているのですが、上記の流れのプログラムって一つのjavaファイルに収まるのでしょうか?分けるとしたらどこをどう分ければよいのでしょうか。 > > > これからどの程度のコードを追加されるのか分かりませんが、質問に書かれている用途であればあと十数行程度ですから分けなくても良い(分けると逆に見通しが悪くなる)のではないでしょうか。 最後になりましたが、こういった処理で Java を使うのはあまりお勧めできません。 Java は起動するだけで何もしていなくても数十MBメモリを取られる処理系です。UNIX なのであればこれくらいはシェルコマンドで作られた方が良いのではないでしょうか。 追記 頑張ってる様子が見えたのでオマケあげます。 ``` import java.util.*; import java.net.*; import java.util.regex.*; public class IP { public static void main(String[] args) throws Exception { Set set = new LinkedHashSet(); Pattern p = Pattern.compile("^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"); Matcher m = p.matcher("192.168.1.2"); if (m.matches()) { set.add(m.group(0)); } for(String tmp : set){ System.out.println(tmp); System.out.println("ホスト名:" + InetAddress.getByName(tmp).getHostName()); } } } ```