#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との違いやメリット・デメリットについてもご紹介 – 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(); }