プログラミングが好きなあなたのように!
SpringBoot実用的なコースは学習https://edu.csdn.net/course/detail/31433
SpringCloud入門コースを学びhttps://edu.csdn.net/course/detail/31451を
序文
IOは、データの永続性とネットワーク通信を完了するためにディスクまたはネットワークからデータを読み取る必要があるため、Javaナレッジシステムの重要な部分です。この記事では、IOフローについて理解します。
IOフロー分類
運用データの種類による分類:
- バイトストリーム
- 一般的にバイナリデータを操作するために使用され、データの単位はバイト(ビデオ、オーディオ、画像、exe、dll、その他のファイル)です。
- InputStreamまたはOutputStreamで終了します
- キャラクターストリーム
- 通常、テキストデータの操作に使用され、データの単位はchar(txt、xml、html、およびその他のファイル)です。
- リーダーまたはライターで終了
データフローによる分類:
- 入力ストリーム
- データを読み取るために、ディスクファイルまたはネットワークからJavaプログラムにストリーミングします
- すべてのバイト入力ストリームの親クラスはInputStreamです
- すべての文字入力ストリームの親クラスはReaderです
- 出力ストリーム
- データを書き込むためのJavaプログラムからディスクファイルまたはネットワークへのフロー
- すべてのバイト出力ストリームの親クラスはOutputStreamです。
- すべての文字出力ストリームの親クラスはWriterです。
ファイルの読み取りと書き込み
ファイルの読み取り
FileInputStreamの
機能は、ディスクファイルまたはネットワークからデータを読み取ることです。
構築方法:
FileInputStream(File file)
FileInputStream(String filepath)
主な方法:
- int read(byte [] buffer)ファイルデータを読み取り、バイト配列に保存します。戻り値は読み取り長-1で、読み取りが完了したことを意味します。
- void close()ファイルストリームを閉じます
try-with-resource
IOストリームは、使用後に閉じる必要があります。そうしないと、ファイルストリームを解放できず、最後にcloseメソッド呼び出しを書き込む必要があります。
ストリームを閉じるコードを単純化するために、Java 1.7ではtry-with-resource構文が導入されています。これにより、try-catchの完了後にリソースを自動的に閉じることができます。
文法:
try(类 对象 = new 类()){
可能出现异常的代码
}catch(异常类型 对象){
处理异常的代码
}
注:閉じたオブジェクトはClosableインターフェースを実装する必要があり、すべてのIOストリームはこのインターフェースを実装します。
ファイル読み取りプロセス
- ファイル入力ストリームを作成する
- バイト配列を作成する
- ループ内でreadメソッドを呼び出してデータを読み取り、バイト配列に格納します
- バイト配列を操作する
- 読んだ後、ファイルストリームを閉じます
/**
* 读取文件内容
* @param filepath
*/
public void read(String filepath){
//1、创建文件输入流
try(FileInputStream fis = new FileInputStream(filepath)) {
//2、创建byte数组
byte[] buffer = new byte[1024];
//3、循环调用read方法读取数据,存入byte数组
int len = 0;
while((len = fis.read(buffer)) != -1){
//4、操作byte数组,如果是文字将byte[]转换为String
String str = new String(buffer,0,len,"UTF-8");
System.out.println(str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testRead(){
read("C:/xpp/Test6.java");
}
ファイルの書き込み
ファイル出力ストリームFileOutputStream
関数は次のとおりです。ディスクファイルまたはネットワークへのデータの書き込み
構築方法:
FileOutputStream(File file)
FileOutputStream(String filepath)
主な方法:
- write(byte [] buffer、int offset、int length)書き込みファイル、オフセット開始位置、長さ書き込み長さ
- write(byte [] buffer)
- close()ストリームを閉じます
ファイルの書き込み手順:
- ファイル出力ストリームを作成する
- 文字列をバイト配列に変換する
- ファイルを書き込むためにwriteを呼び出します
- ファイルストリームを閉じる
/**
* 写入磁盘文件
* @param filepath
* @param content
*/
public void write(String filepath,String content){
//1、创建文件输出流
try (FileOutputStream fos = new FileOutputStream(filepath)){
//2、将字符串转换为byte数组3、调用write写入文件
fos.write(content.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testWrite(){
write("C:/xpp/xxxx.txt","这是我要写入的内容:Hello JavaEE!");
}
ファイルのコピー
ファイルのコピーとは、ファイルの読み取り中に別のファイルにデータを書き込むことです。
アイデア:
1。入力ストリームと出力ストリーム
を作成します。2。入力ストリームを介してバイト配列にデータを読み取ります。3
。同時に、バイトにデータを追加します。アレイデータは出力ストリーム
4、ループ1、2、3に書き込まれます
/**
* 复制文件
* @param source 原始文件路径
* @param target 目标文件路径
*/
public void copy(String source,String target){
//创建文件输入流、文件输出流
try(FileInputStream fis = new FileInputStream(source);
FileOutputStream fos = new FileOutputStream(target)){
//创建byte数组
byte[] buffer = new byte[1024];
int len = 0;
//循环从输入流读取数据
while((len = fis.read(buffer)) != -1){
//写入到输出流中
fos.write(buffer, 0, len);
}
}catch(Exception ex){
ex.printStackTrace();
}
System.out.println("复制完毕");
}
@Test
public void testCopy(){
copy("C:\\xpp\\InletexEMCFree.exe","C:\\xpp\\InletexEMCFree2.exe");
}
バッファ
バッファとは
メモリの読み取りと書き込みの速度は、ディスクの読み取りと書き込みの速度よりもはるかに速いことが前提です。バッファはメモリ内のスペースの一部であり、データの読み取りと書き込みの速度は、バッファを介して向上させることができます。
なぜバッファリングするのか
バッファリングがない場合、ファイルの読み取りと書き込みはディスクから直接実行され、速度は比較的遅くなります。バッファリングは、ディスク上のデータの一部の読み取りと書き込みがにインポートされる前に、メモリにスペースを作成することです。バッファメモリ、およびその後の読み取りと書き込みはバッファから直接行われます。ディスクからの直接読み取りと書き込みの数が減り、読み取りと書き込みの効率が向上します。
バッファフロー:通常のIOフローに基づいて、メモリバッファを追加してIO効率を向上させます。
バイトバッファストリーム
BufferedInputStreamバッファリングされた入力ストリーム
创建方法:
new BufferedInputStream(InputStream in)
new BufferedInputStream(InputStream in,int bufferSize)
説明:
- パラメータInputStreamはバイト入力ストリームです。バッファリングされた入力ストリームに渡された後、バッファが追加されます。
- パラメータbufferSizeは、バッファサイズを設定できます
BufferedOutputStreamバッファリングされた出力ストリーム
创建方法:
new BufferedOutputStream(OutputStream out)
new BufferedOutputStream(OutputStream out,int bufferSize)
次のケースでは、JUnitを使用して、バッファなしストリームとバッファ付きストリームを使用したファイルコピーの効率比較をテストします。
public class TestIO {
/**
* 不使用缓冲复制文件
* @param source
* @param target
*/
public void copyWithoutBuffer(String source,String target){
System.out.println("不使用缓冲复制文件");
//创建文件输入流和输出流
try(FileInputStream in = new FileInputStream(source);
FileOutputStream out = new FileOutputStream(target)){
//定义字节数组
byte[] buffer = new byte[100];
int len = 0;
//读取数据
while((len = in.read(buffer)) != -1){
//写入数据
out.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 使用缓冲复制文件
* @param source
* @param target
*/
public void copyWithBuffer(String source,String target){
System.out.println("使用缓冲复制文件");
//创建缓冲输入流和输出流
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(source));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(target))) {
//定义字节数组
byte[] buffer = new byte[100];
int len = 0;
//读取数据
while ((len = in.read(buffer)) != -1) {
//写入数据
out.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testCopyWithoutBuffer(){
copyWithoutBuffer("D:/install/jdk-8u171-windows-x64.exe","D:/jdk1.exe");
}
@Test
public void testCopyWithBuffer(){
copyWithBuffer("D:/install/jdk-8u171-windows-x64.exe","D:/jdk2.exe");
}
}
キャッシュなしでファイルをコピーするのに10秒以上かかり、キャッシュを使用するのに0.59秒かかりました。これは約20倍高速でした。
キャラクターストリーム
文字単位でのストリーミングは、テキストデータの操作に適しています。
- リーダー文字入力ストリームの親クラス
- Writer文字出力ストリームの親クラス
FileReaderファイルリーダー
作成方法:
new FileReader(String path) path是文件路径
主な方法:
- int read(char [] buffer)データを文字配列に読み込みます
- 閉じる()
FileWriterファイルライター
作成方法:
new FileWriter(String path) path是文件路径
主な方法:
- write(char [] buffer)文字配列を書き込む
- write(char [] buffer、int offset、int length)
- write(String str)書き込み文字列
文字バッファストリーム
BufferedReader
バッファ付きリーダーの
作成方法:
new BufferedReader(Reader reader)
ユニークな方法:
- readLine()テキストの行を読む
BufferedWriter
バッファ付きライターの
作成方法:
new BufferWriter(Writer writer)
ユニークな方法:
- write(String str)書き込み文字列
- newLine()改行を挿入
印刷ストリーム
出力時に印刷フォーマットを制御できます。
印刷フローは次のように分割されます。
- PrintStreamバイトの印刷ストリーム。System.outはPrintStreamです。
- PrintWriter文字印刷ストリーム
一般的な方法:
- 印刷出力
- 改行付きのprintln出力
- printf( "format string"、variable parameter)output with format
%s output string
%d output integer
%f output decimal
%n output newline
データフロー
さまざまなデータ型(byte \ short \ int \ long \ char \ boolean \ String ...)のストリーム内のデータを読み書きできる高レベルのバイトストリーム。
DataInputStream
工法:
DataInputStream(InputStream is)
一般的な方法:
- readByte()バイトデータの読み取り
- readShort()
- readInt()
- readLong()
- readChar()
- readBoolean()
- readFloat()
- readDouble()
- readUTF()文字列の読み取り
注:さまざまなデータ型を読み取るためのメソッドの呼び出しシーケンスは、書き込みシーケンスと一致している必要があります。
DataOutputStream
工法:
DataOutputStream(OutputStream os)
一般的な方法:
- writeByte()バイトデータを書き込む
- writeShort()
- writeInt()
- writeLong()
- writeChar()
- writeBoolean()
- writeFloat()
- writeDouble()
- writeUTF()書き込み文字列
終わり
割り当て:
ファイルに複数の単語があると仮定すると、各単語は独自の行にあります。
例:
Hello
World
Hello
JavaEE
…
ファイル内の単語を読み取り、繰り返される単語を削除し、並べ替え後に新しいファイルに書き込みます。
他のJavaの知識を学ぶ必要がある場合は、ここでJavaの概要に関する非常に詳細な知識を調べてください。