■Java 8 | Top |
1.開発環境の構築
2.実行環境の構築
3.文字列
4.数値
5.配列
8.列挙型
9.Mathクラス
11.日付
12.for
13.クラス
14.メソッド
15.注釈
16.プロパティファイル
18.ファイル操作
開発環境の構築
Javaの開発環境を構築する。ここではIDEのひとつであるEclipseを使用する。まずはEclipseの実行ファイルをダウンロードする。 2016/7/8時点で最新版は Eclipse 4.6 Neon となっている。Javaの場合は日本語プラグインが All in One となっているので、それをダウンロードする。
次にダウンロードした圧縮ファイルを解凍するわけだが、そのまま解凍すると途中でパスが長すぎますとか言われてエラーになる場合がある。 その場合は圧縮ファイル名を短くし、圧縮ファイルをDドライブ直下などにおいてパスが長くならないようにしてから再度解凍する。
解凍が終了したら eclipse.exe を実行すれば Eclipse が日本語化されて起動する。
実行環境の構築
Javaの実行環境を構築する。Javaの実行ファイルはclassまたはjarファイルとなるがexeファイルのようにダブルクリックしても実行されない。 コマンドプロンプトからjava.exeを指定して( VM経由で )実行することになる。java.exeがあるディレクトリにcdコマンドで移動してから-classpathオプションに classファイルが置いてあるパスを指定しても実行できるが、毎回チェンジディレクトリするのは面倒なのでjava.exeのパスを環境変数に設定することにする。 これには、システム環境変数のPathにjava.exeが置いてあるパスを追加設定するだけなのだが、一点注意があって、下記のようにパスの最後に必ず\をつけるようにすること。
D:\eclipse-java\pleiades\java\8\bin\;
そうしないと正しくパスを認識してくれないというステキ仕様。
設定が完了したら下記のようなコマンドを使用して実行できる。
java -classpath "D:\Sample\java\eclipse\myProject\bin" sample.HalloWorldApp
実行するファイル名はパッケージ名を指定している場合は( ここではsample )パッケージ名.main関数があるクラス名の拡張子なしとなる。 デフォルトパッケージの場合は、パッケージ名不要
文字列型の宣言
Stringを使用する 宣言と同時に初期化可能。
String str = "あ";
文字列長
現在の文字列内の文字数を取得する。
String str = "abc"; int cnt1 = str.length(); // 3 String str2 = "あいう"; int cnt2 = str2.length(); // 3
リファレンス:Oracle
文字コードを指定してバイト単位で桁数を取得する。
String str3 = "あいう"; int cnt3 = 0; try { // try で囲まないとコンパイルエラーになる。 cnt3 = str3.getBytes("Shift_JIS").length; // 6 } catch (java.io.UnsupportedEncodingException e) { }
リファレンス:Oracle
文字列の連結
+ で連結する
String str = "abc" + "def"; // abcdef
指定した文字列配列の要素のメンバーを連結する。各要素の間には、指定した区切り文字が挿入される。
String[] str = { "abc", "def", "ghi" }; String str1 = String.join( ",", str ); // "abc,def,ghi"
リファレンス:Oracle
文字列の分割
現在の文字列を、指定された正規表現に一致する位置で分割する。
区切り文字が見つからない場合は元の文字列を返す。
String str = "abc def.ghi.jkl"; // .は正規表現上では"\n"を除く任意の 1 文字を示すため.で分割する場合は\\.とする必要がある String[] arr = str.split("\\."); // "abc def"、"ghi"、"jkl" // 文字が見つからない場合 String[] arr1 = str.split("w"); // "abc def.ghi.jkl"
リファレンス:Oracle
文字列の置換
現在の文字列内にあるすべての oldChar を newChar に置換した結果生成される、新しい文字列を返す。
String str = "abc/def/abc/def"; String str2 = str.replace('d', 'D'); // "abc/Def/abc/Def" String str3 = str.replace("def", "DEF"); // "abc/DEF/abc/DEF" // 文字列が見つからない場合 String str4 = str.replace("xyz", "XYZ"); // "abc/def/abc/def"
リファレンス:Oracle
指定された正規表現に一致する、この文字列の最初の部分文字列に対し、指定された置換を実行する。
String str = "123/def/456/def"; String str3 = str.replaceFirst("[0-9]", "x"); // "x23/def/456/def" // 文字列が見つからない場合 String str4 = str.replaceFirst("\\.", "x"); // "123/def/456/def"
リファレンス:Oracle
指定された正規表現に一致する、この文字列の各部分文字列に対し、指定された置換を実行する。
String str = "123/def/456/def"; String str3 = str.replaceAll("[0-9]", "x"); // "xxx/def/xxx/def" // 文字列が見つからない場合 String str4 = str.replaceAll("\\.", "x"); // "123/def/456/def"
リファレンス:Oracle
文字列の挿入
文字列の削除
部分文字列の取得
指定されたインデックス位置( 0開始 )にある char 値を返す。 なお引数値に文字列の範囲を超えるような値を指定した場合は例外が発生するので注意すること。
String str = "abc/def/abc/def"; char str1 = str.charAt(5); // "e" char str2 = str.charAt(20); // 例外発生!!
リファレンス:Oracle
現在の文字列の部分文字列である新しい文字列を返す。 なお引数値に文字列の範囲を超えるような値を指定した場合は例外が発生するので注意すること。
String str = "abあ/def/abc/def"; // 文字列中の指定した文字の位置( 0開始 )で開始し、文字列の末尾まで続く。 String str1 = str.substring(5); // "ef/abc/def" // 指定された文字の位置( 0開始 )から始まり、インデックス endIndex - 1 にある文字までを返す。 String str2 = str.substring(2, 3); // "あ" String str3 = str.substring(20); // 例外発生!! String str4 = str.substring(0, 20); // 例外発生!!
リファレンス:Oracle
文字列比較
文字列のようなオブジェクト型の場合 == で比較してはいけない。
例に示すようにインスタンスを作成したオブジェクトと比較する場合、アドレスの比較となり常にfalseとなるためである。
よってオブジェクトの内容を比較する場合は equals メソッドを使用すること。なおequals メソッドは、大文字小文字区別して比較する。
String str = new String("abc def/ghe."); // インスタンスを作成する if( "abc".equals( str ) ) { System.out.println("abc -> 一致"); } else { System.out.println("abc -> 不一致"); } if ("abc def/ghe.".equals( str) ) { System.out.println("abc def/ghe. -> 一致"); } else { System.out.println("abc def/ghe. -> 不一致"); } if ("Abc def/ghe.".equals( str) ) { System.out.println("abc def/ghe. -> 一致"); } else { System.out.println("abc def/ghe. -> 不一致"); } // abc -> 不一致 // abc def/ghe. -> 一致( == で比較した場合不一致となる ) // Abc def/ghe. -> 不一致
リファレンス:Oracle
大文字小文字区別しないで文字列比較する。
String str = new String("abc def/ghe."); // インスタンスを作成する if( "abc".equalsIgnoreCase( str ) ) { System.out.println("abc -> 一致"); } else { System.out.println("abc -> 不一致"); } if ("abc def/ghe.".equalsIgnoreCase( str) ) { System.out.println("abc def/ghe. -> 一致"); } else { System.out.println("abc def/ghe. -> 不一致"); } if ("Abc def/ghe.".equalsIgnoreCase( str) ) { System.out.println("abc def/ghe. -> 一致"); } else { System.out.println("abc def/ghe. -> 不一致"); } // abc -> 不一致 // abc def/ghe. -> 一致 // Abc def/ghe. -> 一致
リファレンス:Oracle
文字列検索
現在の文字列に指定した文字または文字列が含まれているかの判定結果をboolean型で返す。 大文字小文字区別して判定する。
String str = new String( "abc def/ghe." ); if (str.contains( "def" ) ) { System.out.println("def -> 見つかった"); } else { System.out.println("def -> 見つからない"); } if (str.contains("DEF")) { System.out.println("DEF -> 見つかった"); } else { System.out.println("DEF -> 見つからない"); } // def -> 見つかった // DEF -> 見つからない
リファレンス:Oracle
現在の文字列の先頭が、指定した文字列と一致するかの判定結果をboolean型で返す。 大文字小文字区別して判定する。
String str = new String( "abc def/ghe." ); if( str.startsWith( "abc" ) ) { System.out.println( "abc -> 見つかった" ); } else { System.out.println( "abc -> 見つからない" ); } if( str.startsWith( "ghe." ) ) { System.out.println( "ghe. -> 見つかった" ); } else { System.out.println( "ghe. -> 見つからない" ); } if( str.startsWith( "ABC" ) ) { System.out.println( "ABC -> 見つかった" ); } else { System.out.println( "ABC -> 見つからない" ); } // abc -> 見つかった // ghe. -> 見つからない // ABC -> 見つからない
リファレンス:Oracle
現在の文字列の末尾が、指定した文字列と一致するかの判定結果をboolean型で返す。 大文字小文字区別して判定する。
String str = new String( "abc def/ghe" ); if( str.endsWith( "abc" ) ) { System.out.println( "abc -> 見つかった" ); } else { System.out.println( "abc -> 見つからない" ); } if( str.endsWith( "ghe" ) ) { System.out.println( "ghe -> 見つかった" ); } else { System.out.println( "ghe -> 見つからない" ); } if( str.endsWith( "GHE" ) ) { System.out.println( "GHE -> 見つかった" ); } else { System.out.println( "GHE -> 見つからない" ); } // abc -> 見つからない // ghe -> 見つかった // GHE -> 見つからない
リファレンス:Oracle
現在の文字列内で最初に出現する Unicode 文字または文字列の 0 から始まるインデックスを返す。 現在の文字列内で文字または文字列が見つからない場合、このメソッドは -1 を返す。 大文字小文字区別して判定する。
String str = "abcd efgh/abcd:abcd"; int index1 = str.indexOf( 'b' ); // 1 int index2 = str.indexOf( 'B' ); // -1 int index3 = str.indexOf( "cd" ); // 2 int index4 = str.indexOf( "CD" ); // -1 // 指定したインデックス以降の文字列内で検索する int index5 = str.indexOf( 'b', 11 ); // 11 int index6 = str.indexOf( "cd", 12 ); // 12 int index7 = str.indexOf( "ab", 17 ); // -1 int index8 = str.indexOf( "cd", 20 ); // -1( 例外にはならない )
リファレンス:Oracle
リファレンス:Oracle
現在の文字列内で、指定された文字が最後に出現する位置のインデックスを返す。指定したインデックスから先頭方向の範囲内で検索する。値が見つけられない場合、-1 を返す。 大文字小文字区別して判定する。
String str = "abcd efgh/abcd:abcd"; int index1 = str.lastIndexOf( 'b' ); // 16 int index2 = str.lastIndexOf( 'B' ); // -1 int index3 = str.lastIndexOf( "cd" ); // 17 int index4 = str.lastIndexOf( "CD" ); // -1 // 指定した インデックス 以前の文字列内で検索する int index5 = str.lastIndexOf( 'b', 11 ); // 11 int index6 = str.lastIndexOf( "cd", 12 ); // 12 int index7 = str.lastIndexOf( "cd", 11 ); // 2 int index8 = str.lastIndexOf( "cd", 1 ); // -1 int index9 = str.lastIndexOf( "cd", -1 ); // -1( 例外にはならない )
リファレンス:Oracle
リファレンス:Oracle
大文字変換
現在の文字列のコピーを大文字に変換して返す。
String str = "ABC def/あいう."; String str1 = str.toUpperCase(); // "ABC DEF/あいう."
リファレンス:Oracle
小文字変換
現在の文字列のコピーを小文字に変換して返す。
String str = "ABC def/あいう."; String str1 = str.toLowerCase(); // "abc def/あいう."
リファレンス:Oracle
全角文字変換
半角文字変換
先頭および末尾のスペースの削除
先頭と最後の空白を省略した文字列のコピーを返す。
String str = " abc def/ghe.アイウエオ "; String str1 = str.trim(); // "abc def/ghe.アイウエオ"
リファレンス:Oracle
文字列の大小判定
2 つの文字列を辞書的に比較する。比較は文字列内のそれぞれの文字の Unicode 値に基づいて行われる。
String str1 = "abc"; String str2 = "def"; String str3 = "ABC"; if( str1.compareTo(str2) > 0 ) { System.out.println( "str1 > str2" ); } else if( str1.compareTo(str2) < 0 ) { System.out.println( "str1 < str2" ); } else { System.out.println( "str1 = str2" ); } if( str1.compareTo( str3 ) > 0 ) { System.out.println( "str1 > str3" ); } else if( str1.compareTo( str3 ) < 0 ) { System.out.println( "str1 < str3" ); } else { System.out.println( "str1 = str3" ); } // "str1 < str2" // "str1 > str3"
リファレンス:Oracle
大文字と小文字の区別なしで、2 つの文字列を辞書的に比較する。
String str1 = "abc"; String str2 = "def"; String str3 = "ABC"; if( str1.compareToIgnoreCase(str2) > 0 ) { System.out.println( "str1 > str2" ); } else if( str1.compareToIgnoreCase(str2) < 0 ) { System.out.println( "str1 < str2" ); } else { System.out.println( "str1 = str2" ); } if( str1.compareToIgnoreCase( str3 ) > 0 ) { System.out.println( "str1 > str3" ); } else if( str1.compareToIgnoreCase( str3 ) < 0 ) { System.out.println( "str1 < str3" ); } else { System.out.println( "str1 = str3" ); } // "str1 < str2" // "str1 = str3"
リファレンス:Oracle
パディング
文字列型へ変換
引数の数値型を文字列に変換して返す。
int m1 = 123; String str1 = String.valueOf( m1 ); // "123" float m2 = 456.789f; String str2 = String.valueOf( m2 ); // "456.789"
リファレンス:Oracle
リファレンス:Oracle
書式変換
指定された書式の文字列と引数を使って、書式付き文字列を返す。 第1引数は形式を指定し、第2引数以降に挿入するオブジェクトを指定する。
10進数整数 + $ で使用する引数のインデックスを示す。例えば 1$ の場合は 第2引数値を意味する。
String str = "abc"; int a = 123; float b = 456.789f; int c = 0xA9; String str1 = String.format( "文字列編集:%1$s, %2$d, %1$s, %3$f。", str, a, b ); // "文字列編集:abc, 123, abc, 456.789001。" // 日付 java.util.Calendar cal = java.util.Calendar.getInstance(); String str2 = String.format( "現在の日時:%1$tY/%1$tm/%1$td %1$tH:%1$tM:%1$tS", cal); // "現在の日時:2015/09/27 23:29:48" // 右揃えで文字列の幅を定義する String str3 = String.format( "文字列編集:%1$10s", str ); // "文字列編集: abc" // 左揃えで文字列の幅を定義する String str4 = String.format( "文字列編集:%1$-10s", str ); // "文字列編集:abc " // 数値型を10進数で変換 String str5 = String.format( "文字列編集:%1$d", c ); // "文字列編集:169" // 数値型を16進数で変換 String str6 = String.format( "文字列編集:%1$X", a ); // "文字列編集:7B" // 数値型のZeroパディング String str7 = String.format( "文字列編集:%1$08d", a ); // "文字列編集:00000123" // 浮動小数の変換 String str8 = String.format( "文字列編集:%1$.4f", b ); // "文字列編集:456.7890" // 浮動小数の変換(切り捨てた分は四捨五入して丸め処理する) String str9 = String.format( "文字列編集:%1$.2f", b ); // "文字列編集:456.79"
リファレンス:Oracle
文字コード取得
文字コードを指定して、10進数での文字コードを取得する。
String str3 = "あ"; byte[] b1; try { // try で囲まないとコンパイルエラーになる。 // byte型は -128 〜 127 の範囲で表現されるため 128 以上の値の場合負の数となるため、256 を加算する必要があるようだが... b1 = str3.getBytes("Shift_JIS"); // -126、-96 } catch (java.io.UnsupportedEncodingException e) { }
リファレンス:Oracle
文字列を逆順に変換
文字列をchar配列に分割
文字列をchar配列に分割
String s = "0123"; char[] c0123 = s.toCharArray(); for( char c : c0123 ) { System.out.println( c ); } // 0 // 1 // 2 // 3
parseInt
文字列を数値に変換する。
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { String math = "0123"; int m = Integer.parseInt(math); System.out.println(m); } } // 123
16進数変換
10進数を16進数表記の文字列に変換する
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { System.out.println(Integer.toHexString(100)); } } // 64
10進数変換
16進数を10進数表記に変換する
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { System.out.println(Integer.toString(0x64)); } } // 100
配列
説明することなし
int[] array = new int[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; for( Object data : array ) { System.out.println(data); }
配列の要素数を取得
配列の要素数を取得する
int[] copyFrom = new int[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; System.out.println(copyFrom.length); // 9
配列のコピー
配列をコピーする。不正なインデックスにアクセスすると例外が発生する。
int[] copyFrom = new int[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] copyTo = new int[copyFrom.length]; System.arraycopy(copyFrom, 2, // 0から始まるコピー元配列のコピー開始位置 copyTo, 0, // コピーを行う、コピー先配列の開始位置 7); // コピーを行う配列の要素数。 for( Object data : copyTo ) { System.out.println(data); } // 3 // 4 // 5 // 6 // 7 // 8 // 9 // 0 // 0
配列のコピー
配列をコピーする。こちらは事前の配列の宣言が不要。コピー先配列の任意のインデックスにコピーする場合でなければこちらを使用したほうがいいかも。
int[] copyFrom = new int[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] copyTo = java.util.Arrays.copyOfRange(copyFrom, 2, 5); for( Object data : copyTo ) { System.out.println(data); } // 3 // 4 // 5
instanceof 演算子
instanceof 演算子を使用すると型を比較できる。継承を使用している場合、どのスーパークラスを持っているかのチェックも可能。
// IBicycle.java package sample; public interface IBicycle { }
// Bicycle.java package sample; public class Bicycle { }
// MountainBike.java package sample; // Bicycleクラスを継承 public class MountainBike extends Bicycle { }
// ACMEBicycle.java package sample; // IBicycleインターフェースを継承 public class ACMEBicycle implements IBicycle { }
// HalloWorldApp.java package sample; public class HalloWorldApp { public static void main(String[] args) { Bicycle bic1 = new Bicycle(); // 継承なし MountainBike bic2 = new MountainBike(); // クラスを継承 ACMEBicycle bic3 = new ACMEBicycle(); // interfaceを継承 System.out.println(bic1 instanceof Bicycle ); System.out.println(bic1 instanceof MountainBike ); // System.out.println(bic1 instanceof ACMEBicycle ); bic1はACMEBicycleと継承による依存関係にないのでコンパイルエラー System.out.println(bic2 instanceof Bicycle ); System.out.println(bic2 instanceof MountainBike ); // System.out.println(bic2 instanceof ACMEBicycle ); bic2はACMEBicycleと継承による依存関係にないのでコンパイルエラー // System.out.println(bic3 instanceof Bicycle ); bic3はBicycleと継承による依存関係にないのでコンパイルエラー // System.out.println(bic3 instanceof MountainBike ); bic3はMountainBikeと継承による依存関係にないのでコンパイルエラー System.out.println(bic3 instanceof ACMEBicycle ); } } // true bic1はBicycleと型が一致している // false bic1とMountainBikeは継承による依存関係にあり、MountainBikeをスーパークラスとして持っていないため false // true bic2とBicycleは継承による依存関係にあり、Bicycleをスーパークラスとして持っているため true // true bic2はMountainBikeと型が一致している // true bic3はACMEBicycleと型が一致している
ArrayList クラス
可変長配列を提供するクラス。 なおジェネリックスには int型 のような基本データ型は指定できない。 int型を指定する場合は基本データ型を包む「ラッパークラス」である Integer クラスを使用する必要がある。
package sample; import java.util.ArrayList; import java.util.List; public class HalloWorldApp { public static void main(String[] args) { ListfutureMonths = new ArrayList<>(); // データ追加 futureMonths.add("January"); futureMonths.add("February"); // 要素数取得 System.out.println("■要素数取得"); System.out.println( futureMonths.size()); // ラムダ式を使用した全要素へのアクセス System.out.println("■ラムダ式を使用した全要素へのアクセス"); futureMonths.forEach( arr -> System.out.println(arr)); Boolean find; // 指定したオブジェクトを含むか System.out.println("■指定したオブジェクトを含むか"); find = futureMonths.contains("February"); System.out.println(find); find = futureMonths.contains("Febru"); System.out.println(find); // 検索 System.out.println("■検索"); System.out.println(futureMonths.indexOf("February")); System.out.println(futureMonths.indexOf("Febru")); // データ削除 futureMonths.remove(0); // ラムダ式を使用した全要素へのアクセス System.out.println("■ラムダ式を使用した全要素へのアクセス"); futureMonths.forEach( arr -> System.out.println(arr)); // データ削除 futureMonths.remove("February"); // 空であるか System.out.println("■空であるか"); System.out.println(futureMonths.isEmpty()); // コンパイルエラー // List<int> list = new ArrayList<int>(); } } // ■要素数取得 // 2 // ■ラムダ式を使用した全要素へのアクセス // January // February // ■指定したオブジェクトを含むか // true // false // ■検索 // 1 // -1 // ■ラムダ式を使用した全要素へのアクセス // February // ■空であるか // true
ソート
ラムダ式を使用してソート
// Person.java package sample; public class Person { private int age = 0; public Person(int age) { this.age = age; } public int getAge() { return this.age; } public void printPerson() { System.out.println(this.age); } }
// HalloWorldApp.java package sample; import java.util.ArrayList; import java.util.List; public class HalloWorldApp { public static void main(String... args) { List<Person> persons = new ArrayList<Person>(); persons.add( new Person(24)); persons.add( new Person(32)); persons.add( new Person(3)); persons.add( new Person(48)); persons.add( new Person(52)); persons.add( new Person(13)); // ソート persons.sort((a, b) -> a.getAge() - b.getAge()); persons.forEach( a -> { System.out.println(a.getAge()); } ); } } // 3 // 13 // 24 // 32 // 48 // 52
列挙型に付帯情報を付与する
列挙型にコンストラクタおよびgetアクセサを追加することで、付帯情報を付与することができる。
package sample; public class HalloWorldApp { enum Month { JANUARY("睦月"), FEBRUARY("如月"), MARCH("弥生"), APRIL("卯月"), MAY("皐月"), JUNE("水無月"), JULY("文月"), AUGUST("葉月"), SEPTEMBER("長月"), OCTOBER("神無月"), NOVEMBER("霜月"), DECEMBER("師走"); private String name; Month(String name) { this.name = name; } public String getName() { return name; } } public static void main(String... args) throws Exception { for( Month m : Month.values()) { System.out.println( m.name); } } } // 睦月 // 如月 // 弥生 // 卯月 // 皐月 // 水無月 // 文月 // 葉月 // 長月 // 神無月 // 霜月 // 師走
abs
絶対値
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { System.out.println( Math.abs(1) ); System.out.println( Math.abs(-1) ); } } // 1 // 1
Oracle
ceil
丸め( 切り上げ )
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { System.out.println( Math.ceil(5.1) ); System.out.println( Math.ceil(-5.1) ); } } // 6.0 // -5.0
Oracle
floor
丸め( 切り下げ )
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { System.out.println( Math.floor(5.1) ); System.out.println( Math.floor(-5.1) ); } } // 5.0 // -6.0
Oracle
max
最大値取得
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { System.out.println( Math.max( 1, 2 ) ); System.out.println( Math.max( 2, 1 ) ); } } // 2 // 2
Oracle
min
最小値取得
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { System.out.println( Math.min( 1, 2 ) ); System.out.println( Math.min( 2, 1 ) ); } } // 1 // 1
Oracle
pow
累乗
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { System.out.println( Math.pow( 2, 3 ) ); System.out.println( Math.pow( 2, -3 ) ); } } // 8.0 // 0.125
Oracle
random
0.0以上で1.0より小さい、正の符号の付いた乱数を取得する。
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { for( int i=0; i<10; i++ ) { // 0 〜 9 の範囲内で乱数を取得する System.out.println( Math.floor( Math.random() * 10 ) ); } } } // 4.0 // 6.0 // 2.0 // 0.0 // 4.0 // 2.0 // 8.0 // 5.0 // 2.0 // 5.0
Oracle
round
引数にもっとも近いintを四捨五入で返す
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { double a[] = { 2.3, 2.4, 2.5, -2.4, -2.5, -2.6 }; for( int i=0; i<a.length; i++ ) { System.out.println(Math.round(a[i])); } } } // 2 // 2 // 3 // -2 // -2 // -3
Oracle
sqrt
平方根を返す。
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { System.out.println(Math.sqrt(4)); System.out.println(Math.sqrt(5)); System.out.println(Math.sqrt(-4)); } } // 2.0 // 2.23606797749979 // NaN
Oracle
round
引数にもっとも近いintを四捨五入で返す
package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { double a[] = { 2.3, 2.4, 2.5, -2.4, -2.5, -2.6 }; for( int i=0; i<a.length; i++ ) { System.out.println(Math.round(a[i])); } } } // 2 // 2 // 3 // -2 // -2 // -3
Oracle
java.math.BigInteger
java.math.BigIntegerを使用すると任意精度の整数型が使用できる。非常に大きい数値を扱う場合に使用できる。
package sample; import java.math.BigInteger; public class HalloWorldApp { public static void main(String... args) throws Exception { // longの最大値 long m = 9223372036854775807L; // long 型の最大値超え BigInteger b = new BigInteger("10000000000000000000"); // 加算 b = b.add( new BigInteger("100") ); System.out.println(b); // 減算 b = b.subtract( new BigInteger("100") ); System.out.println(b); // 積算 b = b.multiply( new BigInteger("100") ); System.out.println(b); // 除算 b = b.divide( new BigInteger("100") ); System.out.println(b); } } // 10000000000000000100 // 10000000000000000000 // 1000000000000000000000 // 10000000000000000000
java.math.BigDecimal
java.math.BigDecimalを使用すると浮動小数点数で正確に演算できる。 除算を行うdivide()メソッドを使用する場合、小数点以下の値が無限になると例外が発生するので、BigDecimal.ROUND_HALF_UPを使用して桁数制限する。 BigDecimal.ROUND_HALF_UPは小数点以下3位で四捨五入する。
package sample; import java.math.BigDecimal; public class HalloWorldApp { public static void main(String... args) throws Exception { // 誤差発生 System.out.println(1.03 - 0.42); // 正確 BigDecimal b = new BigDecimal("1.03"); b = b.subtract( new BigDecimal( "0.42")); System.out.println(b); // 0.61 / 0.778 System.out.println( b.divide( new BigDecimal( "0.778"), BigDecimal.ROUND_HALF_UP) ); // 0.61 / 0.777 System.out.println( b.divide( new BigDecimal( "0.777"), BigDecimal.ROUND_HALF_UP) ); } } // 0.6100000000000001 // 0.61 // 0.78 // 0.79
システム日付を書式変換する
DateFormatを使用してシステム日付を書式変換する。
package sample; import java.text.DateFormat; import java.util.Calendar; import java.util.Locale; public class HalloWorldApp { public static void main(String... args) { Calendar cal = Calendar.getInstance(); DateFormat df; df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.JAPAN); System.out.println(df.format(cal.getTime())); df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.JAPAN); System.out.println(df.format(cal.getTime())); df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.JAPAN); System.out.println(df.format(cal.getTime())); df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.JAPAN); System.out.println(df.format(cal.getTime())); } } // 16/09/05 21:24 // 2016/09/05 21:24:51 // 2016/09/05 21:24:51 JST // 2016年9月5日 21時24分51秒 JST
システム日付を書式変換する
SimpleDateFormatを使用してシステム日付を書式変換する
package sample; import java.text.SimpleDateFormat; import java.util.Calendar; public class HalloWorldApp { public static void main(String... args) { Calendar cal = Calendar.getInstance(); SimpleDateFormat sf; // HHを指定すると、24時間単位での時間となる sf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SS"); System.out.println(sf.format(cal.getTime())); // hhを指定すると、12時間単位での時間となる sf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss:SS"); System.out.println(sf.format(cal.getTime())); sf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss-SS"); System.out.println(sf.format(cal.getTime())); // wを指定すると、年における週 sf = new SimpleDateFormat("w"); System.out.println(sf.format(cal.getTime())); // 月における何週目かを取得。月全体で取得。 sf = new SimpleDateFormat("W"); System.out.println(sf.format(cal.getTime())); // 月における何週目かを取得。該当の曜日に対して取得。 sf = new SimpleDateFormat("F"); System.out.println(sf.format(cal.getTime())); // 曜日 sf = new SimpleDateFormat("E"); System.out.println(sf.format(cal.getTime())); } } // 2016/09/06 16:29:22:533 // 2016-09-06 16-29-22-534 // 2016/09/06 04:29:22:534 // 37 // 2 // 1 // 火
任意の日時を設定する
任意の日時を設定する。
package sample; import java.text.SimpleDateFormat; import java.util.Calendar; public class HalloWorldApp { public static void main(String... args) { Calendar cal = Calendar.getInstance(); SimpleDateFormat sf; sf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SS"); // 日付を設定する。時間はシステム時間となる。 // 月はZeroBaseとなることに注意する。 cal.set(2015, 0, 2); System.out.println(sf.format(cal.getTime())); // // 日時を設定する cal.set(2015, 0, 2, 1, 2, 3); System.out.println(sf.format(cal.getTime())); } } // 2015/01/02 06:25:31:792 // 2015/01/02 01:02:03:792
日時の要素を個別に取得する
日時の要素を個別に取得する。
package sample; import java.text.SimpleDateFormat; import java.util.Calendar; public class HalloWorldApp { public static void main(String... args) { Calendar cal = Calendar.getInstance(); SimpleDateFormat sf; sf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SS"); System.out.println(sf.format(cal.getTime())); System.out.println(cal.get(Calendar.YEAR)); // 月はZeroBase System.out.println(cal.get(Calendar.MONTH) + 1); System.out.println(cal.get(Calendar.DATE)); System.out.println(cal.get(Calendar.HOUR)); System.out.println(cal.get(Calendar.MINUTE)); System.out.println(cal.get(Calendar.SECOND)); System.out.println(cal.get(Calendar.MILLISECOND)); // 曜日はOneBase System.out.println(cal.get(Calendar.DAY_OF_WEEK)); } } // 2016/09/09 06:10:35:972 // 2016 // 9 // 9 // 6 // 10 // 35 // 972 // 6
日時の加減算する
日時の加減算する。
package sample; import java.text.SimpleDateFormat; import java.util.Calendar; public class HalloWorldApp { public static void main(String... args) { Calendar cal = Calendar.getInstance(); SimpleDateFormat sf; sf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SS"); System.out.println(sf.format(cal.getTime())); cal.add(Calendar.DATE, 5); System.out.println(sf.format(cal.getTime())); cal.add(Calendar.DATE, -10); System.out.println(sf.format(cal.getTime())); } } // 2016/09/09 06:24:02:415 // 2016/09/14 06:24:02:415 // 2016/09/04 06:24:02:415
for
二重ループ内でいっきにループから抜ける方法
package sample; public class HalloWorldApp { public static void main(String[] args) { int[][] arrayOfInts = { { 32, 87, 3, 589 }, { 12, 1076, 2000, 8 }, { 622, 127, 77, 955 } }; int searchFor = 12; boolean foundIt = false; exit: for( int i=0; i<arrayOfInts.length; i++ ) { for( int j=0; j<arrayOfInts[i].length; j++ ) { if( arrayOfInts[i][j] == searchFor ) { foundIt = true; break exit; } } } if( foundIt ) { System.out.println( foundIt ); } } }
for拡張
いわゆるforeach
package sample; public class HalloWorldApp { public static void main(String... args) { long[] list = new long[5]; list[0] = 0; list[1] = 1; list[2] = 2; list[3] = 3; list[4] = 4; for( long data : list ) { System.out.println( data ); } } }
一般的な命名規約
クラスの一般的な命名規約について説明する。 クラス名の最初の一文字は大文字とされるべきである。 メソッドの最初の単語は小文字で始まる動詞であるべきである。
public class Bicycle { private int cadence; private int gear; private int speed; public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } public int getCadence() { return cadence; } }
コンストラクタ
thisキーワードを使用することで自身の別のコンストラクタを呼び出すことができる。 なお superキーワードを使用することでスーパークラスのコンストラクタを呼び出すことができる。
public class Rectangle { private int x, y; private int width, height; public Rectangle() { // Rectangle(int x, int y, int width, int height)を呼び出す this(0, 0, 1, 1); } public Rectangle(int width, int height) { // Rectangle(int x, int y, int width, int height)を呼び出す this(0, 0, width, height); } public Rectangle(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } }
初期化ブロック
初期化ブロックを使用すると、staticフィールドの複雑な初期値の代入が可能になる。
// Foo.java package sample; import java.text.DateFormat; import java.text.Format; import java.util.Date; public class Foo { static String loadedTime; String initTime; static int count = 0; // static初期化ブロック // ここではstaticフィールドのみ初期値設定ができる static { Date currentDate = new Date(); Format dft = DateFormat.getDateTimeInstance(); loadedTime = dft.format(currentDate); System.out.println( "static 初期化ブロック"); } // 初期化ブロック // ここではstatic、非staticフィールドの値の初期値設定ができる // コンストラクタ内で初期化すればいい話なので、こちらは意味ないと思う。 { Date currentDate = new Date(); Format dft = DateFormat.getDateTimeInstance(); initTime = dft.format(currentDate); count++; System.out.println( "初期化ブロック"); } Foo() { System.out.println( "コンストラクタ"); } }
// HalloWorldApp.java package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { // staticフィールドにアクセスすると、static初期化ブロックのみ実行される System.out.println("Foo.loadedTimeアクセス開始"); System.out.println("Foo.loadedTime -> " + Foo.loadedTime); System.out.println("Foo.loadedTimeアクセス終了"); // 2回目のアクセスではstatic初期化ブロックは実行されない System.out.println("Foo.loadedTimeアクセス開始"); System.out.println("Foo.loadedTime -> " + Foo.loadedTime); System.out.println("Foo.loadedTimeアクセス終了"); // インスタンス作成した場合は、static初期化ブロック、初期化ブロック、コンストラクタの順番で実行される。 // ただしこのサンプルでは上記ですでにstatic初期化ブロックが実行されているためstatic初期化ブロックは実行されない。 System.out.println("インスタンス作成開始"); Foo foo = new Foo(); System.out.println("インスタンス作成終了"); // 初期化ブロックは毎回実行される System.out.println("インスタンス作成開始"); Foo foo2 = new Foo(); System.out.println("インスタンス作成終了"); } }
静的フィールド
複数の異なるインスタンス内でフィールドを共有する。
// Math.java package sample; public class Math { private static int number = 0; public int getNextNumber() { return ++number; } }
// HalloWorldApp.java package sample; public class HalloWorldApp { public static void main(String[] args) { Math math1 = new Math(); System.out.println(math1.getNextNumber()); Math math2 = new Math(); System.out.println(math1.getNextNumber()); } } // 1 // 2
finalキーワード
finalキーワードをフィールドに使用すると変更不可となる。
package sample; public class Math { private static final double PI = 3.141592653589793; public void setPai( double pi ) { // コンパイルエラーになる PI = pi; } public double getPai() { return this.PI; } }
内部クラス
クラス内部にクラスを作成する。利点は以下。 1.ひとつの場所だけで使用することがわかっている場合、複数のクラスをグルーピングする場合に使用する。 Javaは1クラスファイル内に1クラスしかかけない制限があるが、ちょいプロ作成する場合などでわざわざファイルを分ける手間をかけたくない場合などで使用する。
2.クラスAの内部クラスとしてクラスBが存在する場合、プライベート宣言したクラスAのメンバに、Bはアクセスすることができる。 また、 B自体が外の世界からアクセス不可にすることができる。
3.関連する内部クラス通しがソースコード的に近い場所に配置されるため、読みやすくなる。
// Outer.java package sample; // 外部クラス public class Outer { private int x = 1; // 内部クラス public class Inner { private int x = 2; public void func( int x ) { System.out.println(x); System.out.println(this.x); // privateな外部クラスのメンバにアクセスできる System.out.println(Outer.this.x); } } }
// HalloWorldApp.java package sample; public class HalloWorldApp { public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); inner.func(3); } } // 3:2:1
Oracle
ローカルクラス
複数の内部クラスのインスタンスを作成する場合などで使用する。この場合は明確にクラス名を指定する。 ローカルクラスを内包するメソッド( サンプルではvalidatePhoneNumber )内で宣言されているフィールド( サンプルではnumberLength )の値をローカルクラス( サンプルではPhoneNumber )内で変更することはできない。
ローカルクラス内のメンバ( メソッドもフィールドも )は static にできない。 ただしフィールドについては、static final とし初期値も代入してある場合は有効。
package sample; public class HalloWorldApp { static String regularExpression = "[^0-9]"; public static void validatePhoneNumber(String phoneNumber1, String phoneNumber2) { final int numberLength = 10; // ローカルクラス内で参照しているフィールドの値は変更できない。 // numberLength = 7; // 電話番号のフォーマットチェックする内部クラス class PhoneNumber { String formattedPhoneNumber = null; PhoneNumber(String phoneNumber) { // ローカルクラスから外側にあるメソッド内のフィールドの値を変更できない。 // numberLength = 7; String currentNumber = phoneNumber.replaceAll(regularExpression, ""); formattedPhoneNumber = currentNumber.length() == numberLength ? currentNumber : null; } public String getNumber() { return formattedPhoneNumber; } public void printOriginalNumbers() { // JDK 8以降の場合は、ローカルクラスの外側のメソッドの引数にアクセスできる System.out.println("Original numbers are " + phoneNumber1 + " and " + phoneNumber2); } } PhoneNumber myNumber1 = new PhoneNumber(phoneNumber1); PhoneNumber myNumber2 = new PhoneNumber(phoneNumber2); String msg = ""; msg = myNumber1.getNumber() == null ? "invalid" : myNumber1.getNumber(); System.out.println("First number is " + msg); msg = myNumber2.getNumber() == null ? "invalid" : myNumber2.getNumber(); System.out.println("Second number is " + msg); myNumber1.printOriginalNumbers(); } public static void main(String... args) { validatePhoneNumber("123-456-7890", "456-7890"); } } // First number is 1234567890 // Second number is invalid // Original numbers are 123-456-7890 and 456-7890
Oracle
匿名クラス
クラスの宣言と同時にクラスのインスタンスを作成する。 ローカルクラスと同様に匿名クラスを内包するメソッド内で宣言されているフィールドの値を匿名クラス内で変更することはできない。
ローカルクラスと同様に匿名クラス内のメンバ( メソッドもフィールドも )は static にできない。 ただしフィールドについては、static final とし初期値も代入してある場合は有効。
コンストラクタを指定できない。
匿名クラスは主にGUIで使用し、各コントローラーのイベント処理を匿名クラスとしてイベントハンドラ―に関連付けるために使用する。
package sample; public class HalloWorldApp { // インターフェースの宣言 interface HelloWorld { public void greet(); public void greetSomeone(String someone); } public static void sayHello() { // HalloWorldインターフェースを継承したクラスを宣言する class EnglishGreeting implements HelloWorld { String name = "world"; @Override public void greet() { greetSomeone("world"); } @Override public void greetSomeone(String someone) { name = someone; System.out.println("Hello " + name); } } // クラスを使用するためにインスタンスを作成する HelloWorld englishGreeting = new EnglishGreeting(); // HalloWorldインターフェースを継承するクラスのインスタンス作成 HelloWorld frenchGreeting = new HelloWorld() { // クラスの実装も同時に行う String name = "tout le monde"; @Override public void greet() { greetSomeone("tout le monde"); } @Override public void greetSomeone(String someone) { name = someone; System.out.println("Salut " + name); } }; englishGreeting.greetSomeone("Fred"); englishGreeting.greet(); frenchGreeting.greetSomeone("Mike"); frenchGreeting.greet(); } public static void main(String... args) { sayHello(); } } // Hello Fred // Hello world // Salut Mike // Salut tout le monde
Oracle
ラムダ式
いわゆる関数ポインタ的なもので機能の変更をメソッドを追加せずに行えるようにするためのもの。ポイントは既存のソースに影響を与えずに機能追加で対応できることろ。
// Person.java package sample; public class Person { private int age = 0; public Person(int age) { this.age = age; } public int getAge() { return this.age; } public void printPerson() { System.out.println(this.age); } }
// CheckPerson.java package sample; interface CheckPerson { boolean test(Person p); }
// HalloWorldApp.java package sample; import java.util.ArrayList; import java.util.List; public class HalloWorldApp { public static void printPersons(List<Person> roster, CheckPerson tester) { for (Person p : roster) { if (tester.test(p)) { p.printPerson(); } } } public static void main(String... args) { List<Person> persons = new ArrayList<Person>(); persons.add( new Person(24)); persons.add( new Person(32)); persons.add( new Person(48)); // 匿名クラスを用いた記法 printPersons( persons, new CheckPerson(){ public boolean test(Person p) { return p.getAge() > 30; } }); // ラムダ式を用いた記法 printPersons( persons, p -> { return p.getAge() > 30; }); } }
Oracle
ジェネリックス
C++でいうところのテンプレート。型を厳密に指定しないことで汎用的に使用できるようにする。
// Person.java package sample; public class Person { private int age = 0; public Person(int age) { this.age = age; } public int getAge() { return this.age; } public void printPerson() { System.out.println(this.age); } }
// Check.java package sample; // ジェネリックスにより型を一般化する public interface Check<T> { boolean test(T p); }
// HalloWorldApp.java package sample; import java.util.ArrayList; import java.util.List; public class HalloWorldApp { // interfaceを使う側で型指定する public static void printPersons(List<Person> roster, Check<Person> tester) { for (Person p : roster) { if (tester.test(p)) { p.printPerson(); } } } public static void main(String... args) { List<Person> persons = new ArrayList<Person>(); persons.add( new Person(24)); persons.add( new Person(32)); persons.add( new Person(48)); // ラムダ式を用いた記法 printPersons( persons, p -> { return p.getAge() > 30; }); } }
Oracle
多態性( ポリモーフィズム )
スーパークラスを継承するサブクラスを作成する場合、そのインスタンスはスーパークラスとサブクラスの両方の振る舞いをすることを示す。
// SuperFoo.java package sample; public class SuperFoo { public void func() { System.out.println("SuperFoo"); } }
// SubFoo.java package sample; public class SubFoo extends SuperFoo { @Override public void func() { System.out.println("SubFoo"); } }
// HalloWorldApp.java package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { SuperFoo foo1 = new SuperFoo(); // スーパークラスのメソッドが実行される。 foo1.func(); SuperFoo foo2 = new SubFoo(); // サブクラスのメソッドが実行される foo2.func(); SubFoo foo3 = new SubFoo(); // サブクラスのメソッドが実行される foo3.func(); } }
サブクラスからスーパークラスのメソッドにアクセス
super キーワードを使用すると、サブクラスからスーパークラスのメソッドにアクセスできる。
// SuperFoo.java package sample; public class SuperFoo { public void func() { System.out.println("SuperFoo"); } }
// SubFoo.java package sample; public class SubFoo extends SuperFoo { @Override public void func() { System.out.println("SubFoo"); // スーパークラスのメソッドにアクセスする super.func(); } }
// HalloWorldApp.java package sample; public class HalloWorldApp { public static void main(String... args) throws Exception { SubFoo foo1 = new SubFoo(); foo1.func(); } }
可変長引数
...を使用すると可変長引数となる。
package sample; public class HalloWorldApp { private static int add( int... a ) { int b = 0; for( int i=0; i<a.length; i++ ) { b += a[i]; } return b; } public static void main(String[] args) { System.out.println( add( 1, 2, 3, 4, 5 ) ); } } // 15
メソッドチェーン
C#でいうところのLINQみたいな感じ
// Person.java package sample; public class Person { private int age = 0; public Person(int age) { this.age = age; } public int getAge() { return this.age; } public void printPerson() { System.out.println(this.age); } }
// HalloWorldApp.java package sample; import java.util.ArrayList; import java.util.List; public class HalloWorldApp { public static void main(String... args) { List<Person> persons = new ArrayList<Person>(); persons.add( new Person(24)); persons.add( new Person(32)); persons.add( new Person(48)); // forループを使用せずラムダ式で表記 persons.stream() // このコレクションをソースとして使用して、逐次的なStreamを返します。 .filter(p -> p.getAge() > 30) // このストリームの要素のうち、指定された述語に一致するものから構成されるストリームを返します。 .map(p -> String.format("%1$08d",p.getAge())) // このストリームの要素に指定された関数を適用した結果から構成されるストリームを返します .forEach(p -> System.out.println(p)); // このストリームの各要素に対してアクションを実行します } } // 00000032 // 00000048
@Override
メソッドをオーバーライドしていることを宣言する。これを使用することでオーバーライドしているつもりだが、実際にはスペルミスでオーバーライドしていないというバグをつぶせる。
// Foo.java package sample; public class Foo { public void func() { System.out.println("Foo"); } }
// Foo2.java package sample; public class Foo2 extends Foo { @Override public void func() { System.out.println("Foo2"); } }
@Deprecated
非推奨メソッド、つまり下位互換性のために残しているだけで、新規で使用してほしくないメソッドに対して使用する。使用するとワーニングエラーになる。
// Foo.java package sample; public class Foo { @Deprecated public void func() { System.out.println("Foo"); } }
// HalloWorldApp.java package sample; import java.util.ArrayList; import java.util.List; public class HalloWorldApp { public static void main(String... args) { Foo f = new Foo(); f.func(); } }
@SuppressWarnings
警告を抑制する。
package sample; public class HalloWorldApp { public static void main(String... args) { // 未使用変数を使用したことによる警告を抑制する @SuppressWarnings("unused") long a = 1234567890; } }
クラスやメソッドの注釈
クラスやメソッドにつける注釈。これを設定しておくと、メソッドをコーディングする際、注釈がツールチップとして表示されるようになる。
package sample; public class HalloWorldApp { public static void main(String... args) { System.out.println(func( 1, 2 )); } /** * @author Maverick Project * @since 2016/08/04 * @version 1.0 * @param a 数値1 * @param b 数値2 * @return 加算結果 */ public static int func( int a, int b) { return a + b; } }
javadoc
注釈をhtmlで出力する。リファレンスとして使用できる。
1.Eclipseの「メニュー」の「プロジェクト」をクリック。2.「Javadocの生成」をクリック。
3.対話式に画面が切り替わるが、この中でVMオプションに「-encoding UTF-8 -charset UTF-8」を指定するところだけ注意。
カスタムアノテーション
@interfaceを使用して独自のアノテーションを作成できる。
package sample; @interface ClassPreamble { String 作成者名(); String 作成日(); int バージョン() default 1; String 更新者名() default ""; String 更新者日() default ""; String[] レビュワー(); } @ClassPreamble( 作成者名 = "Maverick Project" , 作成日 = "2016/08/04" , レビュワー = { "田中" } ) public class HalloWorldApp { public static int func( int a, int b) { return a + b; } public static void main(String... args) { System.out.println(func( 1, 2 )); HalloWorldApp cls = new HalloWorldApp(); } } // ツールチップの表示内容。見づらい。。。 // @ClassPreamble(作成者名="Maverick Project", 作成日="2016/08/04", レビュワー={"田中"})
プロパティファイル
// test.properties key=testdata
// HalloWorldApp.java package sample; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class HalloWorldApp { public static void main(String... args) throws IOException { final Properties prop = new Properties(); InputStream inStream = null; try { // プロパティファイルの文字エンコーディングはISO 8859_1限定らしい inStream = new BufferedInputStream(new FileInputStream("test.properties")); prop.load(inStream); // keyが見つからない場合はnullを返す。 final String value = prop.getProperty("key"); System.out.println(value); } finally { if (inStream != null) { inStream.close(); } } } }
コンストラクタの自動生成
Eclipseを使用する場合、コンストラクタを自動生成できる。
// Foo.java package sample; import java.text.DateFormat; import java.text.Format; import java.util.Date; public class Foo { private int cnt; }
上記のようにフィールドを設定済のFooクラスを作成する。「パッケージエクスプローラー」上でFoo.java上で右クリックメニューを表示し、「ソース」をポイントする。
次に、「フィールドを使用してコンストラクタを生成」をクリックする。
コンストラクタの引数に含めるフィールドをチェックして、OKボタンをクリックすると、コンストラクタが自動生成される。
// Foo.java package sample; import java.text.DateFormat; import java.text.Format; import java.util.Date; public class Foo { /** * @param cnt */ public Foo(int cnt) { super(); this.cnt = cnt; } private int cnt; }
オーバーライドメソッドの自動生成
Eclipseを使用する場合、オーバーライドメソッドを自動生成できる。
// Foo2.java package sample; public class Foo2 { public void func1(){} public void func2(){} }
// Foo3.java package sample; public class Foo3 extends Foo2 { }
上記のように作成済のFoo2クラスをFoo3クラスで継承することを考える。「パッケージエクスプローラー」上でFoo3.java上で右クリックメニューを表示し、「ソース」をポイントする。
次に、「メソッドのオーバーライド/実装」をクリックする。
Foo2クラスのメソッド一覧とObjectクラスが表示されるので、Foo3.クラス側で実装するメソッドをチェックして、OKボタンをクリックすると、オーバーライドされたメソッド一覧が自動生成される。
// Foo3.java package sample; public class Foo3 extends Foo2 { @Override public void func1() { // TODO 自動生成されたメソッド・スタブ super.func1(); } @Override public void func2() { // TODO 自動生成されたメソッド・スタブ super.func2(); } }
アクセサの自動生成
Eclipseを使用する場合、アクセサを自動生成できる。
// Foo.java package sample; public class Foo { private String name; private String eMail; private boolean member; }
上記のようにフィールドを設定する。「パッケージエクスプローラー」上でFoo.java上で右クリックメニューを表示し、「ソース」をポイントする。
次に、「GetterおよびSetterの生成」をクリックする。
フィールド一覧が表示されるので、アクセサを作成するフィールドをチェックしてOKボタンをクリックすると、アクセサが自動生成される。
// Foo.java package sample; public class Foo { private String name; private String eMail; private boolean member; public String getName() { return name; } public void setName(String name) { this.name = name; } public String geteMail() { return eMail; } public void seteMail(String eMail) { this.eMail = eMail; } public boolean isMember() { return member; } public void setMember(boolean member) { this.member = member; } }
ファイル、フォルダの存在確認
ファイルまたはフォルダの存在を確認する。
// HalloWorldApp.java package sample; import java.io.File; public class HalloWorldApp { public static void main(String... args) { File f = new File("test.txt"); // File f = new File("src"); // ファイルまたはフォルダの存在確認 if( f.exists() ) { // ファイルであるかを判定( ついでに ) if( f.isFile() ) { System.out.println( "ファイルが見つかりました。" ); } // フォルダであるかを判定( ついでに ) else if( f.isDirectory() ) { System.out.println( "フォルダが見つかりました。" ); } } else { System.out.println( "ファイルもフォルダも見つかりません" ); } } }
@IT
ファイル読み込み
BufferedReaderクラスを使用してファイル読み込む。 相対パスで指定する場合は、プロジェクトフォルダのパスを起点とすること いろいろクラスがあるようだが、ファイルの文字コードを指定して読み込むにはサンプルのようにする。 なおファイルの存在確認は行っていないことに注意すること。
// test.txt 文字コードはShift-JIS テスト1 テスト2
// HalloWorldApp.java package sample; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class HalloWorldApp { public static void main(String... args) throws IOException { String line = ""; BufferedReader br = null; try { // 相対パスの場合は、プロジェクトフォルダのパスを起点とすること br = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt"),"Shift_JIS")); // 1行ごとに読み込み while( ( line = br.readLine()) != null ) { System.out.println(line); } } catch( Exception ex ) { System.out.println(ex.toString()); } finally { if( br != null ) { br.close(); } } } }
@IT
バイナリファイル読み込み
バイナリファイル読み込み
// HalloWorldApp.java package sample; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class HalloWorldApp { public static void main(String... args) throws IOException { int b = -1; FileInputStream br = null; try { // 相対パスの場合は、プロジェクトフォルダのパスを起点とすること br = new FileInputStream("1.png"); // 終端に達すると-1を返す while( ( b = br.read()) != -1 ) { System.out.println(Integer.toHexString(b)); } } catch( Exception ex ) { System.out.println(ex.toString()); } finally { if( br != null ) { br.close(); } } } }
@IT
ファイル書き込み
BufferedWriterクラスを使用してファイル書き込み。 相対パスで指定する場合は、プロジェクトフォルダのパスを起点とすること いろいろクラスがあるようだが、ファイルの文字コードを指定して読み込むにはサンプルのようにする。
// HalloWorldApp.java package sample; import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class HalloWorldApp { public static void main(String... args) throws IOException { BufferedWriter br = null; try { // 追記書き込みで、ファイルが存在しない場合は新規作成する // 上書きする場合は、FileOutputStreamの第2引数を false にする br = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test.txt", true), "Shift_JIS")); // 1行ごとに書き込み br.write("abc"); br.write("123"); br.write("ABC"); br.flush(); } catch( Exception ex ) { System.out.println(ex.toString()); } finally { if( br != null ) { br.close(); } } } }
@IT
ファイルコピー
ファイルコピー
// HalloWorldApp.java package sample; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.StandardCopyOption; public class HalloWorldApp { public static void main(String... args) { try { Path src = FileSystems.getDefault().getPath("aaa\\test.txt"); Path dest = FileSystems.getDefault().getPath("bbb\\test.txt"); // NOFOLLOW_LINKS -> シンボリックリンクをたどらない if( Files.exists(src, LinkOption.NOFOLLOW_LINKS) ) { // REPLACE_EXISTING -> コピー先にファイルが存在する場合は上書きする Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING); System.out.println("ファイルコピーしました"); } else { System.out.println("ファイルが存在しません"); } } catch( Exception ex ) { System.out.println(ex.toString()); } } }
Oracle
ファイル移動
ファイル移動
package sample; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.StandardCopyOption; public class HalloWorldApp { public static void main(String... args) { try { Path src = FileSystems.getDefault().getPath("aaa\\test.txt"); Path dest = FileSystems.getDefault().getPath("bbb\\test.txt"); // NOFOLLOW_LINKS -> シンボリックリンクをたどらない if( Files.exists(src, LinkOption.NOFOLLOW_LINKS) ) { // REPLACE_EXISTING -> コピー先にファイルが存在する場合は上書きする Files.move(src, dest, StandardCopyOption.REPLACE_EXISTING); System.out.println("ファイル移動しました"); } else { System.out.println("ファイルが存在しません"); } } catch( Exception ex ) { System.out.println(ex.toString()); } } }
Oracle
ファイル変名
ファイル変名。やり方はファイルコピーと同じでパスを同じにするだけ。
package sample; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.StandardCopyOption; public class HalloWorldApp { public static void main(String... args) { try { String path = "aaa"; Path src = FileSystems.getDefault().getPath(path, "test1.txt"); Path dest = FileSystems.getDefault().getPath(path, "test2.txt"); // NOFOLLOW_LINKS -> シンボリックリンクをたどらない if( Files.exists(src, LinkOption.NOFOLLOW_LINKS) ) { // REPLACE_EXISTING -> コピー先にファイルが存在する場合は上書きする Files.move(src, dest, StandardCopyOption.REPLACE_EXISTING); System.out.println("ファイルを変名しました"); } else { System.out.println("ファイルが存在しません"); } } catch( Exception ex ) { System.out.println(ex.toString()); } } }
Oracle
ファイル削除
ファイル削除。deleteIfExistsメソッドを使用すると、ファイルが存在する場合のみ削除する。
package sample; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; public class HalloWorldApp { public static void main(String... args) { try { Path src = FileSystems.getDefault().getPath("aaa\\test.txt"); // ファイルが存在する場合、削除する。 Files.deleteIfExists(src); System.out.println("ファイルを削除しました。"); } catch( Exception ex ) { System.out.println(ex.toString()); } } }
Oracle
フォルダ作成
createDirectoriesメソッドを使用すると、子階層のフォルダも作成できる。 なおフォルダが既に存在しても例外をスローしない。
package sample; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; public class HalloWorldApp { public static void main(String... args) { try { Path path = FileSystems.getDefault().getPath("test1\\test2"); Files.createDirectories(path); } catch( Exception ex ) { System.out.println(ex.toString()); } } }
Oracle
ファイルの容量を取得
ファイルの容量を取得
package sample; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; public class HalloWorldApp { public static void main(String... args) { try { Path path = FileSystems.getDefault().getPath("test1\\test1.txt"); System.out.println( Files.size(path)); } catch( Exception ex ) { System.out.println(ex.toString()); } } }
Oracle
フォルダ内のファイルパスを再帰的に取得
フォルダ内のファイルパスを再帰的に取得
package sample; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.FileVisitResult; import java.nio.file.FileVisitor; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.PathMatcher; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; public class HalloWorldApp { public class MyFileVisitor implements FileVisitor{ private List pathArray = new ArrayList (); // フォルダ検索前に呼び出す。ここでは全フォルダ対象 @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { System.out.println("preVisitDirectory : " + dir.getFileName()); return FileVisitResult.CONTINUE; } // ファイル検索。ここでは拡張子.txtのみ対象 @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { // 大文字小文字関係なく比較する // globを使用した場合、正規表現より単純な構文による比較を行う。詳細は下記参照 // http://docs.oracle.com/javase/jp/7/api/java/nio/file/FileSystem.html final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.txt"); if( matcher.matches(file.getFileName())) { System.out.println("visitFile : " + file.getFileName() + " -> 対象"); pathArray.add( file.toString() ); return FileVisitResult.CONTINUE; } else { System.out.println("visitFile : " + file.getFileName() + " -> 対象外"); return FileVisitResult.CONTINUE; } } // フォルダ検索後に呼び出す。 @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { System.out.println("postVisitDirectory : " + dir.getFileName()); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { String error = String.format(" [exception=%s, message=%s]", exc.getClass(), exc.getMessage()); System.out.println("visitFileFailed : " + file.getFileName() + error); return FileVisitResult.CONTINUE; } public List getPaths() { return pathArray; } } public static void main(String... args) throws IOException { // 検索対象のルートフォルダのパス Path start = Paths.get("aaa"); HalloWorldApp cls = new HalloWorldApp(); FileVisitor visitor = cls.new MyFileVisitor(); Files.walkFileTree(start, visitor); List paths = ((MyFileVisitor) visitor).getPaths(); paths.forEach( p -> { System.out.println(p); }); } }
Oracle