문자 출력 스트림, 스트림 버퍼

  1. IO 스트림
    문자 출력 스트림 1.1 파일 조작
    출력 문자 스트림 FileWriter 파일 조작
    생성자 생성자
    FileWriter (파일 파일)
    출력 문자 스트림의 파일 클래스 오브젝트 파일 조작에 따라 해당 파일의 생성
    , FileWriter (문자열 경로 이름)
    문자열 파일 경로에 기초하여 대응하는 파일을 작성 출력 문자 스트림의 파일 조작
    FileWriter (파일 파일 부울 APPEND)는 ,
    파일 클래스 오브젝트 파일 동작 출력 문자 스트림에 기초하여 대응하는 파일을 생성하고, 추가적인 기록에 대한 요구
    FileWriter (문자열 경로명 부울 APPEND)는 ,
    문자열 형식 파일 경로에 대응 만든 파일 작업 문자 스트림 출력 파일, 및 쓰기 추가 요구 사항

    당신이 FILEWRITE 오브젝트 파일을 작성하는 경우 여기에 존재하지 않는, 작업이 해당 파일을 만듭니다 법적 경로. 경로가 잘못된 경우 예외 FileNotFoundException이를 던졌습니다

방법 멤버 메소드
공극 쓰기 (INT CH)
파일 char 형으로 데이터를 기록
공극 기록 (문자 [] 도착) ,
파일 유형 어레이 CHAR 쓰기
무효 기록 (문자 [] 도착, INT 오프셋 INT 길이 )
파일 문자 배열 형태에 쓰기가 표준 길이 위치 오프셋의 어레이로부터 데이터를 판독하기 시작하는 데 필요한
길이가
무효 쓰기 (문자열 STR)
A A 파일에 문자열 쓰기
무효 쓰기 (문자열 STR을 INT 오프셋 , INT 아이폰에)
파일에 문자열을 쓰기, 그것은 오프셋 지정된 문자열의 인덱스의 시작 위치, 길이 길이에서 요구되는
작업 중 쓰기 데이터를, 문제가 발생하는 IOException가있을 것입니다 경우

1.2 데모

com.qfedu.b_io 패키지;

수입 java.io.File에;
수입 java.io.FileWriter;
수입 때 java.io.IOException;

/ *

  • 문자 출력 스트림 파일 조작
    * /
    공용 클래스 데모 1 {
    공공 정적 무효 메인 (문자열 []에 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"), true)를;

     	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;

    / *

    • 를 사용하여 파일 작업은 텍스트가 아닌 파일의 문자 흐름 문제를 복사
    • [조건]
    •  禁止使用字符流操作非文本文件,记事本打开乱码文件都不可以
      

    * /
    공용 클래스 Demo2 {
    공공 정적 무효 메인 (문자열 []에 args) {
    을 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(); 换行
출시 세 원저 · 원 찬양 한 · 전망 (22)

추천

출처blog.csdn.net/weixin_44173851/article/details/104546036