Java Language
InputStreamsとOutputStreams
サーチ…
構文
- int read(byte [] b)throws IOException
備考
ほとんどの場合、 InputStream
直接使用せず、 BufferedStream
使用することに注意してください。これは、 InputStream
がreadメソッドが呼び出されるたびにソースから読み込むためです。これは、カーネルとの間でのコンテキストスイッチの重要なCPU使用を引き起こす可能性があります。
InputStreamを文字列に読み込む
場合によっては、バイト入力をStringに読み込むこともできます。これを行うには、 byte
と「ネイティブJava」UTF-16コードポイントの間を変換するものをchar
として使用する必要があります。これはInputStreamReader
ます。
プロセスを少し高速化するため、バッファを割り当てるのは普通ですが、Inputから読み込む際にオーバーヘッドがあまりありません。
public String inputStreamToString(InputStream inputStream) throws Exception {
StringWriter writer = new StringWriter();
char[] buffer = new char[1024];
try (Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) {
int n;
while ((n = reader.read(buffer)) != -1) {
// all this code does is redirect the output of `reader` to `writer` in
// 1024 byte chunks
writer.write(buffer, 0, n);
}
}
return writer.toString();
}
この例をJava SE 6(およびそれ以下)互換コードに変換することは、読者の練習としては省略されています。
OutputStreamへのバイトの書き込み
一度に1バイトずつOutputStream
バイトを書き込む
OutputStream stream = object.getOutputStream();
byte b = 0x00;
stream.write( b );
バイト配列の書き込み
byte[] bytes = new byte[] { 0x00, 0x00 };
stream.write( bytes );
バイト配列のセクションを書く
int offset = 1;
int length = 2;
byte[] bytes = new byte[] { 0xFF, 0x00, 0x00, 0xFF };
stream.write( bytes, offset, length );
ストリームを閉じる
ほとんどのストリームは、終了した時点で閉じなければなりません。そうしないと、メモリリークが発生したり、ファイルを開いたままにしたりする可能性があります。例外がスローされてもストリームが閉じられることが重要です。
try(FileWriter fw = new FileWriter("outfilename");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//handle this however you
}
覚えておいてください:try-with-resourcesは、ブロックが終了したときにリソースが閉じられたこと、通常の制御フローで発生したのかどうか、または例外のためにリソースが終了したことを保証します。
リソースを試そうとするのはオプションではない場合もあれば、古いバージョンのJava 6以前をサポートしていることもあります。この場合、適切な処理はfinally
ブロックを使用することです。
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt");
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//handle this however you want
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//typically not much you can do here...
}
}
ラッパーストリームを閉じると、その基底のストリームも閉じられることに注意してください。つまり、ストリームをラップすることはできず、ラッパーを閉じてから元のストリームを使用し続けることができます。
入力ストリームを出力ストリームにコピーする
この関数は、2つのストリーム間でデータをコピーします。
void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[8192];
while ((bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
}
}
例 -
// reading from System.in and writing to System.out
copy(System.in, System.out);
入力ストリームと出力ストリームの折り返し
OutputStream
とInputStream
は多くの異なるクラスがあり、それぞれ独自の機能を持っています。ストリームを別のストリームにラップすることで、両方のストリームの機能が得られます。
何回でもストリームをラップすることができます。順序を書き留めてください。
有用な組み合わせ
バッファを使用しているときにファイルに文字を書き込む
File myFile = new File("targetFile.txt");
PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(myFile)));
バッファを使用してファイルに書き込む前にデータを圧縮および暗号化する
Cipher cipher = ... // Initialize cipher
File myFile = new File("targetFile.enc");
BufferedOutputStream outputStream = new BufferedOutputStream(new DeflaterOutputStream(new CipherOutputStream(new FileOutputStream(myFile), cipher)));
入出力ストリームラッパーのリスト
ラッパー | 説明 |
---|---|
BufferedOutputStream / BufferedInputStream | OutputStream はデータを一度に1バイトずつ書き込みますが、 BufferedOutputStream はデータをチャンクに書き込みます。これにより、システムコールの数が減り、パフォーマンスが向上します。 |
DeflaterOutputStream / DeflaterInputStream | データ圧縮を実行します。 |
InflaterOutputStream / InflaterInputStream | データの解凍を実行します。 |
CipherOutputStream / CipherInputStream | データを暗号化/復号化します。 |
DigestOutputStream / DigestInputStream | メッセージのダイジェストを生成してデータの整合性を検証します。 |
CheckedOutputStream / CheckedInputStream | CheckSumを生成します。 CheckSumはMessage Digestのより簡単なバージョンです。 |
DataOutputStream / DataInputStream | プリミティブデータ型と文字列の書き込みを許可します。バイトを書くための手段。プラットフォームに依存しない。 |
PrintStream | プリミティブデータ型と文字列の書き込みを許可します。バイトを書くための手段。プラットフォームに依存。 |
OutputStreamWriter | OutputStreamをライターに変換します。 Writerが文字を処理する間、OutputStreamはバイトを扱います |
PrintWriter | OutputStreamWriterを自動的に呼び出します。プリミティブデータ型と文字列の書き込みを許可します。厳密に文字を書くため、そして文字を書くのに最適です |
DataInputStreamの例
package com.streams;
import java.io.*;
public class DataStreamDemo {
public static void main(String[] args) throws IOException {
InputStream input = new FileInputStream("D:\\datastreamdemo.txt");
DataInputStream inst = new DataInputStream(input);
int count = input.available();
byte[] arr = new byte[count];
inst.read(arr);
for (byte byt : arr) {
char ki = (char) byt;
System.out.print(ki+"-");
}
}
}