トップページ -> 実践知識 -> Java プログラミング入門 -> テキストファイル入出力(2)
[サイトマップへ]  

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

サイト構成 連絡先,業績など 実践知識 データの扱い コンピュータ 教材 サポートページ
(FileInputStream, FileOutputStream を利用)

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

参考Webページ: http://www.atmarkit.co.jp/fjava/rensai2/jspservlet09/jspsevlet09_1.html


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

要点

package hoge.hoge.com;

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


テキストファイルから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 の中身(トークンが「/」や空白文字やタブで区切られている)

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


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

CustomerDSO.java

package hoge.hoge.com;

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

package hoge.hoge.com;

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

package hoge.hoge.com;

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

package hoge.hoge.com;

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

package hoge.hoge.com;

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

package hoge.hoge.com;

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 の中身(トークンが「/」や空白文字やタブで区切られている)

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


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

FileIoTest.java

package hoge.hoge.com;

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();
	}
}