サーチ…


構文

  • int read(byte [] b)throws IOException

備考

ほとんどの場合、 InputStream直接使用せず、 BufferedStream使用することに注意してください。これは、 InputStreamがreadメソッドが呼び出されるたびにソースから読み込むためです。これは、カーネルとの間でのコンテキストスイッチの重要なCPU使用を引き起こす可能性があります。

InputStreamを文字列に読み込む

場合によっては、バイト入力をStringに読み込むこともできます。これを行うには、 byteと「ネイティブJava」UTF-16コードポイントの間を変換するものをcharとして使用する必要があります。これはInputStreamReaderます。

プロセスを少し高速化するため、バッファを割り当てるのは普通ですが、Inputから読み込む際にオーバーヘッドがあまりありません。

Java SE 7
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 );

ストリームを閉じる

ほとんどのストリームは、終了した時点で閉じなければなりません。そうしないと、メモリリークが発生したり、ファイルを開いたままにしたりする可能性があります。例外がスローされてもストリームが閉じられることが重要です。

Java SE 7
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 SE 6

リソースを試そうとするのはオプションではない場合もあれば、古いバージョンの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);

入力ストリームと出力ストリームの折り返し

OutputStreamInputStreamは多くの異なるクラスがあり、それぞれ独自の機能を持っています。ストリームを別のストリームにラップすることで、両方のストリームの機能が得られます。

何回でもストリームをラップすることができます。順序を書き留めてください。

有用な組み合わせ

バッファを使用しているときにファイルに文字を書き込む

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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow