- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2023-06-30T11:13:20+09:00","default:irrp","irrp")
[[Java関連Tips]]
#author("2023-06-30T11:13:40+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]
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
-JNDIとはJava Naming and Directory Interfaceの頭文字を取ったもので、Javaから
ネーミング・サービス
ディレクトリー・サービス
を扱うためのインターフェイスを規定した仕様です。現在の最新バージョンはJNDI 1.2で、最新のWebSphere Application Server V5.1で採用しているJ2SE 1.4でもこのバージョンがサポートされています。
-「インターフェイス」ですので、JNDIではネーミング・サービスやディレクトリー・サービスそのものは提供しません。あくまでも、他の実装で提供されるサービスをJavaから利用するためのしくみがJNDIです。
*正規表現によるマッチング [#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();
}