金子邦彦研究室プログラミングJava のプログラム例テキストファイル入出力(2)(Java を使用)

テキストファイル入出力(2)

【サイト内の Java 関連の資料】

FileInputStream, FileOutputStream を利用

StringBufferとappendとStringTokenizerを使ったプログラム

テキストファイルから1行単位で読み込み、行番号を付けて書き出す

要点

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class HelloWorld {
    private static String inFileName = "c:\\in.txt";
    private static String outFileName = "c:\\out.txt";
    /* Shift_JIS, ISP-2022-JP, EUC-JP Windows-31J */
    /* 出力時に JISAutoDetect の指定は不可 */
    private static String outFileCoding = "Shift_JIS";
    
    /* テキストファイルの読み出しと書き込みのサンプルプログラム */
    /* (注)バイナリファイルのときは,DataInputStream, DataOutputStream */
    public static void main(String[] args) {
        try{
            String line;
            int i = 0;
            BufferedReader buf =
                new BufferedReader( new InputStreamReader( new FileInputStream( inFileName ), "JISAutoDetect" ) );
            /* ファイルが存在しない場合には新たに作成.存在する場合には上書き */
            BufferedWriter outFile =
                                new BufferedWriter( new OutputStreamWriter( new FileOutputStream( outFileName ), outFileCoding ) );
            while( (line=buf.readLine()) != null ) {
                StringBuffer out = new StringBuffer();
                i++;
                out.append(Integer.toString(i));
                out.append(":");
                out.append(line);
                outFile.write(out.toString());
                outFile.newLine();
                System.out.println(out);
            }
            buf.close();
            outFile.flush();
            outFile.close();
        }    
        catch(IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}

[image]

テキストファイルから1行単位で読み込み,トークンの区切り文字を,別の文字列に置き換えてて書き出す

要点

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class HelloWorld {
    private static String inFileName = "c:\\in.txt";
    private static String outFileName = "c:\\out.txt";
    /* Shift_JIS, ISP-2022-JP, EUC-JP Windows-31J */
    /* 出力時に JISAutoDetect の指定は不可 */
    private static String outFileCoding = "Shift_JIS";
    /* トークンの区切り文字を設定 */
    private static String seperator = "/ \t";
    private static String new_seperator = ", ";
    
    /* テキストファイルの読み出しと書き込みのサンプルプログラム */
    /* (注)バイナリファイルのときは,DataInputStream, DataOutputStream */
    public static void main(String[] args) {
        try{
            String line;
            int i = 0;
            BufferedReader buf =
                new BufferedReader( new InputStreamReader( new FileInputStream( inFileName ), "JISAutoDetect" ) );
            /* ファイルが存在しない場合には新たに作成.存在する場合には上書き */
            BufferedWriter outFile =
                                new BufferedWriter( new OutputStreamWriter( new FileOutputStream( outFileName ), outFileCoding ) );
            while( (line=buf.readLine()) != null ) {
                StringTokenizer st = new StringTokenizer(line, seperator);
                // トークン数の取得
                System.out.print( st.countTokens() + "," );

                StringBuffer out = new StringBuffer();
                while (st.hasMoreTokens()) {
                    out.append(st.nextToken());
                    // 区切られたトークンは new_seperator で区切りなおす
                    out.append( new_seperator );
                }
                outFile.write(out.toString());
                outFile.newLine();
                System.out.println(out);
            }
            buf.close();
            outFile.flush();
            outFile.close();
        }    
        catch(IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}

C:\in.txt の中身(トークンが「/」や空白文字やタブで区切られている)

[image]

C:\out.txt の中身(個々のトークンの後ろに「, 」が付く)

[image]

タブ等で区切られた顧客データ(in.txt)をcsv形式に変換

CustomerDSO.java

public class CustomerDSO {
    private String ID;
    private String name;
    private String age;
    private String address;
    private String phone_num;
    public String getID() {
        return ID;
    }
    public void setID(String id) {
        ID = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getPhone_num() {
        return phone_num;
    }
    public void setPhone_num(String phone_num) {
        this.phone_num = phone_num;
    }
}

CustomerDAO.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.StringTokenizer;

public class CustomerDAO {
    private static String inFileName = "c:\\in.txt";
    private static String outFileName = "c:\\out.txt";
    /* Shift_JIS, ISP-2022-JP, EUC-JP Windows-31J */
    /* 出力時に JISAutoDetect の指定は不可 */
    private static String outFileCoding = "Shift_JIS";
    /* トークンの区切り文字を設定 */
    private static String seperator = ",/ \t\r\n";
    private static String new_seperator = ", ";
    
    /* テキストファイルからの読み出し */
    public static LinkedList<CustomerDSO> readFromTextFile( final String inFileName, final String seperator ) {
        // inFileName の例  "c:\\in.txt"
        // seperator の例 ",/ \t\r\n"
        // inFileName から読み込んで,seperator で区切る
        try{
            String line;
            int i = 0;
            BufferedReader buf =
                new BufferedReader( new InputStreamReader( new FileInputStream( inFileName ), "JISAutoDetect" ) );
            LinkedList<CustomerDSO> list = new LinkedList<CustomerDSO>();
            
            while( (line=buf.readLine()) != null ) {
                /* 空行は読み飛ばす */
                if ( line.length() == 0 ) {
                    continue;
                }
                
                /* 顧客データの読み込み */
                StringTokenizer st = new StringTokenizer(line, seperator);
                CustomerDSO k = new CustomerDSO();
                k.setID(         st.nextToken() );
                k.setName(         st.nextToken() );
                k.setAge(        st.nextToken() );
                k.setAddress(    st.nextToken() );
                k.setPhone_num(    st.nextToken() );
                // 要素数のカウント
                i++;
                
                // リストに追加
                list.add(k);
                
                // デバック表示
                /*
                StringBuffer out = new StringBuffer();
                out
                .append(k.getID()).append(",")
                .append(k.getName()).append(",")
                .append(k.getAge()).append(",")
                .append(k.getAddress()).append(",")
                .append(k.getPhone_num());
                System.out.println(out);
                */
            }
            buf.close();
            return list;
        }            
        catch(IOException e) {
            e.printStackTrace();
            System.exit(1);
            return null;
        }
    }

    /* テキストファイルからの読み出し */
    public static void writeToTextFile( final String おうtFileName, final String outFileCoding, final String seperator, LinkedList<CustomerDSO> list ) {
        // outFileName の例  "c:\\out.txt"
        // outFileCoding の例 "Shift_JIS" ・・・ Shift_JIS, ISP-2022-JP, EUC-JP, Windows-31J のいずれか
        // seperator の例 "," (1文字でなくてもよい)
        // outFileName に書き込む.トークンを,seperator で区切る
        try{
            BufferedWriter outFile =
                new BufferedWriter( new OutputStreamWriter( new FileOutputStream( outFileName ), outFileCoding ) );
            
            ListIterator<CustomerDSO> it = list.listIterator();
            
            while( it.hasNext() ) {
                // 書き込み
                CustomerDSO k = it.next();
                StringBuffer out = new StringBuffer();
                out
                .append(k.getID()).append(seperator)
                .append(k.getName()).append(seperator)
                .append(k.getAge()).append(seperator)
                .append(k.getAddress()).append(seperator)
                .append(k.getPhone_num());
                outFile.write(out.toString());
                outFile.newLine();
            }
            outFile.flush();
            outFile.close();
            return;
        }            
        catch(IOException e) {
            e.printStackTrace();
            System.exit(1);
            return;
        }
    }
}

HelloWorld.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class HelloWorld {
    private static String inFileName = "c:\\in.txt";
    private static String outFileName = "c:\\out.txt";
    /* Shift_JIS, ISP-2022-JP, EUC-JP Windows-31J */
    /* 出力時に JISAutoDetect の指定は不可 */
    private static String outFileCoding = "Shift_JIS";
    /* トークンの区切り文字を設定 */
    private static String in_seperator = ",/ \t\r\n";
    private static String out_seperator = ",";
    
    /* テキストファイルの読み出しと書き込みのサンプルプログラム */
    /* (注)バイナリファイルのときは,DataInputStream, DataOutputStream */
    public static void main(String[] args) {
            CustomerDAO dao = new CustomerDAO();
            LinkedList>CustomerDSO> list = dao.readFromTextFile(inFileName, in_seperator);
            dao.writeToTextFile(outFileName, outFileCoding, out_seperator, list);
    }
}

in.txt

0001    九大 一郎    18    福岡市西区    000-000-0000
0002    九大 二郎    20    福岡市東区    000-000-0001
0003    九大 三郎    22    福岡市南区    000-000-0002

out.txt

0001,九大 一郎,18,福岡市西区,000-000-0000
0002,九大 二郎,20,福岡市東区,000-000-0001
0003,九大 三郎,22,福岡市南区,000-000-0002

タブ等で区切られたテーブルデータ(in.txt)をcsv形式に変換

TableDSO.java

import java.util.LinkedList;
import java.util.ListIterator;

public class TableDSO {
    private LinkedList<LinkedList<String>> table;
    
    public TableDSO() {
        this.table = new LinkedList<LinkedList<String>>();
    }

    public LinkedList<LinkedList<String>> getTable() {
        return table;
    }
    public ListIterator<LinkedList<String>> getIterator() {
        return table.listIterator();
    }
    public void setTable(LinkedList<LinkedList<String>> table) {
        this.table = table;
    }
    
    public void insertIntoTable(LinkedList<String> tuple) {
        this.table.add(tuple);
    }
    
}

TableDAO.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.StringTokenizer;

public class TableDAO {
    private static String inFileName = "c:\\in.txt";
    private static String outFileName = "c:\\out.txt";
    /* Shift_JIS, ISP-2022-JP, EUC-JP Windows-31J */
    /* 出力時に JISAutoDetect の指定は不可 */
    private static String outFileCoding = "Shift_JIS";
    /* トークンの区切り文字を設定 */
    private static String seperator = ",/ \t\r\n";
    private static String new_seperator = ", ";
    
    /* テキストファイルからの読み出し */
    public static TableDSO readFromTextFile( final String inFileName, final String seperator ) {
        // inFileName の例  "c:\\in.txt"
        // seperator の例 ",/ \t\r\n"
        // inFileName から読み込んで,seperator で区切る
        try{
            String line;
            int i = 0;
            BufferedReader buf =
                new BufferedReader( new InputStreamReader( new FileInputStream( inFileName ), "JISAutoDetect" ) );
            TableDSO table = new TableDSO();
            
            while( (line=buf.readLine()) != null ) {
                /* 空行は読み飛ばす */
                if ( line.length() == 0 ) {
                    continue;
                }
                
                /* 顧客データの読み込み */
                StringTokenizer st = new StringTokenizer(line, seperator);
                LinkedList<String> tuple = new LinkedList<String>();
                while( st.hasMoreTokens() ) {
                    tuple.add( st.nextToken() );
                }
                i++;
                
                // テーブルに追加
                table.insertIntoTable(tuple);
                
                // デバック表示
                /*
                StringBuffer out = new StringBuffer();
                out
                .append(k.getID()).append(",")
                .append(k.getName()).append(",")
                .append(k.getAge()).append(",")
                .append(k.getAddress()).append(",")
                .append(k.getPhone_num());
                System.out.println(out);
                */
            }
            buf.close();
            return table;
        }            
        catch(IOException e) {
            e.printStackTrace();
            System.exit(1);
            return null;
        }
    }

    /* テキストファイルからの読み出し */
    public static void writeToTextFile( final String おうtFileName, final String outFileCoding, final String seperator, TableDSO table ) {
        // outFileName の例  "c:\\out.txt"
        // outFileCoding の例 "Shift_JIS" ・・・ Shift_JIS, ISP-2022-JP, EUC-JP, Windows-31J のいずれか
        // seperator の例 "," (1文字でなくてもよい)
        // outFileName に書き込む.トークンを,seperator で区切る
        try{
            BufferedWriter outFile =
                new BufferedWriter( new OutputStreamWriter( new FileOutputStream( outFileName ), outFileCoding ) );
            
            ListIterator<LinkedList<String>> it = table.getIterator();
            
            while( it.hasNext() ) {
                // 書き込み
                LinkedList<String> tuple = it.next();
                StringBuffer out = new StringBuffer();
                ListIterator<String> it2 = tuple.listIterator();
                /* 第一列 */
                if ( it2.hasNext() ) {
                    String s= it2.next();
                    out.append(s);
                }
                /* 第二列目以降 */
                while( it2.hasNext() ) {
                    String s = it2.next();
                    out.append(seperator).append(s);
                }
                outFile.write(out.toString());
                outFile.newLine();
            }
            outFile.flush();
            outFile.close();
            return;
        }            
        catch(IOException e) {
            e.printStackTrace();
            System.exit(1);
            return;
        }
    }
}

HelloWorld.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class HelloWorld {
    private static String inFileName = "c:\\in.txt";
    private static String outFileName = "c:\\out.txt";
    /* Shift_JIS, ISP-2022-JP, EUC-JP Windows-31J */
    /* 出力時に JISAutoDetect の指定は不可 */
    private static String outFileCoding = "Shift_JIS";
    /* トークンの区切り文字を設定 */
    private static String in_seperator = ",/ \t\r\n";
    private static String out_seperator = ",";
    
    /* テキストファイルの読み出しと書き込みのサンプルプログラム */
    /* (注)バイナリファイルのときは,DataInputStream, DataOutputStream */
    public static void main(String[] args) {
            TableDAO dao = new TableDAO();
            TableDSO table = dao.readFromTextFile(inFileName, in_seperator);
            dao.writeToTextFile(outFileName, outFileCoding, out_seperator, table);
    }
}

C:\in.txt の中身(トークンが「/」や空白文字やタブで区切られている)

[image]

C:\out.txt の中身(個々のトークンが「,」で区切られる)

[image]

ファイルの入出力に関するプログラム

FileIoTest.java

import java.util.*;
import java.io.*;

public class FileIoTest {

    /**
     * @param args
     */
    private static String inFileName;
    private static String outFileName;
    
    /* Shift_JIS, ISP-2022-JP, EUC-JP Windows-31J */
    private static String outFileCoding = "Shift_JIS";
    
    public static void readAndWriteTest(){
        try{
            String line;
            BufferedReader inFile = new BufferedReader(
                    new InputStreamReader( new FileInputStream( inFileName ), "JISAutoDetect" ) );
            /* ファイルが存在しない場合には新たに作成.存在する場合には上書き */
            BufferedWriter outFile = new BufferedWriter(
                    new OutputStreamWriter( new FileOutputStream( outFileName ), outFileCoding ) );
            while((line=inFile.readLine()) != null){
                outFile.write(line);
                outFile.newLine();
                System.out.println(line);
            }
            outFile.close();
        }
        catch(IOException e){
            e.printStackTrace();
        }
    }
    
    public static void remakeStringTest(String preString, String postString){
        try{
            
            String line;
            StringBuffer SB;
            BufferedReader inFile = new BufferedReader(
                    new InputStreamReader( new FileInputStream( inFileName ), "JISAutoDetect" ) );
            /* ファイルが存在しない場合には新たに作成.存在する場合には上書き */
            BufferedWriter outFile = new BufferedWriter(
                    new OutputStreamWriter( new FileOutputStream( outFileName ), outFileCoding ) );
            while((line=inFile.readLine()) != null){
                SB = new StringBuffer().append(preString).append(line).append(postString);
                outFile.write(SB.toString());
                outFile.newLine();
                System.out.println(SB.toString());
            }
            outFile.close();
        }
        catch(IOException e){
            e.printStackTrace();
        }
    }
    
    public static void searchAndReplaceTest(String search, String replace){
        try{
            
            String line;
            StringBuffer SB;
            StringTokenizer ST;
            BufferedReader inFile = new BufferedReader(
                    new InputStreamReader( new FileInputStream( inFileName ), "JISAutoDetect" ) );
            /* ファイルが存在しない場合には新たに作成.存在する場合には上書き */
            BufferedWriter outFile = new BufferedWriter(
                    new OutputStreamWriter( new FileOutputStream( outFileName ), outFileCoding ) );
            while((line=inFile.readLine()) != null){
                ST = new StringTokenizer(line, search);
                SB = new StringBuffer(ST.nextToken());
                for(int i=0;i < ST.countTokens();i++)
                    SB.append(replace).append(ST.nextToken());
                outFile.write(SB.toString());
                outFile.newLine();
                System.out.println(SB.toString());
            }
            outFile.close();
        }
        catch(IOException e){
            e.printStackTrace();
        }
    }
    
    public static void AdjustmentDocumentTest(){
        try{
            
            String line;
            StringBuffer SB, SB2;
            StringTokenizer ST, ST2;
            BufferedReader inFile = new BufferedReader(
                    new InputStreamReader( new FileInputStream( inFileName ), "JISAutoDetect" ) );
            /* ファイルが存在しない場合には新たに作成.存在する場合には上書き */
            BufferedWriter outFile = new BufferedWriter(
                    new OutputStreamWriter( new FileOutputStream( outFileName ), outFileCoding ) );
            
            //SB : ファイル内の全ての文書を格納
            SB = new StringBuffer();
            while((line=inFile.readLine()) != null) SB.append(line);
            
            //ST : 1センテンス毎に文書を区切る
            ST = new StringTokenizer(SB.toString(), ".");
            while(ST.hasMoreTokens()){
                
                //ST2 : スペース毎にセンテンスを区切る
                ST2 = new StringTokenizer(
                        new StringBuffer().append(ST.nextToken()).toString(),
                        " ");
                
                //SB2 : 整形後のセンテンスを格納
                SB2 = new StringBuffer(ST2.nextToken());
                while(ST2.hasMoreTokens())
                    SB2.append(" ").append(ST2.nextToken());
                
                line = SB2.append(".").toString();
                outFile.write(line);
                outFile.newLine();
                System.out.println(line);
            }
            outFile.close();
        }
        catch(IOException e){
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        inFileName = "in.txt";
        outFileName = "out1.txt";
        System.out.println("readAndWriteTest::");
        readAndWriteTest();

        //inFileName = "in.txt";
        outFileName = "out2.txt";
        System.out.println("");
        System.out.println("remakeStringTest::");
        remakeStringTest("<", ">");

        //inFileName = "in.txt";
        outFileName = "out3.txt";
        System.out.println("");
        System.out.println("searchAndReplaceTest::");
        searchAndReplaceTest("bcd = ", "XYZ");

        inFileName = "inEng.txt";
        outFileName = "outEng.txt";
        System.out.println("");
        System.out.println("AdjustmentDocumentTest::");
        AdjustmentDocumentTest();
    }
}