[クレイジーJava]I/O:バイトフロー、文字フロー
!!Javaのバイトストリームと文字ストリームの操作方式は非常に似ており、方法とパラメータの共通点が非常に多いため、入力ストリームと出力ストリームに基づいて、入力ストリームと出力ストリームの中でバイトストリームと文字ストリームをさらに細分化する.
1.ストリーム内のバイトストリームと文字ストリームを入力します.
1)InputStreamとReaderはそれぞれ入力ストリームのバイトストリームと文字ストリームを表す.
2)この2つのクラスはすべての入力ストリームの抽象ベースクラスであり、それ自体はインスタンスオブジェクトとして操作することはできないが、これらはすべての入力ストリームのテンプレートであり、すべての入力ストリームにはその方法が含まれるべきである.
3)ストリーム三大データの読み込み方法:byteバージョンはInputStream、charバージョンはReader、InputStreamの単位はバイト、Readerの単位は1文字(つまり2バイト)
i. int read();//入力ストリームから1単位を読み出し、読み出した単位を直接返す(byteとcharはintに直接変換できる)
ii. int read(byte[] b/char[] cbuf);//入力ストリームからb.length/cbufを読み出す.length個の単位をb/cbuf配列に戻し、実際にどれだけの単位を読み出したかを返します.
iii. int read(byte[] b/char[] cbuf, int off, int len);//入力ストリームからlen単位をb/cbufに読み出し、配列のoff位置から書き込みを開始する
!!上記の3つの方法はいずれも戻り-1でストリームの終了を表す(C言語のEOFに相当する).
4)入力ストリームが切れたら、直ちにリソースを閉じるべきである:void close();
i.JDBCのデータベース接続リソースと同様に、I/Oリソースもメモリ内のリソースではなく、一度にゴミ回収メカニズムで自動的にこのリソースを回収することはできません.
ii. そのため、closeメソッドを手動で呼び出して閉じる必要があります.そうしないと、リソースが漏洩します.
iii.しかしJava 7以降はJDBCやI/OリソースなどAutoCloseableインタフェースが実現されているため、自動的に閉じたtry文でこれらのリソースを閉じることができる.
5)抽象ベースクラスであるため、InputStreamとReaderでインスタンスを直接作成することはできません.ここでは、最も一般的な実装クラスであるFileInputStreamとFileReaderの2つのノードフローについて簡単に説明します.
コンストラクタ:FileInputStream/FileReader(String name/File file);//ファイル名またはファイルノードで直接構築可能
6)例1:FileInputStreamをcloseで閉じる
2.出力ストリームのバイトストリームと文字ストリーム:
1)OutputStreamとWriterはそれぞれすべての出力バイトストリームと文字ストリームの抽象ベースクラスである.
2)出力ストリームにデータを書き込む3つの方法:b/byteはバイトストリームバージョン、c/charは文字ストリームバージョン
i. void write(int b/int c);//出力ストリームへの単位データの書き込み
ii. void write(byte[] buf/char[] cbuf);//配列中のデータをすべて出力ストリームに書き込む、単位個数はbufである.length/cbuf.length
iii. void write(byte[] buf/char cbuf, int off, int len);//配列内offから始まるlen単位を出力ストリームに書き込む
3)Writerの場合、文字ストリームであるため、文字配列の代わりにStringを直接使用してストリームにデータを書き込むことができるため、Writerのwriteバージョンは2つある:Writerオブジェクトのみ
i. void write(String str);//strを出力ストリームに挿入する
ii. void write(String str, int off, int len);//strのoffから始まるlen文字を出力ストリームに挿入
4)ここでは、以下のOutputStreamとWriterの最も一般的な実装クラス、またはファイル出力ストリームについて簡単に説明する.それぞれFileOutputStreamとFileWriterであり、そのコンストラクタは入力ストリームと同じである(2つのバージョンで、1つはファイルノードを直接利用して構築され、もう1つはファイル名で構築される):FileOutputStream/FileWriter(String name/File);
5)両者は同様にcloseメソッドで閉じるか、try文で自動的に閉じることができる(AutoCloseableインタフェースが実現された).
6)例1:バイトストリーム実装ファイルコピー(明示的なcloseオフ)
3.入力フローでポインタを移動できます.
1)対流で読み書き操作を行うとき、実際には、このポインタが操作中のデータ単位を指していることを維持します.
2)入力ストリームについては,プログラムが入力ストリーム中のデータを使用する必要があるため,その中のデータを繰り返し読み取る必要があるかもしれないが,入力ストリームがポインタの移動を許さない場合は,入力ストリーム中のデータをキャッシュするためのメモリを自分で開発する必要があり,メモリ空間を浪費することになる.通常の配列のように入力ストリームのデータキャッシュ領域にアクセスできれば、どんなに便利で手間が省けますか.
3)Javaでは、入力フローポインタを移動する2つの方法が用意されています.
i.mark&reset:markは現在の位置にタグを付けて、正常に後ろに読めばいいです.resetを呼び出すと、ポインタが最後のタグに移動します.
!!しかし、この方法はあまりサポートされていません.今のところ、この機能はしばらくサポートされていません.
!!InputStreamとReaderのmarkSupportedを呼び出して、この機能がサポートされているかどうかを確認できます.boolean markSupported()です.
ii. n単位を省略する:long skip(long n);//この方法はサポートします!正常に使用できる
1.ストリーム内のバイトストリームと文字ストリームを入力します.
1)InputStreamとReaderはそれぞれ入力ストリームのバイトストリームと文字ストリームを表す.
2)この2つのクラスはすべての入力ストリームの抽象ベースクラスであり、それ自体はインスタンスオブジェクトとして操作することはできないが、これらはすべての入力ストリームのテンプレートであり、すべての入力ストリームにはその方法が含まれるべきである.
3)ストリーム三大データの読み込み方法:byteバージョンはInputStream、charバージョンはReader、InputStreamの単位はバイト、Readerの単位は1文字(つまり2バイト)
i. int read();//入力ストリームから1単位を読み出し、読み出した単位を直接返す(byteとcharはintに直接変換できる)
ii. int read(byte[] b/char[] cbuf);//入力ストリームからb.length/cbufを読み出す.length個の単位をb/cbuf配列に戻し、実際にどれだけの単位を読み出したかを返します.
iii. int read(byte[] b/char[] cbuf, int off, int len);//入力ストリームからlen単位をb/cbufに読み出し、配列のoff位置から書き込みを開始する
!!上記の3つの方法はいずれも戻り-1でストリームの終了を表す(C言語のEOFに相当する).
4)入力ストリームが切れたら、直ちにリソースを閉じるべきである:void close();
i.JDBCのデータベース接続リソースと同様に、I/Oリソースもメモリ内のリソースではなく、一度にゴミ回収メカニズムで自動的にこのリソースを回収することはできません.
ii. そのため、closeメソッドを手動で呼び出して閉じる必要があります.そうしないと、リソースが漏洩します.
iii.しかしJava 7以降はJDBCやI/OリソースなどAutoCloseableインタフェースが実現されているため、自動的に閉じたtry文でこれらのリソースを閉じることができる.
5)抽象ベースクラスであるため、InputStreamとReaderでインスタンスを直接作成することはできません.ここでは、最も一般的な実装クラスであるFileInputStreamとFileReaderの2つのノードフローについて簡単に説明します.
コンストラクタ:FileInputStream/FileReader(String name/File file);//ファイル名またはファイルノードで直接構築可能
6)例1:FileInputStreamをcloseで閉じる
public class Test {
public static void print(String s) {
System.out.println(s);
}
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src\\com\\lirx\\Test.java"); //
byte[] buf = new byte[1024];
int hasRead = 0;
while ((hasRead = fis.read(buf)) > 0) {
print(new String(buf, 0, hasRead));
}
fis.close();
}
}
)例2:FileReaderがtry文で自動的に閉じるpublic class Test {
public static void print(String s) {
System.out.println(s);
}
public static void main(String[] args) throws IOException {
try (FileReader fr = new FileReader(new File("src\\com\\lirx\\Test.java"))) { //
char[] cbuf = new char[128]; // try I/O
int hasRead = 0;
while ((hasRead = fr.read(cbuf)) > 0) {
print(new String(cbuf, 0, hasRead));
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
2.出力ストリームのバイトストリームと文字ストリーム:
1)OutputStreamとWriterはそれぞれすべての出力バイトストリームと文字ストリームの抽象ベースクラスである.
2)出力ストリームにデータを書き込む3つの方法:b/byteはバイトストリームバージョン、c/charは文字ストリームバージョン
i. void write(int b/int c);//出力ストリームへの単位データの書き込み
ii. void write(byte[] buf/char[] cbuf);//配列中のデータをすべて出力ストリームに書き込む、単位個数はbufである.length/cbuf.length
iii. void write(byte[] buf/char cbuf, int off, int len);//配列内offから始まるlen単位を出力ストリームに書き込む
3)Writerの場合、文字ストリームであるため、文字配列の代わりにStringを直接使用してストリームにデータを書き込むことができるため、Writerのwriteバージョンは2つある:Writerオブジェクトのみ
i. void write(String str);//strを出力ストリームに挿入する
ii. void write(String str, int off, int len);//strのoffから始まるlen文字を出力ストリームに挿入
4)ここでは、以下のOutputStreamとWriterの最も一般的な実装クラス、またはファイル出力ストリームについて簡単に説明する.それぞれFileOutputStreamとFileWriterであり、そのコンストラクタは入力ストリームと同じである(2つのバージョンで、1つはファイルノードを直接利用して構築され、もう1つはファイル名で構築される):FileOutputStream/FileWriter(String name/File);
5)両者は同様にcloseメソッドで閉じるか、try文で自動的に閉じることができる(AutoCloseableインタフェースが実現された).
6)例1:バイトストリーム実装ファイルコピー(明示的なcloseオフ)
public class Test {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src\\com\\lirx\\Test.java");
FileOutputStream fos = new FileOutputStream("src\\com\\lirx\\Test1.java");
byte[] buf = new byte[128];
int hasRead = 0;
while ((hasRead = fis.read(buf)) > 0) {
fos.write(buf, 0, hasRead);
}
fis.close();
fos.close();
}
}
)例2:文字ストリームがファイルに直接書き込まれる(try文を使用してリソースを閉じる)public class Test {
public static void main(String[] args) throws IOException {
try (FileWriter fw = new FileWriter(new File("poem.txt"))) {
fw.write("hello!\r
");
fw.write("good morning!\r
");
}
}
}
!!Windowsの下で改行するのはrで、Linuxの下で直接でいいです;3.入力フローでポインタを移動できます.
1)対流で読み書き操作を行うとき、実際には、このポインタが操作中のデータ単位を指していることを維持します.
2)入力ストリームについては,プログラムが入力ストリーム中のデータを使用する必要があるため,その中のデータを繰り返し読み取る必要があるかもしれないが,入力ストリームがポインタの移動を許さない場合は,入力ストリーム中のデータをキャッシュするためのメモリを自分で開発する必要があり,メモリ空間を浪費することになる.通常の配列のように入力ストリームのデータキャッシュ領域にアクセスできれば、どんなに便利で手間が省けますか.
3)Javaでは、入力フローポインタを移動する2つの方法が用意されています.
i.mark&reset:markは現在の位置にタグを付けて、正常に後ろに読めばいいです.resetを呼び出すと、ポインタが最後のタグに移動します.
!!しかし、この方法はあまりサポートされていません.今のところ、この機能はしばらくサポートされていません.
!!InputStreamとReaderのmarkSupportedを呼び出して、この機能がサポートされているかどうかを確認できます.boolean markSupported()です.
ii. n単位を省略する:long skip(long n);//この方法はサポートします!正常に使用できる