小白学JavaD31》》》IO流 之 缓冲流 & 转换流

Posted 北慕辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白学JavaD31》》》IO流 之 缓冲流 & 转换流相关的知识,希望对你有一定的参考价值。



【友情链接】➡➡▶IO流 之 File类 & 递归
【友情链接】➡➡▶IO流 之 过滤器 & 字节流
【友情链接】➡➡▶IO流 之字符流 & 属性集(Properties集合)
【友情链接】➡➡▶IO流 之 缓冲流 & 转换流
【友情链接】➡➡▶IO流 之 序列化流 & 打印流


一、缓冲流

1. 概述

缓冲流,也叫高效流,是对4个基本的(字节/字符)(输入/输出)流的增强,所以缓冲流也有4个流,

按照数据类型可分为:

  • 字节缓冲流:BufferedInputStream , BufferedOutputStream
  • 字符缓冲流: BufferedReader ,BufferedWriter

缓冲流的基本原理,是指在创建流的对象时,同时会创建一个内置的默认大小的缓冲区数组,通过缓冲区来进行读写,可以减少系统的 IO次数,从而能够提高读写的效率。

2.BufferedOutputStream字节缓冲输出流

BufferedOutputStream extends OutputStream

该类继承了父类OutputStream的共性成员方法有:

public void close():关闭此输出流并释放与此流相关联的任何系统资源。
public void flush():刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b)
		将b.length字节从指定的字节数组写入此输出流。
		
public void write(byte[ ] b, int off, int len):
从指定的字节数组写入len字节,从偏移量off开始输出到此输出流

public abstract void write (int b) :将指定的字节输出流。
BufferedOutputStream的构造方法:
    BufferedOutputStream(OutputStream out)
            创建一个新的缓冲输出流,将数据写入指定的底层输出流中
    BufferedOutputStream(OutputStream out,int size)
            创建一个新的缓冲输出流,
            将具有指定缓冲区大小的数据写入到指定的底层输出流中

	参数:
        OutputStream out ;字节输出流
            可以传递FileOutputStream类的对象,
           		 缓冲流会为FiLeOutputStream类的对象增加一个缓冲区,
            		这样,会大大提高FileOutputStream的写入效率
       int size:指定缓冲流内部暖冲区的大小,不指定则系统默认大小

字节缓冲输出流的使用步骤:

  • 1.创建FileOutputStream类的对象并在构造方法中指定要输出的路径

  • 2.创建BufferedOutputStream类的对象并在构造方法中传递FileOutputStream类对象的对象,提高FileOutputStream对象效率

  • 3.使用BufferedOutputStream类的对象中的write()方法,将数据写入到内部的缓冲区中

  • 4.使用BufferedOutputStream类的对象中的flush()方法将内部缓冲区中的数据刷新到文件中去

  • 5.释放资源(先调用fLush()方法刷新数据),所以上面的第4步可以省略

示例代码:

//1.创建FileOutputStream类的对象并在构造方法中指定要输出的路径
FileOutputStream fos = new FileOutputStream(
"D:\\\\BigData\\\\java\\\\javalearn\\\\src\\\\com\\\\data\\\\data1\\\\test.txt");
// 2.创建BufferedOutputStream类的对象并在构造方法中传递FileOutputStream类对象的对象,提高FileOutputStream对象效率
BufferedOutputStream bos = new BufferedOutputStream(fos);
//3.使用BufferedOutputStream类的对象中的write()方法,将数据写入到内部的缓冲区中
bos.write("北慕辰的字符缓冲输出流".getBytes());
//4.使用BufferedOutputStream类的对象中的flush()方法将内部缓冲区中的数据刷新到文件中去
bos.flush();
//5.释放资源(先调用fLush()方法刷新数据),所以上面的第4步可以省略
bos.close();
fos.close();

测试结果:

3.BufferedIutputStream字节缓冲输入流

BufferedInputStream extends InputStream
该流也继承了父类的共性成员方法:

int read()   从输入流中读取数据的下一个字节。
int read(byte[ ] b) 
	从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
void close()  关闭此输入流并释放与该流关联的所有系统资源。
BufferedInputStream的构造方法:

  BufferedInputStream(InputStream in)
       创建一个BufferedInputStream类的对象并保存其中的参数,
       				即输入流in,以便将来使用。    
  BufferedInputStream(InputStream in, int size)
            创建具有指定缓冲区大小的BufferedInputStream类的对象,
            		并保存其中的参数,即输入流
    构造方法中的参数:
    InputStream in : 字节输入流
        可以传递FileInputStream类的对象
        	级冲流会给FiLeInputStream增加一个缓冲区,
        		可以大大的提高FileInputStream的读取效率
        
    int size: 指定缓冲流内部的缓冲区的大小,不指定则系统默认大小

字节缓冲输入流使用步骚:

  • 1.创建FileInputStream类的对象并在构造方法中指定要读取的数据源(也就是文件路径)

  • 2.创建BufferedInputStream类的对象并在构造方法中传递已经创建好的FiLeInputStream类的对象, 大大提高了FileInputStream类的对象的读取效率

  • 3.使用BufferedInputStream对象中的read()方法读取文件

  • 4.调用close()方法释放资源

实例代码:

//1.创建FileInputStream类的对象并在构造方法中指定要读取的数据源(也就是文件路径)
FileInputStream fis = new FileInputStream(
     "D:\\\\BigData\\\\java\\\\javalearn\\\\src\\\\com\\\\data\\\\data1\\\\test.txt");
//2.创建BufferedInputStream类的对象并在构造方法中传递已经创建好的FiLeInputStream类的对象,
//     大大提高了FileInputStream类的对象的读取效率
BufferedInputStream bis = new BufferedInputStream(fis);
//3.使用BufferedInputStream对象中的read()方法读取文件
//        int sum;
//        while ((sum=bis.read())!=-1){
//            System.out.println(sum);
//        }
byte[] bytes=new byte[1024];
int sum=0;//用来记录每次读取的字节个数
while ((sum=bis.read(bytes))!=-1){
 	System.out.println(new String(bytes,0,sum));
}
//4.调用close()方法释放资源
bis.close();
fis.close();

测试结果;

4.BufferedWriter:字符缓冲输出流

BufferedWriter extends Writer

该类继承了父类Writer的共性成员方法有:

void write(int c)       写入单个字符
void write(char[]cbuf)  写入字符数组
abstractvoid write(char[] cbuf,int off,int len)
	    写入字符数组的某部分, 从off偏移量开始,写入len个字符数
void write(String str)   写入字符串
void write(String str,int off,int lenb) 
		写入字符串的某部分,从off偏移量开始,写入lenb个字符数
void flush()  剧新该流的缓冲
void close()  关闭此流,但要先刷新它

1.BufferedWriter构造方法:
    BufferedWriter(Writer out)
    	创建一个使用认大小输出缓冲区的缓冲字符输出流。
    BufferedWriter(writer out, int sz)
    	创建一个使用给定太小输出缓冲区的新缓冲字符输出渣。
    构造方法的参数:
        Writer out:字符输出凌
            可以传适FileWriter ,
            	缓冲流会给FileWriter增加一个级冲区,
            		提高FileWriter的写入效率
        int size:  指定缓冲区的大小,不写别认大小

2. BufferedWriter中特有的成员方法;
    void newLine( )
       写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符来换行
   
    换行符号
      windows : \\r\\n
      Linux:/n
      mac: /r

字符缓冲输出流使用步骚:

  • 1.创建字符缓冲输出流的对象,并在构造方法中传递字符输出流

  • 2.调用字符缓冲输出流中的write()方法,将数据写入到内存缓冲区中

  • 3.调用字符缓冲输出流中的flush()方法,将内存缓冲区中的数据,刷新到文件中去

  • 4.释放资源

示例代码:

//1.创建字符缓冲编出流的对象,在构造方法中传递字符输出流
BufferedWriter bw = new BufferedWriter(
       new FileWriter("D:\\\\BigData\\\\java\\\\javalearn\\\\src\\\\com\\\\data\\\\data1\\\\test.txt"));
//2.调用字符缓冲锦出流中的write()方法,把数据写入到内存缓冲区中
for (int i = 0; i < 5; i++) {
   bw.write("北慕辰"+i);
  //bw.write("\\r\\n");
   bw.newLine();
}
//3.调用字符缓冲输出流中的flus()方法,将内存缓冲区中的数据,刷新到文件中
bw.flush();
//4.释放资源
bw.close();

测试结果:

5.BufferedReader:字符缓冲输入流

BufferedReader extends Reader

该类继承了父类Reader的共性成员方法有:

public void close(): 关闭此流并释放与此流相关联的任何系统资源。

public int read(: 从输入流中读取一个字符。

public int read(char[ ] cbuf):
 			从输入流中读取一些字符,并将它们存储到字符数组 cbuf中,

1. BufferedReader类的构造方法:
    BufferedReader(Reader in)
            创建一个使用系统默认大小的,输入缓冲区的缓冲字符输入流。
    BufferedReader(Reader in, int size)
            创建一个使用指定大小的,输入缓冲区的缓冲字符输入流。
    参数;
        Reader in: 字符输入流
        可以传递FileReader,缓冲流会给FileReader增加一个缓冲区,
                提高FileReader的读取效率
                
2.BufferedReader类的特有的成员方法:
    String readiine( ): 读取一个文本行.     
      读取一行数据,行的终止符号,
        读取到、换行(‘ \\n ')、回车('\\r')或回车后直接跟着换行(\\r\\n)
        		字符之一就会认为某行已读完:
   注意:
   方法的返回值为包含该行内容的字符串,不包含任何的行终止符,
       		如果已到达流的末尾,那么就会返回null

示例代码;

//1.创建字符缓冲编入流对象,构造方法中传递字符涂入流
BufferedReader br = new BufferedReader(
        new FileReader("D:\\\\BigData\\\\java\\\\javalearn\\\\src\\\\com\\\\data\\\\data1\\\\test.txt"));
//2.使用字行缓中输入流对象中的方法read / readLine读取文本

//2.1 read()
//        int sum;
//        while ((sum=br.read())!=-1){
//            System.out.print((char) sum);
//        }
//2.2 readLine()
String line;
while ((line=br.readLine())!=null){
    System.out.println(line);
}
// 3.释放资源
br.close();

测试结果:

二、转换流

了解什么是字符编码

        我们知道,在计算机中储存的信息都是用二进制数表示的,而我们在计算机屏幕上看到的数字、英文、汉字等字符都是计算机将二进制数转换之后的结果,转换都是按照某种规则来进行的,将字符存储到计算机中,一般称为编码;将存储在计算机中的二进制数按照某种规则解析显示出来,一般称为解码。 字符的编码和解码需要使用同一种规则,否则就会出现乱码情况。而,字符编码 就是指自然语言的字符和二进制数之间转换的规则。

了解什么是字符集

        字符集也称为编码表。它是一个系统支持的所有字符的集合,其中包括各个国家的文字、标点符号以及图形符号、数字等各种字符。编码表指的就是生活中的文字和计算机中的二进制对应的转换规则。
下图是我们常见的字符集:一套字符集必然至少有一个字符编码
ASCII字符集:

  • ASCll ( American Standard Code for Information Interchange,美国信息交换标准代码)。它是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语,其中主要包括有控制字符(回车键、退格、换行键等)以及可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
  • 基本的ASCII字符集使用7位 ( bits )来表示一个字符,共有128个字符。而,ASCII的扩展字符集使用8位( bits )来表示一个字符,共256个字符,以方便支持欧洲常用字符。

ISO-8859-1字符集:

  • 拉丁码表,别名Latin-1,它是用于显示欧洲使用的语言,包括荷兰、丹麦、德语、意大利语、西班牙语等。
  • ISO-8859-1使用单字节编码,其也兼容ASCII编码。

GBxxx字符集:

  • GB指的就是国标的意思,是为了显示中文而专门设计的一套字符集。
  • GB2312字符集:简体中文码表。一个小于127的字符的意义与原来相同。但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体中文汉字,此外数学符号、罗马希腊的字母、日文的假名们都编进去了,而且在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是我们常说的全角字符,而原来在127号以下的那些就叫半角字符了。
  • GBK:是最常用的中文码表。它是在GB2312标准基础上的扩展规范,使用了双字节编码方案 ,一共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。
  • GB18030字符集:是最新的中文码表。它收录了汉字70244个,采用多字节偏码,每个字可以由1个、2个或4个字节组成。并且它支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等。

Unicode字符集:

  • Unicode编码系统是为表达任意语言的任意字符而设计的,是业界的一种标准,也称为统一码、标准万国码
  • 它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案分别是UTF-8、UTF-16和UTF-32。其中最为常用的UTF-8编码。
  • UTF-8编码,可以用来表示Unicode标准中任何字符,它是电子邮件、网页以及其他存储或者传送文字的应用中优先采用的编码。互联网工程工作小组(IETF ) 要求所有的互联网协议都必须支持UTF-8编码。所以,我们开发的Web应用,也需要使用UTF-8编码。它使用一至四个字节为每个字符编码,它的编码规则如下:
  • 1、128个US-ASCII字符,只需要一个字节编码。
  • 2、拉丁文等字符,需要两个字节编码。
  • 3、大部分常用字(含中文),使用三个字节编码。
  • 4、其他极少使用的Unicode辅助字符,使用四字节编码。

转换流的特点就是可以指定任意格式的编码

1. OutputStreamWriter

        在java.io包下的OutputStreamWriter 继承了 Writer类。OutputStreamWriter类,是字符流通向字节流的桥梁,它可以使用指定的字符集charset,将要写入流中的字符编码成字节。

该类继承了父类Writer的共性成员方法有:

void write(int c)       写入单个字符
void write(char[]cbuf)  写入字符数组
abstractvoid write(char[] cbuf,int off,int len)
	    写入字符数组的某部分, 从off偏移量开始,写入len个字符数
void write(String str)   写入字符串
void write(String str,int off,int lenb) 
		写入字符串的某部分,从off偏移量开始,写入lenb个字符数
void flush()  剧新该流的缓冲
void close()  关闭此流,但要先刷新它

OutputStreamWriter的构造方法

1. OutputStreamWriter(Outputstream out)
 	创建使用默认字符编码的OutputStreamWriter类的对象
2. OutputStreamWriter(OutputStream out,String charsetName)
 	创建使用指定字符集的 OutputStreamWriter类的对象

方法中的参数:

OutputStream out指字节输出流,可以用来将转换之后的字节写入到文件中
String charsetName 是指定的编码表的名称,它不区分大小写,		
	可以是utf-8/UTF-8, gbk/GBK 等,若不指定,那么会默认使用utf-8

OutputStreamWriter的使用步骤:

  • 1.创建OutputStreamWriter类的对象,并在杓造方法中传递字节输出流和指定的编码表名称
  • 2.使用OutputStreamWriter类的对象中的write()方法,把字符转换为字节存储在缓冲区中(编码)
  • 3.使用OutputStreamWriter类的对象中的fliush()方法,把内存缓冲区中的字节刷新到文件中去
  • 4.调用close()方法,释放资源

2. InputStreamReader

        在java.io包下的InputStreamReader继承了Reader类。 InputStreamReader类,是字节流通向字符流的桥梁,它可以使用指定的字符集charset,读取字节并将其解码为字符。

InputStreamReader类的构造方法:

1. InputStreamReader(Inputstream in)
 	创建一个使用默认字符集的InputStreamReader类的对象。
2. InputStreamReader(Inputstreom in,String chorsetNome)
	创建一个使用指定字符集的InputStreomReader类的对象

构造方法的参数:

InputStreae in :字节输入流,用来读取文件中保存的字节
String charsetName 是指定的编码表的名称,它不区分大小写,		
	可以是utf-8/UTF-8, gbk/GBK 等,若不指定,那么会默认使用utf-8

InputStreamReader的使用步婆:

  • 1.创建InputStreomReader对象并在杓造方法中传递字节输入流和指定的编码表的名称
  • 2.使用InputStreoamReader类的对象中的read()方法,读取文件
  • 3.调用close()方法,释放资源

注意:
构造方法中指定的编码表名称要和文件的编码相同,否则产生乱码



制作不易,各位友友们,大佬们给点鼓励!

点赞👍 👍 👍 收藏+关注 一键三连走起!

以上是关于小白学JavaD31》》》IO流 之 缓冲流 & 转换流的主要内容,如果未能解决你的问题,请参考以下文章

重新java系列之IO流

新手小白学JAVA IO流 File 字节流 字符流

IO流之缓冲流

java的 IO流之缓冲流(转载)

缓冲流之字节缓冲流

Java之IO流总结