Java関連

Javaのリフレクション

Eclipse関連

JavaのWebアプリ開発

Tips集Webサイト

文法系Tips

ストリームAPI

Optional型

例外処理

ラムダ式

static初期化子とインスタンス初期化子

  • http://www.genzou.sakura.ne.jp/class/inisharaiza_shokikasi.html
    // static初期化子の例
    public class MyTest {
    
          static int[] hoge;
          static {
                  hoge = new int[5];
                  for( int i = 0; i < 5; i++ ){
                          hoge[i] = i;
                  }
          }
    
    
          public static void main(String[] args){
    
                  for( int i = 0; i <hoge.length; i++) {
                          System.out.print(MyTest.hoge[i] + ",");
                  }
          }
    }
    
    // インスタンス初期化子の例
    public class MyTest {
    
          static int[] hoge;
          {
                  hoge = new int[5];
                  for( int i = 0; i < 5; i++ ){
                          hoge[i] = i;
                  }
          }
    
          public static void main(String[] args){
    
                  try {
                          MyTest m = new MyTest(); // インスタンス初期化子にはこれが必要
    
                          for( int i = 0; i <hoge.length; i++) {
                                  System.out.print(MyTest.hoge[i] + ",");
                          }
                  } catch( Exception e ) {
                          System.out.print("例外発生:" + e.toString()  );
                          e.printStackTrace();
                  }
          }
    }
  • ArrayListを定義すると同時に初期化するサンプル
    ArrayList<HogeEnum> list = new ArrayList<HogeEnum>() {
          { add(HogeEnum.A); }
          { add(HogeEnum.B); }
          { add(HogeEnum.C); }
    };

可変個引数の例

int sum(Integer... values){
  int sum = 0;
  for(int val : values){
    sum += val;
  }
  return sum;
}
//呼び出し側
int sum = sum(1,2,3,4,5);

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

util.Objects

ジェネリクス関連

Genericsのワイルドカードを使いこなす

リストを渡してリストを返すようなメソッドでジェネリックを使ってキャストしなくてもいいようにする

public <T> List<T> hoge( List<T> list)
  • http://www.eeb.co.jp/2007/11/_25.html
    • 戻り値であるList<T>の前に、<T>という型変数が宣言されていることに注目してください。このように書くことにより、メソッド宣言時に具体的な要素の型を指定せずにメソッドが宣言できるのです。
    • 型変数を<T extends Number>のように書くことも可能で、そのときの動作は容易に想像できるかと思います。

日付/時刻処理いろいろ

  • 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);

Cで言うmemsetに当たる処理

import java.util.*;
 :
byte[] buf = new byte[200];
Arrays.fill(buf,0x20);

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

Velocity

マルチスレッド

Eclipseからアプリを実行して、OutOfMemoryErrorが出たでござる

  • http://d.hatena.ne.jp/dkfj/20090626/1245983960
  • 実行->Javaアプリケーションをする前に、Open実行Dialogで設定画面を開きArguments VM arguments:で、-Xmx256mといった感じで適当なサイズのメモリを割り当てれば問題解決です。

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

  • 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内のクラスファイルの一覧を得るバッチファイル

前ゼロつける

  • 文字列に前ゼロ:素朴なやり方
    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)
	}
 
	...
 }

Javaのソース解析


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-07-29 (木) 18:21:34 (55d)