FC2ブログ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- / Top↑
データファイルの読み込みと書き込みです。(Java)
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
JavaプログラミングMini TIPs - 0006【データファイルの読み書き】
-----------------------------------------------------------------
知っていると便利?いつかは役立つ?……かも知れないTIPsです。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
プログラムを作り始めると必ずと言っていい程データファイルの読み書き処理を扱います。方法はまだ他にあると思いますが、大体このようなパターンを憶えておけば事足りるかと思います。

(注意)
■Javaコードはバージョンによって使用に影響を受ける可能性があります。(バージョンによって未サポートのためエラーとなるコードも存在します)
■例えばバックスラッシュ(\)はwindowsでは ¥ に相当します。
■このブログではバックスラッシュ(\)がまともに表示できないために全角文字で表示しています。実際に使用する時には全て半角小文字に置き換えて下さい。
■このブログではエスケープシークエンス( <BS> <HT> <LF> <FF> <CR> <”> <’> <\> )がまともに表示できないために全角文字で表示しています。これらは全て半角小文字に置き換えて見て下さい。
■この糞ブログではまともに半角小文字の空白文字表示が出来ないようです。実際のサンプルプログラムのステップで段差を付けて見易くしていますが、ここでは全て1桁目からしか表示できていません。気になる方はコピペした後に空白を挿入して修正してください。
■当サンプルはEclipse使用前提のためimportステップは省略しています。(Eclipseでは[ctrl]+[shift]+[o]で挿入されます)


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
サンプルコード(データファイルの読み込み)
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
データはCSV形式としました。項目の分解まで含ませましたので、この様なBufferedReaderを用いたCSV形式の処理が出来れば殆どのデータに対応出来るのではないでしょうか。読み込みはBufferedReaderを使用しています。

■■■■■■■■■■■■■■■■■■
データを全件読み込んで表示する
■■■■■■■■■■■■■■■■■■
String [] DATAT = new String [20];
int YY = 0; int MM = 0; int DD = 0;
int hh = 0; int mm = 0; int cnt = 0;
String INPDT = "/home/k/WORK/test.txt";
try {
BufferedReader DATA_BUF = new BufferedReader(new FileReader(INPDT));
String DATA_GYOU = "";
while( (DATA_GYOU = DATA_BUF.readLine()) != null ){
System.out.println( "read="+ DATA_GYOU);
DATAT = DATA_GYOU.split(","); //項目分け
YY = Integer.valueOf(DATAT[0].substring( 0,4 )); // 0桁から4桁の前まで
MM = Integer.valueOf(DATAT[0].substring( 5,7 )); // 5桁から7桁の前まで
DD = Integer.valueOf(DATAT[0].substring( 8,10)); // 8桁から10桁の前まで
hh = Integer.valueOf(DATAT[1].substring( 0,2 )); // 0桁から2桁の前まで
mm = Integer.valueOf(DATAT[1].substring( 3,5 )); // 3桁から5桁の前まで
++cnt; //* 処理件数+1
System.out.println( "処理="+ YY+":"+MM+":"+DD+","+hh+":"+mm
+","+DATAT[2]+","+DATAT[3]+","+DATAT[4]);
}
DATA_BUF.close();
} catch(FileNotFoundException e1){ System.out.println( INPDT+"(file not found)" );
} catch(IOException e2 ){ System.out.println( INPDT+"(file not found)"); }
System.out.println( "データ件数="+ cnt);
//* DATATの数は多めに定義しています。(この範囲内ならば項目増減があってもエラーにならない)
//* INPDTは絶対指定パス。パス指定をしないと自分が動作しているフォルダになります。


<<<データ>>>>>>>
2014/07/03,11:11,111,122,133
2014/07/04,12:12,211,222,233
2014/07/05,13:13,311,322,333
2014/07/06,14:14,411,422,433
2014/07/07,15:15,511,522,533

データは以上の様なCSV形式の5件です。

<<<処理結果>>>>>>>
read=2014/07/03,11:11,111,122,133
処理=2014:7:3,11:11,111,122,133
read=2014/07/04,12:12,211,222,233
処理=2014:7:4,12:12,211,222,233
read=2014/07/05,13:13,311,322,333
処理=2014:7:5,13:13,311,322,333
read=2014/07/06,14:14,411,422,433
処理=2014:7:6,14:14,411,422,433
read=2014/07/07,15:15,511,522,533
処理=2014:7:7,15:15,511,522,533
データ件数=5


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
サンプルコード(データファイルの書き込み)
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
データファイルの書き込み方法は他にもありますが、以降の連続書き込みとデータ追加の2パターンがあれば大体事足りるのではないかと思います。

(注意)
■Javaコードはバージョンによって使用に影響を受ける可能性があります。(バージョンによって未サポートのためエラーとなるコードも存在します)
■例えばバックスラッシュ(\)はwindowsでは ¥ に相当します。
■このブログではバックスラッシュ(\)がまともに表示できないために全角文字で表示しています。実際に使用する時には全て半角小文字に置き換えて下さい。
■このブログではエスケープシークエンス( <BS> <HT> <LF> <FF> <CR> <”> <’> <\> )がまともに表示できないために全角文字で表示しています。これらは全て半角小文字に置き換えて見て下さい。
■この糞ブログではまともに半角小文字の空白文字表示が出来ないようです。実際のサンプルプログラムのステップで段差を付けて見易くしていますが、ここでは全て1桁目からしか表示できていません。気になる方はコピペした後に空白を挿入して修正してください。
■当サンプルはEclipse使用前提のためimportステップは省略しています。(Eclipseでは[ctrl]+[shift]+[o]で挿入されます)


■■■■■■■■■■■■■■■■■■
データの連続書き込み
■■■■■■■■■■■■■■■■■■
データの連続書き込みは、BufferedWriterを使用しています。ここでのデータ書き込みはテキスト形式です。

FileWriter文で「true」と宣言しているのは追加書き指定になります。ここではデータファイルに対して「false:上書き」するか「true:追加書き」するかの指定が可能です。

データ書き込みの際に当該データファイルが存在しなければ、自動的に作成されます。

.newLine()は改行コードです。改行コードはOS依存するのでBufferedWriterを使用する時はエスケープシークエンスで記述するよりも BufferedWriterのnewLine()で記述した方が良いと思います。


final int[] tableDT = {111,222,333,444,555};
String OUTDT = "/home/k/WORK/testOUTPUT.txt";
int ix = 0;
int max = tableDT.length;
File file = new File( OUTDT );
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(file, true)); // 追加書き
while( ix < max ){
bw.write(String.valueOf(tableDT[ix]));
bw.newLine();
System.out.println( "出力="+tableDT[ix] );
ix++;
}
bw.close();
}catch(IOException e){ System.out.println( "ERROR" ); }


<<<処理結果>>>>>>>
***出力データ(testOUTPUT.txt)**********
(最後尾行にも[改行]が入っています)
111
222
333
444
555

***表示結果**********
出力=111
出力=222
出力=333
出力=444
出力=555

■■■■■■■■■■■■■■■■■■
データの追加
■■■■■■■■■■■■■■■■■■
データの追加パターンでは、File文とtry文の中のFileWriter文がメインです。

ここでのデータ書き込みはテキスト形式です。

FileWriter文で「true」と宣言しているのは追加書き指定になります。ここではデータファイルに対して「false:上書き」するか「true:追加書き」するかの指定が可能です。

データ書き込みの際に当該データファイルが存在しなければ、自動的に作成されます。

filewriter.write文でデータに "\r\n"を付加しているのはテキストデータの場合、最後に"改行コード"が必要だからです。これを入れないと出力データが正常に書き込まれません。


final int[] table2 = {11111,22222,33333,44444,55555};
String OUTDT2 = "/home/k/WORK/testOUT2.txt";
int ix2 = 0;
int max2 = table2.length;
File file2 = new File( OUTDT2 );
while( ix2 < max2 ){
try{
FileWriter filewriter = new FileWriter(file2, true); // 追加書き
filewriter.write(table2[ix2]+"\r\n");
filewriter.close();
System.out.println( "出力2="+table2[ix2] );
ix2++;
}catch(IOException e){ System.out.println( "error" ); }
}
//* ここではバックスラッシュ(\)が表示できないために全角文字で表示しています。
//* 実際のプログラムで使用する場合は半角小文字のバックスラッシュ(\)として書き換えて下さい。


<<<処理結果>>>>>>>
***出力データ(testOUT2.txt)**********
(最後尾行にも[改行]が入っています)
(ここでの改行は「\r\n」となるため総バイト数では35バイトです)
11111
22222
33333
44444
55555

***表示結果**********
出力2=11111
出力2=22222
出力2=33333
出力2=44444
出力2=55555

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
エスケープシークエンスについて
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
Javaでは改行文字などを出力する為に特殊文字が(エスケープシークエンス)あります。エスケープシークエンスはOSに依存されます。BufferedWriterが使えるならエスケープシークエンスで記述するよりもBufferedWriterのnewLine()で記述した方がいいと思います。UNIX系での改行コードは<LF>だそうですが、Macintoshでは<CR>、Windowsでは<CR><LF>のようです。CentOSでデータを扱ってみると時折<CR>で処理されていたりでマチマチかもしてません。

「\r\n」のような表現をエスケープシークエンス(EscapeSequence)といいますが、とりあえず改行コードは "\r\n"としておけばwindowsなど他OSに持って行った場合でも正常な読み込みが可能なはずです。

-----------------------------------------
エスケープシークエンス(EscapeSequence)
-----------------------------------------
<BS> \b:backspace
<HT> \t:horizontal tab
<LF> \n:linefeed
<FF> \f:form feed
<CR> \r:carriage return
<”>   \”:double quote
<’>   \’:single quote
<\>  \\:backslash

(注意)
■Javaコードはバージョンによって使用に影響を受ける可能性があります。(バージョンによって未サポートのためエラーとなるコードも存在します)
■例えばバックスラッシュ(\)はwindowsでは ¥ に相当します。
■このブログではバックスラッシュ(\)がまともに表示できないために全角文字で表示しています。実際に使用する時には全て半角小文字に置き換えて下さい。
■このブログではエスケープシークエンス( <BS> <HT> <LF> <FF> <CR> <”> <’> <\> )がまともに表示できないために全角文字で表示しています。これらは全て半角小文字に置き換えて見て下さい。
■この糞ブログではまともに半角小文字の空白文字表示が出来ないようです。実際のサンプルプログラムのステップで段差を付けて見易くしていますが、ここでは全て1桁目からしか表示できていません。気になる方はコピペした後に空白を挿入して修正してください。
■当サンプルはEclipse使用前提のためimportステップは省略しています。(Eclipseでは[ctrl]+[shift]+[o]で挿入されます)


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
当作業の実行環境
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
◆オペレーティングシステム:CentOS release 5.9 (Final) CPU:32bit メモリ:512MB
◆Java SE Development Kit 8
(JREの環境)
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode, sharing)

--- 以上 ---
2014.10.19 / Top↑
Secret(管理者にだけ表示を許可する)


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。