メイン

Java アーカイブ

2005年01月28日

エンコード指定でテキストファイルを読み込む

良く使うのでメモ

-------------------------------------------------------
  String filenm = "TESTFILE.txt";
  String enc    = "euc-jp";
  File file = new File(filenm);
  BufferedReader reader 
          = new BufferedReader(
                  new InputStreamReader(
                          new FileInputStream(file),enc));
  try {
      String line;
      while ((line = reader.readLine()) != null) {
          System.out.println(line);
      }
  }  finally  {
      reader.close();
  }

2004年07月21日

プロパティエディタ

Eclipse3.0でSolarEclipseが動作してくれず、JSPはともかくプロパティファイルの編集が面倒くさくて、「natic2asciiなんてやってられるか!もう英語で書いちゃうぞ!!」なんて思ってたんですが。
こんな良い物ありました。
プロパティエディタ for Eclipse3.0

いいです、これ。
ちょま吉様ありがとう


あとSubversion用のプラグインもEclipse3.0対応のものが出てます。
http://subclipse.tigris.org/

2004年02月06日

MagicPacket送信

"Wake on Lan"というリモートからPCを起動する機能を動作させるには マジックパケットと言われる物を送信する必要があります。

このマジックパケットというのは
 最初の6バイトが0xFFでそれ以降にMACアドレスを16回繰り返したもの
です。

MagicPacket作成サンプル
----ココカラ----
/**
 * マジックパケットとなるデータを生成します。
 * 
 * @param  MACアドレス 00-00-00-00-00-00 の形式
 * @return 生成されたデータ
 */
public byte[] makeMagicPacket(String mac){
  byte[] magicPacket = new byte[6 + 6*16];
  
  //MACアドレスを"-"で分割
  String[] macsep = mac.split("-");
  
  byte[] macByte = new byte[6];
  
  //分割したMACアドレスをバイト配列に代入
  for (int i = 0;i<macsep.length;i++){
    macByte[i] = (byte)Integer.parseInt(macsep[i],16);
  }
  
  //先頭の6バイトに0xffを設定
  for (int i = 0;i<6;i++) 
    magicPacket[i] = (byte)0xff;
  
  //その後にマックアドレスを16回繰り返す
  for (int i = 0;i<16;i++){
    for (int j = 0;j<6;j++){
      magicPacket[6 + i*6 + j] = macByte[j];
    }
  }
  
  //で、MagicPacket完成
  return magicPacket;
}
----ココマデ----

で上の関数で生成されたMagicPacketをUDPでブロードキャストすればOK
UDPで送信サンプル
----ココカラ----
import java.net.*;

//送信先ポート。何でも良いかも・・
int port = 7;
//環境に応じたブロードキャストアドレス
String broadAdr = "192.168.0.255"; 
//MACアドレス
String macaddress = "00-00-00-00-00-00";

InetAddress server = InetAddress.getByName(broadAdr);

byte[] data = makeMagicPacket(macaddress);

DatagramPacket packet
  = new DatagramPacket( data, data.length, server, port );

//送信
DatagramSocket socket = new DatagramSocket();
socket.send( packet );
----ココマデ----

こんな感じで他のPCを起動できます。

2004年01月28日

JAVAでNTサービス2

JavaServiceによるサービス化
サービス名: TESTService
実行JAR: C:\ServiceTest.jar
実行クラス名:TestService

ここからダウンロードします。
http://www.alexandriasc.com/software/JavaService/index.html

※2004/08/04追記
いつの間にか上記URLは消えてしまっています。
新URLはここのようです。
http://www.multiplanconsultants.com/software/javaservice/downloads.html
情報有難うございますm(__)m


サービスのインストール
JavaService.exe -install TESTService C:\j2sdk1.4.2_02\jre\bin\client\jvm.dll 
                -Djava.class.path=C:\ServiceTest.jar 
                -start TestService 
                -err C:\stderr.txt

サービスのアンインストール
JavaService.exe -uninstall TESTService


koyaneさんがドキュメントを日本語化されてます
http://www.geocities.jp/jkoyane/files/JavaService/documentation_ja.html

JAVAでNTサービス1

リソースキットがある場合は次のようにしてサービス化が可能です。
サービス名: TESTService
実行JAR: C:\ServiceTest.jar

手順1 instsrv.exeを使ってsrvany.exeをサービスとして登録する

  c:\NTReskit\instsrv TESTService c:\NTReskit\srvany.exe


手順2  srvany.exeが使用するパラメータをレジストリ設定する

    下記キーが存在するのを確認する
      "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TESTService"

     このキーの下に"Parameters"というキーを作成し2つの文字列を追加する

     TESTService
    └Parameters
       ・Application
       ・AppDirectory

      
     名前          値
      Application   "java -jar C:\ServiceTest.jar"
      AppDirectory "C:\"


以上でサービスとして起動します。


ちなみにアンインストールは
c:\NTReskit\instsrv TESTService Remove


捕捉
レジストリ
 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TESTService"
をファイルに書き出しておけば、再インストールは書き出したファイルをレジストリにマージすればOK
※レジストリ構造が変更になった場合に注意!

2004年01月27日

条件に一致するファイルの取得

1.フィルタクラスを作っておいて
(下記の例は正規表現でファイルをフィルタします)
import java.io.File;
import java.io.FileFilter;

/**
 * 正規表現を使用したファイルフィルタ 
 */
class RegexFileFilter implements FileFilter {
  private String filenameRegex = null;

  /**
   * コンストラクタ
   * @param regex フィルタに使用する正規表現フォーマット
   */     
  public  RegexFileFilter(String regex){
    filenameRegex = regex;
  }
      
  /**
   * 対象ファイル判定処理
   */
  public boolean accept(File pathname){
    return (pathname.isFile()
              && pathname.getName().matches(filenameRegex));
  }               

  public String getFilenameRegex(){
    return filenameRegex;
  }

  public void setFilenameRegex(String string){
    filenameRegex = string;
  }
}
2.ファイルのリストを取得
("C:\test"下にある"mat****.csv"というファイルを検索します)
File directory = new File("c:\\test");
String regex = "^[Mm][Aa][Tt].*\\.[Cc][Ss][Vv]$";
File[] files = directory.listFiles(new RegexFileFilter(regex));
for( int i = 0;i < files.length;i++){
    System.out.println(files[i].getName());
}

2004年01月06日

実行可能なJARファイル追記

以前メモってたJARの生成では内部のJARに対してクラスパスが通ってなかったことが発覚しました。
かなーり調べたんですけど分からなかった・・・
(sunのドキュメントにも載ってないもん)

で、結局参照するJARファイルは外部に出すことにしました。

-----------build.xml----------------
<?xml version="1.0" encoding="Shift_JIS"?>
<project name="importer" default="compile" basedir=".">
    
    <!--作成するJARファイル名-->
    <property name="jar_filename" value="Test.jar" />
    <!--実行するクラス名-->
    <property name="jar_mainclass" value="jp.co.matsystem.TestApl" />
    <!--JARに含める外部クラスパス-->
    <property name="jar_clspass" value="lib/commons-cli-1.0.jar lib/log4j-1.2.8.jar" />
    
    <!--JARファイル化-->
    <target name="archive" depends="compile">
        <delete file="${basedir}/${jar_filename}"/>
	<jar jarfile="${basedir}/${jar_filename}" >	  	
	    <fileset dir="${build}"
               excludes="lib,lib/*,**/*.java,build.xml,${jar_filename}"
    	    />	  		
	    <manifest>
	      <attribute name="Main-Class" value="${jar_mainclass}"/>
	      <attribute name="Class-Path" value="${jar_clspass}"/>
	    </manifest>
	</jar>
    </target>	
</project>
------------------------------------

で実行する時にTest.jarの保存先にlibってディレクトリを切って
その中に必要なjarファイルを保存しておけばOK
※普通はJREのlib/extにおいておけば良いです。
 アプリ毎にライブラリのバージョンを変えたい場合にこんな感じにするとOK

2003年12月24日

log4jってイイ!

って、今ごろ遅いって!?
だって知らなかったんだもん。

ま、とにかくjavaでログを出力するならlog4jですねー
すごい汎用的で高速、出力先をフレキシブルに変更できます。
ファイルや標準出力はもちろん、DBやNTイベントログ、さらにはメールの送信もできるみたいです。

-使い方メモ-

ここからlog4j-1.2.8.jarをダウンロードしてパスの通ってるところに配置
http://logging.apache.org/log4j/docs/index.html


log4j.propertiesというファイルをプロジェクトのルートに配置
(パスが通っていればイイって聞いたんですけど、ここじゃないと上手く動きませんでした)
※プロパティファイルを使わずにコードでも設定できるようです。
 ↓を参照
 http://www.hcn.zaq.ne.jp/no-ji/javamemo/org_apache_log4j.html

--log4j.propertiesの中身--
=========================ここから============================
# Log4J Configuration

log4j.rootCategory=DEBUG, file ,stdout

#stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c{1} - %m%n

#file
#DailyRolling
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=import.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd

log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d [%t] %-5p %c{1} - %m%n

=========================ここまで============================
(このプロパティだと標準出力とファイルの両方にログを出力します。)

実際に使うには

//インスタンスを取得して
Category logger = Category.getInstance(this.getClass().getName());

//書く
logger.debug("かきこかきこ");

結構簡単ですね


2004.02.20 追記
好きな名前のプロパティファイルを読み込みたい場合は

PropertyConfigurator.configure("xxxxxx.properties");

とすれば可能

2003年12月23日

Antで実行可能なJARファイルを作る

忘れない様にメモ

ディレクトリ構成
basedir
 ├lib  (参照するJARファイル)
 └jp
    └co
      └matsystem


-----------build.xml----------------

<project name="importer" default="archive" basedir=".">
    <!--ソースファイルのパス-->
    <property name="src" value="${basedir}" />
    <!--クラスファイルの作成先-->
    <property name="build" value="${basedir}" />
    
    <!--作成するJARファイル名-->
    <property name="jar_filename" value="Test.jar" />
    <!--実行するクラス名-->
    <property name="jar_mainclass" value="jp.co.matsystem.TestApl" />
    <!--JARに含めるクラスパス-->
    <property name="jar_clspass" value="lib/commons-cli-1.0.jar lib/log4j-1.2.8.jar" />
    	
    <!--JARファイル化-->
    <target name="archive">
        <jar jarfile="${basedir}/${jar_filename}" 
  		basedir="${build}"
  		excludes="*.java,build.xml,${jar_filename}"
  		>
          <manifest>
            <attribute name="Main-Class" value="${jar_mainclass}"/>
            <attribute name="Class-Path" value="${jar_clspass}"/>
          </manifest>
        </jar>
    </target>
</project>
------------------------------------