Home > Java Archive
Java Archive
Java: インターフェースとローカルのIPv6, IPv4アドレスの取得 - NetworkInterfaceクラス
- 2010-05-16 (日)
- Java
下記のコードはネットワークインターフェース情報取得し、IPv6とIPv4のアドレスを取得、表示するサンプルコードです。
ソースコード
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
/**
* ネットワークインターフェースの取得
*/
public class InetAddressesInfo {
private HashMap<NetworkInterface, ArrayList<InetAddress>> interfaceMap;
public InetAddressesInfo() {
interfaceMap = new HashMap<NetworkInterface, ArrayList<InetAddress>>();
}
public void getInterfaces() {
interfaceMap.clear();
try {
Enumeration<NetworkInterface> interfaceList = NetworkInterface.getNetworkInterfaces();
if (interfaceList == null) {
System.out.println("Message: No interfaces found");
} else {
while (interfaceList.hasMoreElements()) {
NetworkInterface iface = interfaceList.nextElement();
Enumeration<InetAddress> addrList = iface.getInetAddresses();
if (!addrList.hasMoreElements()) continue;
ArrayList<InetAddress> iaddress = new ArrayList<InetAddress>();
while (addrList.hasMoreElements())
iaddress.add(addrList.nextElement());
interfaceMap.put(iface, iaddress);
}
}
} catch (SocketException se) {
System.out.println("Error getting network interfaces: " + se.getMessage());
}
}
public void show() {
for (NetworkInterface n : interfaceMap.keySet()) {
System.out.println("Interface " + n.getName() + ": ");
for (InetAddress a : interfaceMap.get(n)) {
System.out.print("\tAddress " + ((a instanceof Inet4Address ? "(IPv4)"
: (a instanceof Inet6Address ? "(IPv6)" : "(?)"))));
System.out.println(": " + a.getHostAddress());
}
}
}
public HashMap<NetworkInterface, ArrayList<InetAddress>> getInterfaceMap() {
return interfaceMap;
}
public void setInterfaceMap(
HashMap<NetworkInterface, ArrayList<InetAddress>> interfaceMap) {
this.interfaceMap = interfaceMap;
}
public static void main(String[] args) {
InetAddressesInfo i = new InetAddressesInfo();
i.getInterfaces();
i.show();
}
}
実行結果
Interface lo: Address (IPv6): 0:0:0:0:0:0:0:1 Address (IPv4): 127.0.0.1 Interface net4: Address (IPv6): fe80:0:0:0:0:5efe:c0a8:10a%12 Interface net5: Address (IPv6): 2001:0:4137:9e76:8ae:1cf7:3f57:fef5 Address (IPv6): fe80:0:0:0:8ae:1cf7:3f57:fef5%13 Interface eth3: Address (IPv6): 2001:c90:33d:21d4:919c:836b:2d1a:cf33 Address (IPv6): 2001:c90:33d:21d4:8856:aef1:d0bd:db64 Address (IPv6): fe80:0:0:0:919c:836b:2d1a:cf33%11 Address (IPv4): 192.168.1.10
ドキュメント
- Comments: 0
- Trackbacks: 0
Java: ServletからJSPへリクエストをフォワード
- 2010-03-26 (金)
- Java
目的
Servletで処理した結果をJSPファイルに転送し、HTMLを生成する。これによって、MVCモデルにおけるViewの分離ができる。
方法
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
ArrayList<String[]> table = new ArrayList<String[]>(); // 転送データ
<中略>
req.setAttribute("table", table);
req.getRequestDispatcher("jsp/view.jsp").forward(req, res);
上記のServletコード上のtableという変数をview.jspに渡したす場合、HttpServletRequest #setAttributeで変数を登録し、getRequestDispatcherとforwardでリクエストをフォワードする。
JSP側で登録した変数を取り出すには、下記のコードを用いる。
<% ArrayList<String[]> table = (ArrayList<String[]>)request.getAttribute("table"); %>
- Comments: 0
- Trackbacks: 0
Java: 形態素解析Senをインストール(Windows編)
- 2010-03-25 (木)
- Java
ダウンロードするソフト
1.ActivePerl(ActivePerl, Download Perl for Windows, Mac, Linux, AIX, HP-UX & Solaris)
2.Apache Ant(Apache Ant - Binary Distributions)
3.Sen(sen: ドキュメント & ファイル: release)
ActivePerlはインストーラーに従いインストールする。
ダウンロードしたAntとSenはC:\work以下に解凍し、フォルダ名をそれぞれapache-ant、senとリネームする。
環境変数の設定
PATH(追加) C:\work\apache-ant\bin;
ANT_HOME C:\work\apache-ant
SEN_HOME C:\work\sen
JAVA_HOME C:\Sun\SDK\jdk
この後、上記の環境変数が適応されているか下記のコマンドを用いて確認する。
C:\>echo %ANT_HOME% C:\work\apache-ant (←OK、パスが適応されている)
適応されていなければ再起動する。
辞書のインストール方法
カレントディレクトリをdicに設定後、辞書をインストールする。
C:\>cd work/sen/dic (←カレントディレクトリを移動) C:\work\sen\dic>ant -Dperl.bin=C:\Perl\bin\perl.exe (←辞書のインストール) Buildfile: C:\work\sen\dic\build.xml <中略> BUILD SUCCESSFUL Total time: 1 minute 2 seconds C:\work\sen\dic>
動作確認
%SEN_HOME%\sen.batをダブルクリックする。
C:\work\sen\bin>rem set classpath C:\work\sen\bin>SET CLASSPATH=C:\work\sen\lib\sen.jar C:\work\sen\bin>SET CLASSPATH=C:\work\sen\lib\sen.jar;C:\work\sen\lib\commons-logging.jar done. Please input Japanese sentence: 2010/03/25 0:29:44 net.java.sen.Dictionary情報: token file = C:\work\sen\dic/token.sen 2010/03/25 0:29:44 net.java.sen.Dictionary 情報: time to load posInfo file = 16[ms] 2010/03/25 0:29:44 net.java.sen.Dictionary 情報: double array trie dictionary = C:\work\sen\dic/da.sen 2010/03/25 0:29:44 net.java.sen.util.DoubleArrayTrie load 情報: loading double array trie dict = C:\work\sen\dic/da.sen 2010/03/25 0:29:45 net.java.sen.util.DoubleArrayTrie load 情報: loaded time = 0.453[ms] 2010/03/25 0:29:45 net.java.sen.Dictionary 情報: pos info file = C:\work\sen\dic/posInfo.sen 2010/03/25 0:29:45 net.java.sen.Dictionary 情報: time to load pos info file = 0[ms] 2010/03/25 0:29:45 net.java.sen.Tokenizer loadConnectCost 情報: connection file = C:\work\sen\dic\matrix.sen 2010/03/25 0:29:45 net.java.sen.Tokenizer loadConnectCost 情報: time to load connect cost file = 141[ms] hello hello (hello) 未知語(0,5,5) null null こんにちは こんにちは (こんにちは) 感動詞(0,5,5) コンニチハ コンニチワ
- Comments: 0
- Trackbacks: 1
Java, Servlet: No suitable driver found for "~" の原因と解決法
- 2010-03-24 (水)
- Java
事象 - NullPointerException on java.sql.Connection
JDBCを用いてServletからMySQLのテーブルへアクセスする過程で、DriverManager.getConnectionメソッドの呼び出しの後、NullPointerExceptionが送出された(アプリケーション・サーバーはTomcat)。
<前略>
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("<SQL文>");
<後略>
原因 - No suitable driver found for "~"
デバックトレースを行ったところ、No suitable driver found for "~"というメッセージが出力されていた。JDBC Driver のクラスパスを設定していなかった為、今回のエラーが発生した。
対策 - JDBC Driverのクラスパス設定
JDBC Driver ファイル(.jar)をクラスパスに追加する。Eclipse上での設定方法は「実行」→「実行の構成」から「クラスパス」タブ内の「ユーザー・エントリー」を選択、「外部JARの追加」ボタンから、Driverを設定する。
雑感
ありがちー、なミスをしてしまったー。
- Comments: 0
- Trackbacks: 0
Java: OR論理演算子の評価条件
- 2009-05-24 (日)
- Java
以前、OR演算の2つのオペランドが両方評価されるか否かがあやふやだったので以下のコードを以て改めて確認してみます。
public class Sample1 {
public static void main(String[] args) {
int i = 5, j = 10, k =15;
if ((i++ < j) | (k-- > j))
System.out.println("values of i: " + i + " values of k: " + k);
if ((i < j) || (--k > j))
System.out.println("values of k: " + k);
}
}
実行結果は
values of i: 6 values of k: 14 values of k: 14
となります。
1つめのif文で使われている演算子はビット論理OR演算子で左右の両オペランドを評価します。よって式i++とk--が評価されているため結果はvalues of i: 6 values of k: 14となります。
2つめのif文で使われているのは短絡論理OR演算子で、評価順序は||の左側のオペランドを先ず評価し、それがtrueなら右側は評価せず(ORは片方が真ならもう片方の結果にかかわらず真ですから)、falseなら評価します。よって、if ((i < j) || (--k > j))ではi < jがtrueとなるため--k > jは評価されずkはデクリメントされません。よってkの値は変わらず、上記のような実行結果となります。
- Comments: 0
- Trackbacks: 0
Home > Java Archive
