#author("2023-10-10T15:30:58+09:00","default:irrp","irrp")
#author("2023-12-19T12:03:59+09:00","default:irrp","irrp")
→Java関連Tips


#contents



* クラスロード時に実行されるコード [#f0a1dfe2]
 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.");
	}
 }


*テキストファイルの読み込み [#l0820c18]
-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ファイルに出力 [#ua836eae]
  /**
   * 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();
  }


*イメージ⇔バイト列の変換 [#hb7b4c52]
  /**
   * イメージをバイト列に変換する
   * @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;
  }


*フォントにアンチエイリアスをかける [#f73a05c7]
-参考ページ: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);
  }


* 指定のバイト長さになるようにスペースを詰める [#ba6ea65c]
   * @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進文字列化 [#tfd6e3a0]
-[[Javaで整数型やbyte配列と16進表記の文字列との間の変換を行なう - エキサイト TechBlog.>https://tech.excite.co.jp/entry/2023/12/19/063000]] 2023.12

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


*前ゼロつける [#h1d74b71]
-文字列に前ゼロ:素朴なやり方
 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);


*プロパティファイル読み込み [#zea80fc5]
-下のようにgetPath()でパスを取得する方法ではjarファイルにしたときFileNotFoundになる。jarファイルになっても読めるやり方は
 ClassLoader loader = Thread.currentThread().getContextClassLoader();
 URL url = loader.getResource("config.properties");
 prop.load(url.openStream());

-参考:[[jarファイルをエクスポートしたときファイルを開けなくなる>http://d.hatena.ne.jp/g-wong/20080710/1215695631]]

-リソースフォルダにあるプロパティファイルを読み込む
 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");


*スタンドアロンアプリで二重起動防止 [#qd1f8983]
-ファイルのロックを使う
-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関連 [#fc0337dc]
-[[ImageI/O APIガイド>http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/guide/imageio/index.html]]
--http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/guide/imageio/spec/imageio_guideTOC.fm.html

-[[ImageI/O 説明>http://www.javainthebox.net/laboratory/JDK1.4/Graphics/ImageIO/ImageIO.html]]

-[[ImageI/Oファイルで画像ファイルを読み書きする>http://www.javadrive.jp/java2d/bufferedImage/index2.html]]

-[[Graphics2Dによる描画>http://codezine.jp/article/detail/1021?p=1]]


**Graphics2D+ImageI/Oを使って画像に別の画像を挿入したファイルを作成する [#k86aad8b]
-参考: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();
 }


*JNDIのlookupをだましてとりあえず動かす [#bd15b3d3]
  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とは?JDBCとの違いやメリット・デメリットについてもご紹介 &#8211; Rainbow Engine>https://rainbow-engine.com/jndi-jdbc-difference/]] 2021
-[[【Java】Java初心者の鬼門とも言えるJNDIとは?【How To】 | おにぎりまとめ>https://matome.eternalcollegest.com/post-2139087889060693301]] 2021
-[[JNDIを使ったデータベース接続設定のXMLファイル定義 - Qiita>https://qiita.com/zaki-lknr/items/2bd955df62d4de0528ac]] 2019

-JNDIとはJava Naming and Directory Interfaceの頭文字を取ったもので、Javaから
 ネーミング・サービス
 ディレクトリー・サービス
を扱うためのインターフェイスを規定した仕様です。現在の最新バージョンはJNDI 1.2で、最新のWebSphere Application Server V5.1で採用しているJ2SE 1.4でもこのバージョンがサポートされています。
-「インターフェイス」ですので、JNDIではネーミング・サービスやディレクトリー・サービスそのものは提供しません。あくまでも、他の実装で提供されるサービスをJavaから利用するためのしくみがJNDIです。

-[[JNDIメモ(Hishidama's JNDI(Java Naming and Directory Interface) Memo)>http://www.ne.jp/asahi/hishidama/home/tech/java/j2ee/jndi.html]]


*正規表現によるマッチング [#t445ef73]
 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();
 }

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS