2009年6月8日月曜日

Java テキストファイルから1文字づつ文字を読み込む

FileReaderクラスのreadメソッドを使用してファイルから1文字づつ文字を読み込みます。
readメソッドを使用して読み込んだ値は文字コードを表すint型の値として取得でき、char型にキャストすることで文字に変換します。
readメソッドはファイルの終わりに達すると-1を返します。

package FileAccess;

import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class FileReadSample01 extends Frame implements ActionListener{



private static final long serialVersionUID = 1L;

public static void main(String args[]){
new FileReadSample01();
}

Frame frm = this;
TextArea txtBody;
Button btnOpen;

public FileReadSample01(){
this.setTitle("FileReadSample01");
this.setSize(300,300);

txtBody = new TextArea();
this.add(txtBody,BorderLayout.CENTER);

btnOpen = new Button("Load");
btnOpen.addActionListener(this);

Panel pnl = new Panel();
pnl.add(btnOpen);  
this.add(pnl,BorderLayout.SOUTH);

this.setVisible(true);
}

public void actionPerformed(ActionEvent ev){
OpenFile();
}

/*
* ファイルを開きます。
*/
private void OpenFile(){
//ファイルを開くダイアログを表示します。
String path = null;
FileDialog fd = new FileDialog(this , "ファイルを開く" , FileDialog.LOAD);
try{
fd.setVisible(true);
if (fd.getFile() != null){
path = fd.getDirectory() + fd.getFile();
}
}finally{
fd.dispose();
}
//ファイルパスがnullの場合は処理を中止します。
if (path == null){
return; 
}
//ファイルから1文字づつ読み込みます。
FileReader fr = null;
StringBuffer sb = null;
try {
fr = new FileReader(path);
sb = new StringBuffer();
int ch;
while ((ch = fr.read()) != -1){
sb.append((char)ch);
}
txtBody.setText(sb.toString()); 
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try {
if (fr != null){
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


readメソッドは他にもいくつかのオーバーロードがあります。
int read()単一文字を読み込みます。
int read(char[] cbuf)引数に指定した配列に文字を読み込みます。
abstract int read(char[] cbuf,int off,int len)文字を読み込んでcbufのoffに指定したオフセット位置からlenバイト分を格納します。


ファイルの最初から10バイト分のデータを取得するするには、int read(char[] cbuf)を使用します。
FileReader fr = null;
char[] buff = new char[10];
try {
fr = new FileReader(path);
fr.read(buff);
txtBody.setText(new String(buff));
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try {
if (fr != null){
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}


read(char[] cbuf,int off,int len)はファイルの先頭から文字を読み込んでcbufのoffに指定したオフセット位置からlenバイト分を格納します。
ファイルの先頭から文字を読み込み、buff配列のオフセットが3の位置から7バイト分を読み込みます。
FileReader fr = null;
char[] buff = new char[10];
try {
fr = new FileReader(path);
fr.read(buff,3,7);

System.out.println(new String(buff));
txtBody.setText(new String(buff,3,7));
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try {
if (fr != null){
fr.close(); 
}
} catch (IOException e) {
e.printStackTrace();
}
}

0 件のコメント: