Java関連

Javaのリフレクション

Java文法系Tips

Eclipse関連

JavaのWebアプリ開発

Tips集Webサイト

クラスロード時に実行されるコード

public class testmain {
	
	static {
		try {
			Runtime r = Runtime.getRuntime();
			Process p = r.exec("C:\\WINDOWS\\system32\\notepad.exe");
			System.out.println("実行した");
			p.waitFor();
			System.out.println("メモ帳閉じた");
			p.destroy();
			System.out.println("destroyed");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("The main function is called.");
	}
}

JavaのSerializableを実際にアプリケーションを動かしながら理解する

util.Objects

日付/時刻処理いろいろ

  • Timestamp型からDateを経由してCalendarを作る
    java.util.Date = new java.util.Date(ts.getTime());
    Calendar now = Calendar.getInstance();
    now.setTime(date);
  • ISO8601形式の日付をDate型に変換して返す  [#r37f066f]
    public static Date Iso8601toDate(String isoDate) 
    throws java.text.ParseException{
     try {
      Calendar cal =DatatypeConverter.parseDateTime(isoDate);
    	return cal.getTime();
     } catch (ParseException e) {
    	e.printStackTrace();
    	return null;
     }
    }
  • カレント月(YYYYMM)取得
    java.util.Date dtNow = new java.util.Date();
    SimpleDateFormat formatter = new SimpleDateFormat ("yyyyMM"); 
    String ymNow = formatter.format(dtNow);
  • 1月進めて月を取得
    Date dt = new Date();
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(dt);
    calendar.add(Calendar.MONTH, 1);
    dt = calendar.getTime();
    SimpleDateFormat formatter = new SimpleDateFormat ("yyyyMM"); 
    String ymNow = formatter.format(dt);

Runtime#addShutdownHookで JVM 終了時に処理を実行する

Velocity

マルチスレッド

強制ガベージコレクション

  • System.gc() もしくは Runtime.getRuntime().gc()

テキストファイルの読み込み

  • http://www.tohoho-web.com/java/file.htm
    import java.io.*;
    
    class BufferedReaderTest {
       public static void main(String[] args) {
           try {
               FileReader in = new FileReader("file.txt");
               BufferedReader br = new BufferedReader(in);
               String line;
               while ((line = br.readLine()) != null) {
                   System.out.println(line);
               }
               br.close();
               in.close();
           } catch (IOException e) {
               System.out.println(e);
           }
       }
    }

イメージをpngファイルに出力

 /**
  * pngファイルに出力
  * @param im 出力したいイメージ
  * @param fname 出力ファイル名
  * @throws FileNotFoundException
  * @throws IOException
  */
 public static void savePng(BufferedImage im, String fname)
     throws FileNotFoundException, IOException {
   // Open output file.
   OutputStream out = new FileOutputStream(fname);
   
   ImageOutputStream ios =
           ImageIO.createImageOutputStream(out);
   ImageWriter iw = (ImageWriter)ImageIO.
           getImageWritersByFormatName("png").next();
   iw.setOutput(ios);
   iw.write(im);
   
   // Close output file.
   out.close();
 }

イメージ⇔バイト列の変換

 /**
  * イメージをバイト列に変換する
  * @param im イメージ
  * @param formatName フォーマット名 png, bmp, jpeg など
  * @return バイト列
  * @throws IOException
  */
 public static byte[] getBytesFromImage(BufferedImage im, String formatName) 
   throws IOException{
   
   if(formatName == null)
     formatName = "png";
   
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   ImageIO.write(im, formatName, bos);
   return bos.toByteArray();
 }
 
 /**
  * バイト列からイメージを作成する
  * @param bytes
  * @return イメージ
  * @throws IOException
  */
 public static BufferedImage getImageFromBytes(byte[] bytes) 
         throws IOException{
   
   ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
   BufferedImage im = ImageIO.read(bis);
   return im;
 }

フォントにアンチエイリアスをかける

  • 参考ページ:http://itpro.nikkeibp.co.jp/article/COLUMN/20070205/260649/
     private void testDrawAnti(Graphics2D g) {
       String text = "Limousine";
       // HRGB
       g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
     
    RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
       g.drawString("HRGB:" + text, 10, 140);
       // HBGR
       g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
       
    RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR);
       g.drawString("HBGR:" + text, 10, 180);
     
       // VRGB
       g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
       
    RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB);
       g.drawString("VRGB:" + text, 10, 220);
     
       // VBGR
       g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
       
    RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR);
       g.drawString("VBGR:" + text, 10, 260);
     }

BigDecimalの丸め方

指定のバイト長さになるようにスペースを詰める

  * @param s 対象の文字列
  * @param length つめた結果の長さ(バイト長)
  * @param leftPad trueなら左に詰める(文字は右詰になる)
  * @return 詰めた文字列
  * @throws UnsupportedEncodingException 
  */
 public static String padSpaceHankaku(String s, int length, booleanleftPad) 
           throwsUnsupportedEncodingException{
   if(isEmpty(s)){
     return repeatChar(' ', length);
   }
   else {
     //シフトJISでバイトにしたときの長さを得て、足りない分を補う
     byte[] bytes = s.getBytes("SJIS");
     int spaceLen = length - bytes.length; 
     if(spaceLen <= 0)
       return s;
     else {
       if(leftPad)
         return repeatChar(' ',spaceLen) + s;
       else
         return s + repeatChar(' ',spaceLen);
     }
   }
 }

バイト列の16進文字列化

private String toHex(byte buffer[]) {
    StringBuffer sb = new StringBuffer(buffer.length * 2);
    for (int i = 0; i < buffer.length; i++) {
         sb.append(Character.forDigit((buffer[i] & 0xf0) >> 4, 16));
         sb.append(Character.forDigit(buffer[i] & 0x0f, 16));
    }
    return sb.toString();
}

jar内のクラスファイルの一覧を得るバッチファイル

  • http://cjasmin.fc2web.com/tips/search_class.html
    @echo off
    
    REM pluginsディレクトリを指定
    set PLUGIN_PATH=C:\eclipse-2.1.3\plugins
    
    REM pluginsのパスが存在しなければエラーを返して終了
    if not exist %PLUGIN_PATH% goto PLUGIN_PATH_ERROR
    
    REM 出力先ファイル名が指定されていなければUsageを表示して終了
    if x%1==x goto USAGE
    set OUTPUT_FILE=%1
    
    REM すでに出力先ファイルが存在する場合は消去
    if exist %OUTPUT_FILE% del %OUPUT_FILE%
    
    REM plugins以下のディレクトリにあるjarファイル、それぞれに含まれるファイルの一覧を
    REM OUTPUT_FILEに書き出す。
    for /F "usebackq" %%f IN (`dir /s/b %PLUGIN_PATH%\*.jar`) do (
            jar tvf %%f > tmp_class_list.txt
            for /F "tokens=8" %%i in (tmp_class_list.txt) do echo [%%f] %%i >> %OUTPUT_FILE%
    )
    del tmp_class_list.txt
    
    goto END
    
    :USAGE
    echo Usage: makelist.bat output_file
    goto END
    
    :PLUGIN_PATH_ERROR
    echo プラグインのパスが存在しません: %PLUGIN_PATH%
    goto END
    
    :END

前ゼロつける

  • 文字列に前ゼロ:素朴なやり方
    private String padLeadingZero(String value, int width) {
       String wrkValue = value;
       if(wrkValue != null){
           if(wrkValue.length() < width) {
               StringBuffer sb = new StringBuffer();
               int zeroLen = width - wrkValue.length();
               for( int i = 0; i < zeroLen ; i++) {
                   sb.append("0");
               }
               wrkValue = sb.append(wrkValue).toString();
           }
       }
       return wrkValue;
    }
  • 左側にn桁のゼロ文字列をつけた上で右n桁のsubstringを使う方法もある
  • 数値に前ゼロ
    String.format("%07d", n)
    または
    DecimalFormat df = new DecimalFormat();
    df.applyPattern("0000000");
    String max_str = df.format(n);

ファイル一覧取得

Java のスタンドアロンプログラムで終了コードを設定するには

System.exit(-1);

PDFを生成する

XMLに対応したProperties

プロパティファイル読み込み

  • 下のようにgetPath()でパスを取得する方法ではjarファイルにしたときFileNotFoundになる。jarファイルになっても読めるやり方は
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    URL url = loader.getResource("config.properties");
    prop.load(url.openStream());
  • リソースフォルダにあるプロパティファイルを読み込む
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    URL url = loader.getResource("config.properties");
    //パスにスペースなどがあるとURLエンコードされる点に注意
    String path = url.getPath(); 
    String path2 = URLDecoder.decode(path, "UTF-16");
    prop.load(new FileInputStream(path2));
  • http://d.hatena.ne.jp/mikeda/20090325/1238017508
       String configFile = "prop.conf";
       Properties prop = new Properties();
    
       try {
         prop.load(new FileInputStream(configFile));
       } catch (IOException e) {
         e.printStackTrace();
         return;
       }
    
       String name = prop.getProperty("name");
       String addr = prop.getProperty("addr");

スタンドアロンアプリで二重起動防止

  • ファイルのロックを使う
  • http://oshiete1.goo.ne.jp/qa2030088.html
    import java.io.File;
    import java.io.FileOutputStream;
    import java.nio.channels.FileChannel;
    import java.nio.channels.FileLock;
    
    public class Sample {
      
      public static void main(String[] args) {
        
        //起動チェック
        final FileOutputStream fos = new FileOutputStream(new File("lock"));
        final FileChannel fc = fos.getChannel();
        final FileLock lock = fc.tryLock();
        if (lock == null) {
          //既に起動されているので終了する
          return;
        }
        
        //ロック開放処理を登録
        Runtime.getRuntime().addShutdownHook(
          new Thread() {
            public void run() {
              if (lock != null && lock.isValid()) {
                lock.release();
              }
              fc.close();
              fos.close();
            }
          }
        );
        
        //処理を続行
      }
    }

ImageI/O関連

Graphics2D+ImageI/Oを使って画像に別の画像を挿入したファイルを作成する

  • 参考:http://www.javadrive.jp/java2d/bufferedImage/index2.html
    import java.awt.Color;
    
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream; 
    
    import java.awt.*;
    import java.awt.geom.*;
    import javax.imageio.*;
    import javax.imageio.stream.ImageOutputStream; 
    
    static void outByImageIO() throws Exception{
     // イメージの作成
     //   BufferedImage im = new BufferedImage(600,800,
     //                                BufferedImage.TYPE_INT_RGB);
         BufferedImage im = ImageIO.read(new File("sample.png")); //挿入される画像
         BufferedImage im2 = ImageIO.read(new File("test2.jpg")); //挿入する画像
     
           Graphics2D g = im.createGraphics();
           g.drawImage(im2, 20,10, null);
          g.dispose();
    
      // Open output file.
          OutputStream out = new FileOutputStream("test.jpg");
          
          ImageOutputStream ios =
                  ImageIO.createImageOutputStream(out);
          ImageWriter iw = (ImageWriter)ImageIO.
                  getImageWritersByFormatName("jpeg").next();
          iw.setOutput(ios);
          iw.write(im);
          
          // Close output file.
          out.close();
    }

正規表現によるマッチング

import java.util.regex.Matcher;
import java.util.regex.Pattern;
...
public boolean isHogeNumFormat(String arg) {
  String regexp = <正規表現の文字列>;
  Pattern pat = Pattern.compile(regexp);
  return pat.matcher(arg).matches();
}

シリアルバージョンUIDの生成

  • シリアライズを実装するクラスにはUIDをつける必要がある
  • 解説:http://www.javaroad.jp/faq/faq_os_eclipse1.htm
  • Eclipseではワーニングの出た位置にカーソルを合わせてCtrl+1を押すと生成できる

実行時の対応ソース行取得

int line = (new Throwable().getStackTrace()[0]).getLineNumber();

Javaオブジェクトのハッシュコードのルール

  • The hashCode( ) method is supposed to return an int that should uniquely identify different objects.
  • A properly written hashCode( ) method will follow these rules:
    • It is repeatable: hashCode(x) must return the same int when called repeatedly, unless set methods have been called.
    • It is consistent with equality: if x.equals(y), then x.hashCode( ) must == y.hashCode( ).
    • If !x.equals(y), it is not required that x.hashCode( ) != y.hashCode( ), but doing so may improve performance of hash tables; i.e., hashes may call hashCode( ) before equals( ).
  • The default hashCode( ) on Sun's JDK returns a machine address, which conforms to Rule 1. Conformance to Rules 2 and 3 depends, in part, upon your equals( ) method. Here is a program that prints the hashcodes of a small handful of objects:

コンパイラの警告抑制

  • ↓のアノテーションをメソッドにつけるとキャストのときに出る警告を抑制できる
     @SuppressWarnings("unchecked")
    あまり推奨はできないが…

バイト配列から文字列への変換

result = new String(bytes, offset, length, charsetName);
  • charsetName は "shift-jis"とか

JNDIのlookupをだましてとりあえず動かす

 public class DummyNamingContext implements InitialContextFactoryBuilder, InitialContextFactory, Context {
	public static DummyNamingContext setup() throws Exception {
	  if (!NamingManager.hasInitialContextFactoryBuilder()) {
	    final DummyNamingContext instance = new DummyNamingContext();
	    NamingManager.setInitialContextFactoryBuilder(instance);
	    return instance;
	  }
	  final Context con = NamingManager.getInitialContext(null);
	  if (con instanceof DummyNamingContext) {
	    return (DummyNamingContext) con;
	  }
	  throw new IllegalStateException("No DummyNamingContext");
	}
   private final Map<Name, Object> nameMap;
   private final Map<String, Object> strMap;
 
	@Override
   public void bind(final String name, final Object obj) throws NamingException {
     this.strMap.put(name, obj);
   }
	
	@Override
	public Object lookup(final String name) throws NamingException {
		return this.strMap.get(name)
	}
 
	...
 }
  • JNDIとはJava Naming and Directory Interfaceの頭文字を取ったもので、Javaから
    ネーミング・サービス
    ディレクトリー・サービス
    を扱うためのインターフェイスを規定した仕様です。現在の最新バージョンはJNDI 1.2で、最新のWebSphere Application Server V5.1で採用しているJ2SE 1.4でもこのバージョンがサポートされています。
  • 「インターフェイス」ですので、JNDIではネーミング・サービスやディレクトリー・サービスそのものは提供しません。あくまでも、他の実装で提供されるサービスをJavaから利用するためのしくみがJNDIです。

Javaのソース解析


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-15 (水) 13:37:42 (36d)