java学习笔记 day14 字节流、字符流

1391-王同学

发表文章数:51

首页 » Java » 正文

1. 缓冲字节流

字符缓冲区流:

  • BufferedWriter:
    将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
    可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

  • 构造方法:
    BufferedWriter(Writer out)

  • BufferedReader:
    从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
    可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

  • 构造方法:
    BufferedReader(Reader in)

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

/*
 * 把d://复制图片.avi复制到当前项目目录下的copy.avi中
 * 
 * 数据源:d://复制图片.avi
 * 目的地:copy.avi
 * 
 * 四种方式比较复制效率
 * 基本字节流一次读写一个字节		共耗时:50233毫秒
 * 基本字节流一次读写一个字节数组		共耗时:79毫秒
 * 缓冲字节流一次读写一个字节		共耗时:197毫秒
 * 缓冲字节流一次读写一个字节数组		共耗时:30毫秒
 * 
 * 提示:
 * 复制文件的时间计算可以采用System类的方法实现
 * public static long currentTimeMillis():返回以毫秒为单位的当前时间。
 */
public class CopyAviTest {
	public static void main(String[] args) throws IOException {
		//记录开始时间
		long start = System.currentTimeMillis();
		
//		method1();
//		method2();
//		method3();
		method4();
		
		//记录结束时间
		long end = System.currentTimeMillis();
		System.out.println("共耗时:"+(end-start)+"毫秒");
	}
	
	//缓冲字节流一次读写一个字节数组
	private static void method4() throws IOException {
		//封装数据源
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d://复制图片.avi"));
		//封装目的地
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
		
		byte[] bys = new byte[1024];
		int len;
		while((len=bis.read(bys))!=-1) {
			bos.write(bys,0,len);
		}
		
		bos.close();
		bis.close();
	}
	
	//缓冲字节流一次读写一个字节
	private static void method3() throws IOException {
		//封装数据源
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d://复制图片.avi"));
		//封装目的地
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
		
		int by;
		while((by=bis.read())!=-1) {
			bos.write(by);
		}
		
		bos.close();
		bis.close();
	}
	
	//基本字节流一次读写一个字节数组
	private static void method2() throws IOException {
		//封装数据源
		FileInputStream fis = new FileInputStream("d://复制图片.avi");
		//封装目的地
		FileOutputStream fos = new FileOutputStream("copy.avi");
		
		byte[] bys = new byte[1024];
		int len;
		while((len=fis.read(bys))!=-1) {
			fos.write(bys,0,len);
		}
		
		fos.close();
		fis.close();
	}

	//基本字节流一次读写一个字节
	private static void method1() throws IOException {
		//封装数据源
		FileInputStream fis = new FileInputStream("d://复制图片.avi");
		//封装目的地
		FileOutputStream fos = new FileOutputStream("copy.avi");
		
		int by;
		while((by=fis.read())!=-1) {
			fos.write(by);
		}
		
		fos.close();
		fis.close();
	}
}

2.转换流-中文处理

2.1 编码表概述和常见编码表

java学习笔记 day14 字节流、字符流

  • 编码
    把看得懂的变成看不懂的
    public byte[] getBytes(String charsetName) throws UnsupportedEncodingException
    使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

  • 解码
    把看不懂的变成看得懂的
    public String(byte[] bytes, String charsetName)
    通过使用指定的 charset解码指定的 byte 数组,构造一个新的 String。

public class StringDemo {
	public static void main(String[] args) throws UnsupportedEncodingException {
		//定义一个字符串
		String s = "你好";
		
		//编码
		//byte[] bys = s.getBytes();//使用平台的默认字符集将此 String 编码为 byte 序列
		//默认编码是GBK
		//[-60, -29, -70, -61]
		//byte[] bys = s.getBytes("GBK"); //指定编码GBK
		//[-60, -29, -70, -61]
		byte[] bys = s.getBytes("UTF-8"); //指定编码UTF-8
		//[-28, -67, -96, -27, -91, -67]
		System.out.println(Arrays.toString(bys));
		
		//解码
		//String ss = new String(bys); //通过使用平台的默认字符集解码指定的 byte 数组
//		String ss = new String(bys,"GBK");//指定编码GBK
		String ss = new String(bys,"UTF-8");//指定编码UTF-8
		System.out.println(ss);
	}
}

2.2 转换流

转换流其实就是一个字符流。
转换流 = 字节流 + 编码表

  • OutputStreamWriter 字符输出流

public OutputStreamWriter(OutputStream out)
根据默认编码把字节流的数据转换为字符流

public OutputStreamWriter(OutputStream out,String charsetName)
根据指定编码把字节流数据转换为字符流

  • InputStreamReader 字符输入流

public InputStreamReader(InputStream in)
用默认的编码读数据

public InputStreamReader(InputStream in,String charsetName)
用指定的编码读取数据

  • OutputStreamWriter写数据方法
    public void write(int c): 写一个字符
    public void write(char[] cbuf): 写一个字符数组
    public void write(char[] cbuf,int off,int len): 写一个字符数组的一部分
    public void write(String str): 写一个字符串
    public void write(String str,int off,int len): 写一个字符串的一部分

  • InputStreamReader读数据方法
    public int read():一次读取一个字符
    public int read(char[] cbuf):一次读取一个字符数组

public class OutputStreamWriterDemo {
	public static void main(String[] args) throws IOException {
		//创建字符输出流对象
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));
		
		//public void write(int c):写一个字符
//		osw.write(97);
//		osw.write('a');
		//写完数据后,没有发现数据,为什么呢?
		//1字符=2字节
		//文件中的数据存储的基本单位是字节
		
		//public void write(char[] cbuf):写一个字符数组
//		char[] chs = {'a','b','c','d','e'};
//		osw.write(chs);
		
		//public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
//		char[] chs = {'a','b','c','d','e'};
//		osw.write(chs, 1, 3);
		
		//public void write(String str):写一个字符串
//		osw.write("hello");
		
		//public void write(String str,int off,int len):写一个字符串的一部分
		osw.write("hello", 0, 3);
		
//		//void flush():刷新该流的缓冲
//		osw.flush();
//		
//		//释放资源
		osw.close(); //关闭此流,但要先刷新它
	}
}

3 便捷类

把当前项目目录下的StringDemo.java内容复制到当前项目目录下的Copy.java中(改进版)

转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类。

FileWriter:用来写入字符文件的便捷类
OutputStreamWriter

FileReader:用来读取字符文件的便捷类
InputStreamReader

  • OutputStreamWriter = FileOutputStream + 编码表(GBK)
    FileWriter = FileOutputStream + 编码表(GBK)
    构造方法:
    FileWriter(String fileName)

  • InputStreamReader = FileInputStream + 编码表(GBK)
    FileReader = FileInputStream + 编码表(GBK)
    构造方法:
    FileReader(String fileName)

数据源:
StringDemo.java—读数据—字符流—InputStreamReader—FileReader
目的地:
Copy.java—写数据—字符流—OutputStreamWriter—FileWriter

4. 字符缓冲区流

字节缓冲区流:
BufferedOutputStream:字节缓冲输出流
BufferedInputStream:字节缓冲输入流

BufferedOutputStream(OutputStream out)
使用这种构造方法,它提供了一个默认的缓冲区大小,所以一般我们使用默认的缓冲区就可以了。

为什么构造方法传递的是一个:OutputStream,而不是具体的文件或者路径呢?
字节缓冲区流仅仅提供缓冲区,而真正的底层的读写数据还得需要基本的流对象进行操作。

  • 特殊功能
    BufferedWriter
    void newLine():写入一个行分隔符,这个行分隔符是由系统决定的

    BufferedReader
    String readLine():包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

未经允许不得转载:作者:1391-王同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《java学习笔记 day14 字节流、字符流》 发布于2020-11-15

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录