1. IOフローの概要
1.IO: 入力 (入力はデータを読み取ります)/出力 (出力はデータを書き込みます)
2. ストリーム: データ伝送の抽象的な概念および総称です. つまり、デバイス間のデータ伝送をストリームと呼びます. ストリームの本質はデータ伝送です. データ伝送を扱うために IO ストリームが使用されますデバイス間の問題。
3. 一般的なアプリケーション: ファイルのアップロード、ダウンロード、コピーなど。
ファイルは通常、一連のバイトまたは文字で構成されており、ファイルを構成するバイト列をバイト ストリームと呼び、ファイルを構成する文字列を文字ストリームと呼びます。Java は、ストリームの方向に従って入力ストリームと出力ストリームに分類できます。入力ストリームは、ファイルまたは他の入力デバイスからメモリにデータをロードするプロセスです。出力ストリームはその逆で、メモリ内のデータをファイルまたは他の出力デバイスに保存します。詳細については、次の図を参照してください。
2. IOフローの分類
2.1 データフローの方向による分類:
入力ストリーム: データの読み取り: データをハードディスクからメモリに読み取ります。
出力ストリーム: データの書き込み プログラム内のデータをハードディスクに書き込みます。
2.2 データ型に応じて:
バイトストリーム: バイト入力ストリーム/バイト出力ストリーム
文字ストリーム: 文字入力ストリーム/文字出力ストリーム
2.3 IO ストリームのアプリケーション シナリオ:
プレーン テキスト ファイル。文字ストリームを優先的に使用します。
画像、ビデオ、オーディオなどのバイナリ ファイルの場合は、バイト ストリームが優先されます。
ファイルの種類がわからない場合は、最初にバイト ストリームを使用してください。バイト ストリームはユニバーサル ストリームです。
2.4 InputStream (バイト入力ストリーム)、OutputStream (バイト出力ストリーム)、Reader (文字入力ストリーム)、Writer (文字出力ストリーム)
2.4.1 InputStream (バイト入力ストリーム)
InputStream はバイト入力ストリームです。InputStream は抽象クラスです。InputStream を継承するすべてのクラスはバイト入力ストリームです。主に次のサブクラスを理解できます。
主なメソッドの紹介:
空所 |
close() |
抽象整数 |
read() は、 |
整数 |
read(byte[] b) は、 |
整数 |
read(byte[] b, int off, int len) は、 |
2.4.2 OutputStream (バイト出力ストリーム)
主なメソッドの紹介:
空所 |
close() |
空所 |
flash() は、 |
空所 |
write(byte[] b) は、 |
空所 |
write(byte[] b, int off, int len) は、 |
抽象的な空白 |
write(int b) は、 |
2.4.3 リーダー (文字入力ストリーム)
継承されたすべての Reader は文字入力ストリームです
主なメソッドの紹介:
抽象的な空白 |
close() は |
整数 |
read() |
整数 |
read(char[] cbuf) は、 |
抽象整数 |
read(char[] cbuf, int off, int len) は、 |
2.4.4 Writer (文字出力ストリーム)
継承されたすべての Writer は文字出力ストリームです
主なメソッドの紹介:
ライター |
append(char c) は、 |
抽象的な空白 |
close() |
抽象的な空白 |
flash() は |
空所 |
write(char[] cbuf) は |
抽象的な空白 |
write(char[] cbuf, int off, int len) は、 |
空所 |
write(int c) は |
空所 |
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) |
int |
read(byte[] b, int off, int 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 バイトを読み取ります。
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 バイトバッファストリームを使用してファイルコピーコードを変換する
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(); // 异常处理,打印出错信息
}
}
}