SJISのファイルを読み込んでUTF8に変換したり、ちょっとした置換処理をファイルに対して行いたい場合、Javaプログラムでコードを書くと以下のようになる。
import java.io.*;
public class FileIoSample{
public static void main(String[] args){
BufferedReader br = null;
BufferedWriter bw = null;
try{
// ファイル入出力(MS932からUTF8へ変換)
br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt"), "MS932"));
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF8"));
String line;
while((line = br.readLine()) != null){
// 置換処理
line = line.replace("あ", "ア");
// ファイルへ書き込み
bw.write(line);
bw.newLine();
}
} catch(IOException e) {
e.printStackTrace();
}finally{
if(br != null){
try{
br.close();
}catch(IOException ie){
}
}
if(bw != null){
try{
bw.close();
}catch(IOException ie){
}
}
}
}
}
なおJava8からtry-with-resources構文が追加されたので、バージョンが合えば使うことも可能。
前述のコードはクローズ処理が完全ではない。
例えばFileInputStreamの生成に成功して、InputStreamReaderやBufferedReaderの生成に失敗した場合、FileInputStreamがクローズされないことになる。 上記コードで実際にInputStreamReaderやBufferedReaderするケースはほとんどないと思われるが、もし厳密にファイルクローズ処理を行う場合は以下のようにする。
import java.io.*;
public class FileIoSample2{
public static void main(String[] args){
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
FileOutputStream fos = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try{
// ファイル入力(MS932)
fis = new FileInputStream("input.txt");
isr = new InputStreamReader(fis, "MS932");
br = new BufferedReader(isr);
// ファイル出力(UTF8)
fos = new FileOutputStream("output.txt");
osw = new OutputStreamWriter(fos, "UTF8");
bw = new BufferedWriter(osw);
String line;
while((line = br.readLine()) != null){
// 置換処理
line = line.replace("あ", "ア");
// ファイルへ書き込み
bw.write(line);
bw.newLine();
}
} catch(IOException e) {
e.printStackTrace();
}finally{
if(br != null){
try{
br.close();
}catch(IOException ie){
}
}
if(isr != null){
try{
isr.close();
}catch(IOException ie){
}
}
if(fis != null){
try{
fis.close();
}catch(IOException ie){
}
}
if(bw != null){
try{
bw.close();
}catch(IOException ie){
}
}
if(osw != null){
try{
osw.close();
}catch(IOException ie){
}
}
if(fos != null){
try{
fos.close();
}catch(IOException ie){
}
}
}
}
}
クローズする順番は生成した順序と逆になる。クローズ時もIOExceptionが発生する可能性があるので、必要に応じてエラー処理を記述する。コードが長くなるのでメソッド化を検討するとよい。
前述のコードはファイル入力処理をしながら出力処理を行っているが、入力と出力を分けると以下のようになる。
import java.io.*;
public class FileIoSample3{
public static void main(String[] args){
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
try{
// ファイル入力(MS932)
br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt"), "MS932"));
String line;
while((line = br.readLine()) != null){
// 置換処理
line = line.replace("あ", "ア");
// バッファへ追加
sb.append(line);
sb.append("\r\n");
}
} catch(IOException e) {
e.printStackTrace();
}finally{
if(br != null){
try{
br.close();
}catch(IOException ie){
}
}
}
BufferedWriter bw = null;
try{
// ファイル出力(UTF8)
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF8"));
// ファイルへ書き込み
bw.write(sb.toString());
} catch(IOException e) {
e.printStackTrace();
}finally{
if(bw != null){
try{
bw.close();
}catch(IOException ie){
}
}
}
}
}