技術空間

Java

ファイルを読み込んで編集して出力する


TOP > Java > ファイルを読み込んで編集して出力する



■シンプルな入出力プログラム

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){
                }
            }
        }
    }
}



TOP > Java > ファイルを読み込んで編集して出力する

Tweet ̃Gg[͂ĂȃubN}[Nɒlj
技術空間