→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();
}
}
}
可変個引数の例 †
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>のように書くことも可能で、そのときの動作は容易に想像できるかと思います。
日付/時刻処理いろいろ †
Cで言うmemsetに当たる処理 †
import java.util.*;
:
byte[] buf = new byte[200];
Arrays.fill(buf,0x20);
Runtime#addShutdownHookで JVM 終了時に処理を実行する †
Velocity †
マルチスレッド †
Eclipseからアプリを実行して、OutOfMemoryErrorが出たでござる †
強制ガベージコレクション †
- System.gc() もしくは Runtime.getRuntime().gc()
テキストファイルの読み込み †
イメージを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を使う方法もある
ファイル一覧取得 †
Java のスタンドアロンプログラムで終了コードを設定するには †
System.exit(-1);
PDFを生成する †
XMLに対応したProperties †
プロパティファイル読み込み †
スタンドアロンアプリで二重起動防止 †
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の生成 †
実行時の対応ソース行取得 †
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:
コンパイラの警告抑制 †
バイト配列から文字列への変換 †
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のソース解析 †