IOフローの詳しい紹介(苗東百科事典)

1. IOフローの概要

1.IO: 入力 (入力はデータを読み取ります)/出力 (出力はデータを書き込みます)

2. ストリーム: データ伝送の抽象的な概念および総称です. つまり、デバイス間のデータ伝送をストリームと呼びます. ストリームの本質はデータ伝送です. データ伝送を扱うために IO ストリームが使用されますデバイス間の問題。

3. 一般的なアプリケーション: ファイルのアップロード、ダウンロード、コピーなど。

ファイルは通常、一連のバイトまたは文字で構成されており、ファイルを構成するバイト列をバイト ストリームと呼び、ファイルを構成する文字列を文字ストリームと呼びます。Java は、ストリームの方向に従って入力ストリームと出力ストリームに分類できます。入力ストリームは、ファイルまたは他の入力デバイスからメモリにデータをロードするプロセスです。出力ストリームはその逆で、メモリ内のデータをファイルまたは他の出力デバイスに保存します。詳細については、次の図を参照してください。

1648290969(1).png

 2. IOフローの分類

2.1 データフローの方向による分類:  

入力ストリーム: データの読み取り: データをハードディスクからメモリに読み取ります。  

出力ストリーム: データの書き込み プログラム内のデータをハードディスクに書き込みます。

1648291002(1).png

2.2 データ型に応じて:

バイトストリーム: バイト入力ストリーム/バイト出力ストリーム  

文字ストリーム: 文字入力ストリーム/文字出力ストリーム

2.3 IO ストリームのアプリケーション シナリオ:  

プレーン テキスト ファイル。文字ストリームを優先的に使用します。  

画像、ビデオ、オーディオなどのバイナリ ファイルの場合は、バイト ストリームが優先されます。 

ファイルの種類がわからない場合は、最初にバイト ストリームを使用してください。バイト ストリームはユニバーサル ストリームです。

2.4   InputStream (バイト入力ストリーム)、OutputStream (バイト出力ストリーム)、Reader (文字入力ストリーム)、Writer (文字出力ストリーム)

2.4.1   InputStream (バイト入力ストリーム)

InputStream はバイト入力ストリームです。InputStream は抽象クラスです。InputStream を継承するすべてのクラスはバイト入力ストリームです。主に次のサブクラスを理解できます。

1648291105(1).png

主なメソッドの紹介: 

空所

close()
は、この入力ストリームを閉じ、ストリームに関連付けられたすべてのシステム リソースを解放します。

抽象整数

read() は、
入力ストリームから次のデータ バイトを読み取ります。(複数の呼び出しは順番に読み取られます) -1 が返されると、読み取りが完了したことを示します

整数

read(byte[] b) は、
入力ストリームから特定のバイト数を読み取り、バッファ配列 b に格納します。

整数

read(byte[] b, int off, int len) は、
最大 len データ バイトを入力ストリームからバイト配列に読み取ります。

2.4.2   OutputStream (バイト出力ストリーム)

1648291222(1).png

主なメソッドの紹介: 

空所

close()
は、この出力ストリームを閉じ、このストリームに関連するすべてのシステム リソースを解放します。

空所

flash() は、
この出力ストリームをフラッシュし、バッファされたすべての出力バイトを強制的に書き込みます。

空所

write(byte[] b) は、
指定されたバイト配列から b.length バイトをこの出力ストリームに書き込みます。

空所

write(byte[] b, int off, int len) は、
指定されたバイト配列のオフセット off から始まる len バイトをこの出力ストリームに書き込みます。

抽象的な空白

write(int b) は、
指定されたバイトをこの出力ストリームに書き込みます。

2.4.3  リーダー (文字入力ストリーム)

継承されたすべての Reader は文字入力ストリームです

1648291279(1).png

主なメソッドの紹介:

抽象的な空白

close() は
ストリームを閉じます。

整数

read()
は 1 文字を読み取ります。(複数の呼び出しは順番に読み取られます) -1 が返されると、読み取りが完了したことを示します

整数

read(char[] cbuf) は、
文字を配列に読み取ります。

抽象整数

read(char[] cbuf, int off, int len) は、
配列の特定の部分に文字を読み取ります。

 2.4.4   Writer (文字出力ストリーム)

継承されたすべての Writer は文字出力ストリームです

1648291330(1).png

主なメソッドの紹介:

ライター

append(char c) は、
指定された文字をこのライターに追加します。

抽象的な空白

close()
はこのストリームを閉じますが、最初にフラッシュします。

抽象的な空白

flash() は
このストリームをフラッシュします。

空所

write(char[] cbuf) は
文字配列を書き込みます。

抽象的な空白

write(char[] cbuf, int off, int len) は、
文字配列の特定の部分を書き込みます。

空所

write(int c) は
1 文字を書き込みます。

空所

write(String str) は
文字列を書き込みます。

空所

write(String str, int off, int len) は、
文字列の特定の部分を書き込みます。

 3.ファイルの流れ

3.1   FileInputStream (ファイルバイト入力ストリーム)

FileInputStream: ファイル システム内のファイルから入力バイトを取得します。

FileInputStream(String name): 実際のファイルへの接続を開いて FileInputStream を作成します。ファイル システム内のパス名名によって名前が付けられます。

ステップ:

1. バイト入力ストリームオブジェクトを作成する

2. バイト入力ストリームオブジェクトのデータ読み取りメソッドを呼び出します。

3. リソースを解放する

バイトストリームからデータを読み取ります。

メソッド名

説明する

int read()

入力ストリームから 1 バイトのデータを読み取ります。戻り値が -1 の場合、ファイルが読み取られたことを示します(複数の呼び出しは順番に読み取られます)。

整数

read(byte[] b)
从输入流中读取一定数量的字节并将其存储在缓冲区数组 b 中。

int

read(byte[] b, int off, int len)
将输入流中最多 len 个数据字节读入字节数组。

InputStream in = new FileInputStream("d:/a.txt");

int c = 0;
while((c = in.read()) != -1){
    System.out.println(c);
}

in.close();

上述代码在执行时:如果在执行in.read()时没有读取到末尾,即文件还有可读取的数据,in.read()方法会返回下一个可用字节的整数值(0-255之间)。如果已经读取到了文件末尾,in.read()方法会返回-1。

3.2  FileOutputStream(文件字节输出流)

字节流写入数据常用的三种方式: 

方法名称

说明

void write(int b)

将指定的字节写入此文件输出流 一次写一个字节数据

void write(byte[] b)

将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据

void write(byte[] b, int off, int len)

将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据

void write(byte[] b, int off, int len)是Java中OutputStream类的一个方法,用于将指定字节数组中的一部分数据写入输出流。

参数解释:

  • b:要写入的字节数组。
  • off:写入的起始偏移量,即从数组的第off个位置开始写入数据。
  • len:要写入的字节数,即写入b数组中从off位置开始的连续len个字节。

如何追加写入数据:

バイト ストリームは、 new FileOutputStream(new File("mayikt.txt"), true); を通じてデータを書き込み、追加の書き込みデータを示します。2 番目のパラメーターが true の場合、バイト ストリームはファイルの最後に書き込まれます。このメソッドは、オブジェクトの構築FileOutputStream時に第 2 パラメータを に設定することでtrue追加書き込みを実装します。

InputStream in = new FileInputStream("d:/a.txt");
OutputStream out = new FileOutputStream("d:/aa.txt");

int c = 0;
while((c = in.read()) != -1){
    out.write(c);
}

in.close();
out.close();

一度に 1024 バイト、1 KB を読み取ります。 

import java.io.*;

public class Demo03 {
    public static void main(String[] args) throws IOException {
        InputStream is = new FileInputStream("d:/apache-tomcat-8.5.75.zip");
        OutputStream os = new FileOutputStream("d:/tomcat.zip",true);//append:true 追加
        byte[] b = new byte[1024];
        int len = 0;

        while ( (len = is.read(b)) != -1 ){
            os.write(b,0,len);
        }

        //关闭IO流管道 关闭的时候会有刷新作用
        is.close();
        os.close();
    }
}

3.3 FileReader (ファイル文字入力ストリーム)

FileReader はファイルを 1 文字単位で読み取ります。つまり、次のように一度に 2 バイトを読み取ります。

1648291567(1).png

Reader r = new FileReader("E:/a.txt");
int c = 0;
while((c = r.read()) != -1){
    char ch = (char)c;
    System.out.println(ch);
}
r.close();

3.4 FileWriter (ファイル文字出力ストリーム)

Reader r = new FileReader("d:/a.txt");
Writer w = new FileWriter("d:/aaa.txt",true);
int c = 0;
while((c = r.read()) != -1){
    char ch = (char)c;
    w.write(ch);
}
r.close();
w.close();

4. バッファストリーム

データをバイトごとに読み書きする従来の方法では、システム カーネル コール (ユーザー モード → カーネル モードの切り替え) が頻繁に発生するため、非常に非効率的です。

バイト バッファ ストリームを使用できます。バッファとは、システム コールの頻度を減らすために「高速」な方法でデータの書き込みまたは読み取りを行う、プールに似たメモリ領域の概念です。

コンストラクタは、ファイル パスではなく、バイト ストリーム オブジェクトを渡します。バッファ ストリームは、ブロック単位での読み取りおよび書き込み用のデータをカプセル化するバッファを提供します。データの読み取りと書き込みは依然としてバイト ストリーム オブジェクトに依存します。

注: バイト バッファリングされたストリームのデフォルトのバッファ サイズは 8K、つまり 8192 バイトです。

バッファリングされたストリームは主に効率を向上させ、物理的な読み取り回数を減らすために存在します。バッファリングされたストリームには主に次のものが含まれます: BufferedInputStream、BufferedOutputStream、BufferedReader、および BufferedWriter。BufferedReader は行を直接読み取ることができる実用的なメソッド readLine() を提供します。BufferWriter は newLine () を提供します改行を書くことができます。

4.1 バイトバッファストリームを使用してファイルコピーコードを変換する

1648291690(1).png

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:/SOFT/CentOS-7-x86_64-Minimal-2009.zip"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d:/centos.zip"));

byte[] arr = new byte[1024];
int len = 0;
while ( (len = bis.read(arr)) != -1 ){
    bos.write(arr,0,len);//将 arr 数组中的内容从0的位置到len的位置 放到bos中
}

bis.close();
bos.close();

明示的にフラッシュを呼び出すことができます。フラッシュの意味は、バッファをリフレッシュすることです。つまり、バッファ内のデータをディスクに書き込み、メモリに置かないようにすることです。os.close() を実行すると、os が実際に実行されますデフォルトでは.flush()、ここで明示的に呼び出さずに呼び出すことができます

4.2 文字バッファストリームを使用してファイルコピーコードを変換する 

BufferedReader r = new BufferedReader(new FileReader("d:/abc/a.txt"));
BufferedWriter w = new BufferedWriter(new FileWriter("d:/abc/b.txt"));

String line = null;
while( (line = r.readLine()) != null ){
    w.write(line+"\n");
}
r.close();
w.close();
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Example {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
             BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {

            String line; // 用于存储读取的每一行内容的变量

            // 循环读取input.txt文件中的每一行内容,直到读取到文件末尾为止
            while ((line = reader.readLine()) != null) {
                writer.write(line); // 将读取到的内容写入output.txt文件
                writer.newLine(); // 写入换行符
            }
        } catch (IOException e) {
            e.printStackTrace(); // 异常处理,打印出错信息
        }
    }
}

おすすめ

転載: blog.csdn.net/weixin_55772633/article/details/132346804