I/O


「JavaのInputとOntputを勉強します.」

勉強する

  • ストリーム/バッファ/チャネルベースI/O
  • InputStream
  • ByteおよびCharacterストリーム
  • 標準ストリーム(System.in、System.out、System.err)
  • ファイル読み書き
  • I/O?


    入力と出力は入力と出力の略で、入力と出力と略称される.入出力とは、コンピュータ内部または外部のデバイスとプログラムとの間でデータを交換することである.

    ストリーム(stream)


    JavaでI/Oを実行するために、1つのターゲットから別のターゲットに2つのターゲットを接続してデータを転送することをストリーム(stream)と呼びます.ストリームは、連続するデータストリームを水に例えて命名され、水が一方向に流れるように、ストリームも一方向に通信するしかないため、1つのストリームの入力と出力を同時に処理することはできない.

    したがって、入出力を同時に実行するためには、入力ストリームと出力ストリームの両方に2つのストリームが必要である.
    ストリームはまず送信されたデータを受信し,中間はホップせず,連続的にデータを交換する.Queueと同じFIFO構造だと考えればいいです.

    バイトベースのストリーム-InputStream、OutputStream


    ストリームはバイト単位でデータを転送し、I/Oターゲットに応じて複数のI/Oストリームがある.
    InputStreamとOutputStreamは、バイトベースのすべてのストリームの祖先であり、次の方法を宣言しています.
  • InputStreamのメソッド
  • メソッド名機能int available()は、ストリームから読み出されるデータサイズを返す.void close()ストリームを閉じて、使用中のリソースを返します.void mark(int readlimit)現在位置が表示されます.その後reset()でマークされた位置に戻ることができます.readlimitは、返されるバイト数です.boolean markSupported()mark()とreset()がサポートされているかどうかを通知します.mark()およびreset()機能をサポートすることはオプションなので、mark()およびreset()を使用する前に、markSupported()を呼び出してサポートするかどうかを決定する必要があります.abstract int read()1バイト(0~255の値)を読み込みます.読み込むデータがない場合は、-1を返します.抽象的な方法なので、InputStreamの子孫は自分の都合で実施すべきです.int read(byte[] b)配列bのサイズで読み出し、配列を埋めて読み出したデータ数を返します.返される値は常に配列のサイズ以下です.int read(byte[] b, int off, int len)最大lenバイトを読み出し、配列bの指定位置(off)から格納を開始する.実際に読み込まれたデータはlen個より少ない場合があります.void reset()タグ()を最後に呼び出されたストリームの場所に戻します.long skip(long n)ストリームで所与の長さ(n)をスキップする.
  • OutputStreamのメソッド
  • メソッド名機能void close()は、入力元を閉じるためのリソースを返します.void flush()ストリームバッファ内のすべてのコンテンツを出力元に書き込みます.abstract void write(int b)出力元に所定の値を書き込みます.void write(byte[] b)所与の配列bに格納された全てのコンテンツが出力元に書き込まれる.void write(byte[] b, int off, int len)所与の配列bに格納されたコンテンツのうち、offからのみlen個が読み出され、出力ソースに書き込まれる.

    ByteArrayInputStream, ByteArrayOutputStream


    ストリームを使用するI/O方式は同じで、ストリームのタイプが異なる場合でも、次の例では異なります.
    一般的ではありませんが、ByteArrayInputStream、ByteArrayOutputStreamは、メモリ(バイト配列)にデータを入力するためのストリームです.主に入力が他の位置に出力される前に、バイト配列に一時的にデータを入れて変換するなどの操作に用いられる.
    import java.io.*;
    import java.util.Arrays;
    
    class IOExample {
        public static void main(String[] args) }
            byte[] inSrc = {0,1,2,3,4,5,6,7,8,9};
            byte[] outSrc = null;
            byte[] temp = new byte[4];
            
            ByteArrayInputStream input = null;
            ByteArrayOutputStream output = null;
            
            input = new ByteArrayInputStream(inSrc);
            output = new ByteArrayOutputStream();
    
            try {
                while (input.available() > 0) {
                    int len = input.read(temp);
                    output.write(temp, 0, len);
                }
            } catch (IOException e) { }
            
            outSrc = output.toByteArray();
            
            System.out.println("Input Source :" + Arrays.toString(inSrc));
            System.out.println("temp :" + Arrays.toString(temp));
            System.out.println("Output Source :" + Arrays.toString(outSrc));
        }
    }
    //read()またはwrite()はIOExceptionを生成するのでtry-catch文でマスクできます.

    ByteとCharacterストリーム


    データがどのように伝送されるかによって、ストリームは2つに分けられます.

    Byte Stream


    は、バイナリデータを入出力するストリームです.主に画像、ビデオなどの送受信に用いられる.
  • InputStream/OutputStream:バイトベースの入出力ストリームの最上位祖先
  • ByteArrayInputStream/ByteArrayOutputStream:byte array(byte[])のデータのI/Oクラス
  • FileInputStream/FileOutputStream:ファイルデータのI/Oクラス
  • Character Stream


    textデータを入出力するためのストリーム.主にHTMLドキュメント、テキストファイルの送受信に使用されます.
  • Reader/Writer:Characterベースの入出力ストリームの最適な祖先
  • FileReader/FileWriter:文字ベースのファイルのI/Oクラス
  • 標準ストリーム(System.in、System.out、System.err)


    Javaで定義されている標準I/Oクラス.Javaアプリケーションを実行するときに使用できるように自動的に生成されるので、開発者が個別のストリームコードを作成する必要はありません.
  • System.in:コンソールからデータを受信する
  • System.out:コンソール
  • にデータを出力する
  • System.err:コンソールにエラーを出力する


  • システムクラスのソースから,in,out,errはシステムクラスで宣言されるクラス変数(静的変数)である.

    BufferedReader, BufferedWriter

    BufferedReaderBufferedWriterは、バッファを利用して入出力効率を向上させることができる.バッファを使用すると、入出力の効率が比べものにならないほど向上するので、使用したほうがいいです.特にPSの問題を解くときによく使われます.
    import java.io.*;
    
    class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in);
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            
            String input = br.readLine();
            bw.wirte(input);
            bw.flush();
            
            br.close();
            bw.close();
        }
    }
    //次のリンクを参照->Java Java Java I/O BufferedReader/BufferedWriter

    ファイルの読み込みと書き込み


    ファイルの読み込み(Read)


    FileReaderオブジェクトとBufferReaderオブジェクトを使用します.
    String fileName = "C:/test.txt" // 읽어들일 파일명
    
    FileReader fileReader = new FileReader(fileName);
    BufferedReader reader = new BufferedReader(fileReadrer);
    
    String line = null;
    while((line = reader.readLine()) != null) { // readLine() 은 한줄 단위로 읽어들임
       System.out.println(line);
    }
    
    reader.close();

    書き込みファイル(Write)


    FileWriterオブジェクトとBufferWriterオブジェクトを使用します.
    String fileName = "C:/test.txt" // 생성할 파일명
    String str = "abc" // 작성할 문자열
    
    FileWriter fileWriter = new FileWriter(fileName);
    BufferedWriter out = new BufferedWriter(fileWriter);
    out.write(str); // 쓰기
    out.newLine(); // 줄바꾸기
    out.close();

    References

  • Javaのクラシック版
  • JDK 14 Documentation