■ 入出力
データの 入出力 には多数のクラスが用意されています。クラスの階層構造を下記に示します。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 は指定したファイルをバイナリファイルとして読み込みます。
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 は指定したストリームを、指定した文字コードで構成されるテキストファイルとして読み込みます。
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 より簡単に扱えますが、文字コードには常に省略時文字コードが用いられます。
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 を用います。
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 件のコメント:
コメントを投稿