2011年9月3日土曜日

Java入出力

■ 入出力

データの 入出力 には多数のクラスが用意されています。クラスの階層構造を下記に示します。InputStream系クラスは主にバイナリデータを扱う際に、Reader系クラスは主にテキストデータを扱う際に用いられます。

□ Object ├□ InputStream(抽象クラス:主にバイナリ用) │├□ AudioInputStream │├□ ByteArrayInputStream │├□ FileInputStream(バイナリファイル読み込み) │├□ FilterInputStream ││├□ BufferedInputStream(非推奨) ││├□ CheckedInputStream ││├□ CipherInputStream ││├□ DataInputStream ││├□ DigestInputStream ││├□ InflaterInputStream │││├□ GZIPInputStream │││└□ ZipInputStream │││ └□ JarInputStream ││├□ LineNumberInputStream ││├□ ProgressMonitorInputStream ││└□ PushbackInputStream │├□ ObjectInputStream │├□ PipedInputStream │├□ SequenceInputStream │└□ StringBufferInputStream └□ Reader(抽象クラス:主にテキスト用)  ├□ BufferedReader(1行ずつ読み込む)  │└□ LineNumberReader  ├□ CharArrayReader  ├□ FilterReader  │└□ PushbackReader  ├□ InputStreamReader(文字コード指定が可能)  │└□ FileReader(テキストファイル読み込み)  ├□ PipedReader  └□ StringReader 

■ バイナリファイルを読み込む(FileInputStream)

FileInputStream は指定したファイルをバイナリファイルとして読み込みます。

§FileInputStreamTest.java
import java.io.*;  class FileInputStreamTest {     public static void main(String[] args) {         try {             FileInputStream in = new FileInputStream("file.txt");             int ch;             while ((ch = in.read()) != -1) {                 System.out.print(Integer.toHexString(ch) + " ");             }             in.close();         } catch (IOException e) {             System.out.println(e);         }     } } 

シフトJISの「あいう」という内容のファイルを読み込んだ場合、結果は次のようになります。82a0 は「あ」、82a2 は「い」、82a4 は「う」のシフトJIS文字コード、d は復帰コード(CR)、a は改行(LF)コードです。漢字コードがそのまま、1バイトずつ読み込まれています。

82 a0 82 a2 82 a4 d a 

■ テキストファイルを読み込む(InputStreamReader)

InputStreamReader は指定したストリームを、指定した文字コードで構成されるテキストファイルとして読み込みます。

§InputStreamReaderTest.java
import java.io.*;  class InputStreamReaderTest {     public static void main(String[] args) {         try {             FileInputStream is = new FileInputStream("file.txt");             InputStreamReader in = new InputStreamReader(is, "SJIS");             int ch;             while ((ch = in.read()) != -1) {                 System.out.print(Integer.toHexString(ch) + " ");             }             in.close();         } catch (IOException e) {             System.out.println(e);         }     } } 

「あいう」という内容のファイルを読み込んだ場合、結果は次のようになります。

3042 3044 3046 d a 

3042 は「あ」、3044 は「い」、3046 は「う」の Unicode表現です。InputStreamReader を用いることでシフトJIS のファイルを Java の標準文字コードである Unicode に変換しながら読み込むことができました。

文字コード "SJIS" を省略した場合は、プラットフォームに依存したデフォルト(省略時の)文字コードで読み出されます。日本語 Windows の場合のデフォルト文字コードは "MS932" になります。SJIS と MS932 はほとんど同じものですが、「〜」や「‖」など一部の文字で動作が異なります。

文字コード 説明
ISO-8859-1 ASCII。
ISO-2022-JP JISコード。
Shift_JIS JDK1.1 までは SJIS と同義。JDK1.2 からは MS932 と同義。
SJIS シフトJIS。
MS932 Microsoft 932。シフトJISとほぼ同様だが若干異なる。
CP932 Code Page 932。MS932 とほぼ同様だが若干異なる。
EUC_JP EUC。

使用可能な文字コードに関しては下記のページを参照してください。

■ テキストファイルを読み込む(FileReader)

FileReader は InputStreamReader の面倒さを解消するために用意されたサブクラスです。InputStreamReader より簡単に扱えますが、文字コードには常に省略時文字コードが用いられます。

§FileReaderTest.java
import java.io.*;  class FileReaderTest {     public static void main(String[] args) {         try {             FileReader in = new FileReader("file.txt");             int ch;             while ((ch = in.read()) != -1) {                 System.out.print(Integer.toHexString(ch) + " ");             }             in.close();         } catch (IOException e) {             System.out.println(e);         }     } } 
FileReader in = new FileReader("file.txt"); 

は、下記のコードとほぼ同じ意味を持ちます。

FileInputStream is = new FileInputStream("file.txt"); InputStreamReader in = new InputStreamReader(is); 

■ ファイルを1行ずつよみこむ(BufferedReader)

ファイルを 1行ずつ読み込むには BufferedReader を用います。

§BufferedReaderTest.java
import java.io.*;  class BufferedReaderTest {     public static void main(String[] args) {         try {             FileReader in = new FileReader("file.txt");             BufferedReader br = new BufferedReader(in);             String line;             while ((line = br.readLine()) != null) {                 System.out.println(line);             }             br.close();             in.close();         } catch (IOException e) {             System.out.println(e);         }     } }
 
 
 

0 件のコメント:

コメントを投稿