文字出力ストリーム、ストリームバッファ

  1. IOストリーム
    文字出力ストリームの1.1ファイル操作
    出力文字ストリームのしてFileWriterファイル操作
    コンストラクタコンストラクタ
    てFileWriter(ファイルファイル)、
    出力文字列のFileクラスのオブジェクトファイルの操作に応じて対応するファイルを作成
    してFileWriter(文字列のパス名を);
    文字列のファイルパスに基づいて、対応するファイルを作成します出力文字ストリームのファイル操作
    てFileWriter(ファイルのファイル、ブール追記) 、
    ファイル・クラス・オブジェクトファイル操作出力文字列に基づいて、対応するファイルを作成し、追加の書き込みのための要件
    てFileWriter(文字列パス名、ブール追記) 、
    作成された文字列型ファイルパスに対応ファイル操作文字ストリーム出力ファイル、および追加の要件を書きます

    あなたはFileWrite関数オブジェクトファイルを作成する場合は、ここでの操作は、対応するファイルを作成します法律上のパスを、存在しません。パスが無効である場合は、例外にFileNotFoundExceptionがスローされます

メソッドメンバメソッド
ボイド書き込み(INT CH)、
ファイルタイプcharにデータを書き込む
ボイドライト(CHAR [] ARR) ;
ファイルタイプアレイチャーへの書き込み
ボイドライト(CHAR [] ARR、 INTオフセット、INT長);
ファイルchar配列型への書き込み、それが位置のアレイからのデータの読み出しを開始するために必要とされるの標準長さオフセット

ボイドライト(文字列STR)を、
文字列をファイルに書き込み
ボイドライト(文字列str、intはオフセット、INTな長さ);
ファイルに文字列を書き込みは、それがオフセット指定された文字列のインデックスの開始位置、長さの長さから必要とされる
動作時の書き込みデータは、問題が発生は、IOExceptionが存在することになる場合

1.2デモ

パッケージcom.qfedu.b_io。

インポートのjava.io.File;
輸入java.io.FileWriter;
インポートにjava.io.IOException;

/ *

  • 文字出力ストリームファイルの操作
    * /
    publicクラスDEMO1 {
    パブリック静的無効メイン(文字列[] args){
    てFileWriterてFileWriter = NULL;

     try {
     	fileWriter = new FileWriter(new File("D:/aaa/5.txt"), true);
     	
     	char[] charArray = "充满希望的中国".toCharArray();
     	
     	fileWriter.write(charArray);
     	fileWriter.write("韩国目前疫情情况不容乐观");
     	fileWriter.write("\r\n");
     	fileWriter.write(charArray, 0, 5);
     	fileWriter.write("韩国目前疫情情况不容乐观", 0, 5);
     	
     } catch (IOException e) {
     	e.printStackTrace();
     } finally {
     	if (fileWriter != null) {
     		try {
     			fileWriter.close();
     		} catch (IOException e) {
     			// TODO Auto-generated catch block
     			e.printStackTrace();
     		}
     	}
     }
    

    }

    プライベート静的ボイドwriteTest1(){
    てFileWriterてFileWriter = NULL;
    {しようとし
    てFileWriter =新しいてFileWriter(新しいファイル(「D:/aaa/4.txt」)、真の);

     	fileWriter.write('武');
     	fileWriter.write('汉');
     	fileWriter.write('加');
     	fileWriter.write('油');
     	fileWriter.write(',');
     	fileWriter.write('中');
     	fileWriter.write('国');
     	fileWriter.write('加');
     	fileWriter.write('油');
     	fileWriter.write(',');
     	fileWriter.write('世');
     	fileWriter.write('界');
     	fileWriter.write('加');
     	fileWriter.write('油');
     	
     	
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	if (fileWriter != null) {
     		try {
     			fileWriter.close();
     		} catch (IOException e) {
     			// TODO Auto-generated catch block
     			e.printStackTrace();
     		}
     	}
     }
    

    }
    }
    1.3文字ストリームファイルのコピー

    パッケージcom.qfedu.b_io。

    インポートのjava.io.File;
    輸入java.io.FileReader;
    輸入java.io.FileWriter;
    インポートにjava.io.IOException;

    / *

    • 使用ファイルの操作は非テキストファイルの文字の流れの問題をコピーします
    • [条件]
    •  禁止使用字符流操作非文本文件,记事本打开乱码文件都不可以
      

    * /
    publicクラスDEMO2 {
    パブリック静的無効メイン(文字列[] args){
    FileReaderのFileReaderの= NULL;
    FileWriterてFileWriter = NULL;

     	try {
     		fileReader = new FileReader(new File("D:/aaa/logo桌面.jpg"));
     		fileWriter = new FileWriter(new File("D:/aaa/temp.jpg"));
     		
     		char[] buf = new char[1024 * 4];
     		int length = -1;
     		
     		while ((length = fileReader.read(buf)) != -1) {
     			fileWriter.write(buf, 0, length);
     		}
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	} finally {
     		if (fileWriter != null) {
     			try {
     				fileWriter.close();
     			} catch (IOException e) {
     				// TODO Auto-generated catch block
     				e.printStackTrace();
     			}
     		}
     		
     		if (fileReader != null) {
     			try {
     				fileReader.close();
     			} catch (IOException e) {
     				// TODO Auto-generated catch block
     				e.printStackTrace();
     			}
     		}
     	}
     }
    

    }

  1. バッファフロー

2.1バッファの流れの役割は何ですか

使用缓冲数组以后,整体的读取,写入效率提升很大!!!
降低了CPU通过内存访问硬盘的次数。提高效率,降低磁盘损耗。

字节输入缓冲
	BufferedInputStream
字节输出缓冲
	BufferedOutputStream
字符输入缓冲
	BufferedReader
字符输出缓冲
	BufferedWrite

【重点】
	所有的缓冲流都没有任何的读取,写入文件能力,这里都需要对应的输入流和输出流来提供对应的能力。
	在创建缓冲流流对象时,需要传入对应的输入流对象和输出流对象。
	底层就是提供了一个默认大小的缓冲数组,用于提高效率

2.2バイトストリームバッファ

输入
	BufferedInputStream(InputStream in);	
		这里需要的对象是一个字节输入流基类对象。同时也可也传入InputStream子类对象
输出
	BufferedOutputStream(OutputStream out);
		这里需要的对象是一个字节输出流基类对象。同时也可也传入OutputStream子类对象

以上传入的InputStream和OutputStream都是用于提供对应文件的读写能力。

バイトバッファ効率の2.2.1入力ストリーム

1. 在BufferedInputStream底层中有一个默认容量为8KB的byte类型缓冲数组。
2. fill方法是一个操作核心
	a. 从硬盘中读取数据,读取的数据容量和缓冲数组容量一致。
	b. 所有的read方法,都是从缓冲数组中读取数据
	c. 每一次读取数据之前,都会检查缓冲区内是否有数据,如果没有,fill方法执行,填充数据。

3. 利用缓冲,fill方法,可以极大的降低CPU通过内存访问硬盘的次数。同时程序操作的数据是在内存中进行交互的。

バイト出力バッファの効率2.2.2

1. 在BufferedOutputStream类对象,默认有一个8KB的byte类型缓冲数组
2. 数据写入文件时并不是直接保存到文件中,而是保存在内存8KB字节缓冲数组中
3. 如果8KB空间填满,会直接flush缓冲区,数据保存到硬盘中,同时清空整个缓冲区。
4. 在BufferedOutputStream关闭时,首先会调用flush方法,保存数据到文件,清空缓冲区,并且规划缓冲区占用内存,同时关闭缓冲流使用的字节输出流。

2.2.3バッファリングされていないと、バッファされたストリームのコピーのコピーの時間差効率

package com.qfedu.c_buffered;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo3 {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();

		copy();
		
		long end = System.currentTimeMillis();
		// 总耗时
		System.out.println("Time:" + (end - start));
	}
	
	// 1716 ms
	public static void useBuffered() {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		
		try {
			bis = new BufferedInputStream(new FileInputStream(new File("D:/aaa/2.txt")));
			bos = new BufferedOutputStream(new FileOutputStream(new File("D:/aaa/buffered.txt")));
			
			int content = -1;
			
			while ((content = bis.read()) != -1) {
				bos.write(content);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (bos != null) {
				try {
					bos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			if (bis != null) {
				try {
					bis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
 	}
	
    // 531000
	public static void copy() {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		
		try {
			fis = new FileInputStream("D:/aaa/2.txt");
			fos = new FileOutputStream("D:/aaa/copy.txt");
			
			int content = -1;
			
			while ((content = fis.read()) != -1) {
				fos.write(content);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

文字バッファフロー2.3

BufferedReader
	字符缓冲输入流
	BufferedReader(Reader reader);
BufferedWriter
	字符缓冲输出流
	BufferedWriter(Writer writer);

2.3.1文字バッファフロー効率

1. 字符缓冲输入流,底层有一个8192个元素的缓冲字符数组,而且使用fill方法从硬盘中读取数据填充缓冲数组

2. 字符缓冲输出流,底层有一个8192个元素的缓冲字符数组,使用flush方法将缓冲数组中的内容写入到硬盘当中。

3. 使用缓冲数组之后,程序在运行的大部分时间内都是内存和内存直接的数据交互过程。内存直接的操作效率是比较高的。并且降低了CPU通过内存操作硬盘的次数

4. 关闭字符缓冲流,都会首先释放对应的缓冲数组空间,并且关闭创建对应的字符输入流和字符输出流。

5. 
字符缓冲输入流中
	String readLine(); 读取一行数据
字符缓冲输出流中
	void newLine(); 换行
リリース3元の記事 ウォンの賞賛1 ビュー22

おすすめ

転載: blog.csdn.net/weixin_44173851/article/details/104546036