缓冲流

缓冲流是在字节流或字符流的基础上,添加了一个缓冲区。
缓冲流相对于字节流和字符流有一些优点:

  • 效率高,需要读写的文件越大,那么缓冲流的优势越明显
  • 缓冲流添加了一些方法可供使用

字节缓冲流

案例代码:

try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source);BufferedOutputStream bos = new BufferedOutputStream(target))){
	//实例化一个字节数组,来一次一次读取流中的数据
	byte[] array = new byte[1024];
	//声明一个整型变量,来记录每次读取多少字节数据
	int length = 0;
	//循环读写流中的数据
	while((length = bis.read(array)) != -1){
		bos.write(array, 0, length);
		bos.flush();
	}
}catch(IOException e){
	e.printStackTrace();
}

字符缓冲流

案例代码:
字节输入流(一):

try(BufferedReader br = new BufferedReader(new FileReader("file\\a.txt"))){
	char[] array = new char[20];
	int length = 0;
	while((length = br.read(array)) != -1){
		String str = new String(array, 0, length);
		System.out.print(str);
	}
}catch (IOException e){
	e.printStackTrace();
}

字节输入流(二):

try(BufferedReader br = new BufferedWriter(new FileReader("file\\a.txt"))){
	while(true){
		//一次读取一行内容
		String result = br.readLine();
		//当一行内容为空时,不再读取
		if(result == null)
			break;
		System.out.println(result);
	}
}catch(IOException e){
	e.printStackTrace();
}

字节输出流:

try(BufferedWriter bw = new BufferedWriter(new FileWriter("file\\a.txt"))){
	bw.write("hello world");
	//文件内会出现行号,光标在下一行
	bw.newLine();
}catch (IOException e){
	e.printStackTrace();
}

转换流

字节字符转换流,主要针对文本文件进行操作,它既保留了字符流在操作文本的时候的便利性,同时也保留了字节流在数据传输时候的稳定性。

转换流相关的类:InputStreamReader,OutputStreamWriter

什么情况下使用转换流:

  • 当需要以指定的字符集来读取某个文件的时候
  • 当需要将数据以指定的字符集写入某个文件的时候

案例:
将一个采用utf8字符集的文本中的内容拷贝到一个采用gbk字符集的文本中,并在拷贝完成后,不能出现乱码。

try(InputStreamReader reader = new InputStreamReader(new FileInputStream("file\\utf8file"), "utf8");OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("file\\gbkfile", true), "gbk")){
	char[] array = new char[1024];
	int length = 0;
	while((length = reader.read(array)) != -1) {
		writer.write(new String(array, 0, length));
		writer.flush();
	}
} catch(IOException e) {
	e.printStackTrace();
}

标准输入输出流

它是实现程序和控制台之间的链接:
输入流:将控制台中的内容读取到内存中
输出流:将内存中的一些数据写到控制台

案例:
使用Scanner完成对一个文件的读取(将读取到的内容,通过System.out.println输出到指定的文件中)

PrintStream ps = null;
		
		try {
			//设置从这个文件里输入(重定向输入)
			System.setIn(new FileInputStream("file\\gbkfile"));
			ps = new PrintStream(new FileOutputStream("file\\desFile", true));
		}catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		//重定向前保存一份输出流,复原用
		PrintStream original = System.out;
		//System.in是系统标准输入流,本质来讲,就是一个InputStream
		Scanner scan = new Scanner(System.in);
		//设置输出到文件(重定向输出)
		System.setOut(ps);
		while(scan.hasNext()) {
			System.out.println(scan.nextLine());
			
		}
		//还原输出流
		System.setOut(original);