JavaSE基础九----<IO流 >字符流,字符缓冲流

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE基础九----<IO流 >字符流,字符缓冲流相关的知识,希望对你有一定的参考价值。



1.字符流


字符流:以字符为单位,所有以Reader和Writer结尾的类.(主要处理字符或字符串,只能读取纯文本文件,字符流处理单元为1个字符。字节流将读取到的字节数据,去指定的编码表中获取对应文字)

Reader:用于读取字符流的抽象类。
Writer:用于写入字符流的抽象类。

  • InputStreamReader:是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
  • OutputStreamWriter:是字符流到以字节流的桥梁:向其写入的字符编码成使用指定的字节charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

常用类:
字符输入流 FileReader;继承了InputStreamReader.
字符输出流 FileWriter;继承了OutputStreamWriter.


构造方法


字符输入流 FileReader

构造方法注释
FileReader(File file)创建一个新的 FileReader ,指定 File读取
FileReader(FileDescriptor fd)创建一个新的 FileReader ,给定 FileDescriptor读取
FileReader(String fileName)创建一个新的 FileReader ,给定要读取的文件的名称

指定要输入的文件;当文件不存在,会抛异常

字符输出流 FileWriter

构造方法注释
FileWriter(File file)给一个File对象构造一个FileWriter对象
FileWriter(String fileName)构造一个给定文件名的FileWriter对象
FileWriter(File file, boolean append)给一个File对象构造一个FileWriter对象注意:这里有个布尔值参数;append;可设置是否追加,选择追加时,每次执行后就不会删除原来的操作(即不会直接覆盖掉原来的内容)
FileWriter(FileDescriptor fd)构造与文件描述符关联的FileWriter对象
FileWriter(String fileName, boolean append)构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据

指定要输出的目标文件;当文件不存在时;会自动创建输出的目标文件


注意:字符流只能传输纯文本文件


简单读写


  • public int read( )
    读取一个字符并以整数的形式返回,如果返回-1已到输入流的末尾。

读取一个文本文件:

import java.io.FileReader;
import java.io.IOException;
public class Demo01 {
    //这里仅声明异常,在实际中需要捕获异常;
    public static void main(String[] args) throws IOException {
        //指定要输入的文件;当文件不存在,会抛异常
        FileReader fr=new FileReader("F:/JAVAIO流练习使用的文件夹/文本文件.txt");
        //public int read()方法进行读取
        //读取一个字符并以整数的形式返回,如果返回-1已到输入流的末尾。
        int r=0;
        while((r= fr.read())!=-1){
            //这里使用强制类型转换转为字符输出;
            System.out.println((char)r);
        }
    }
}

效果:

在这里插入图片描述


输出流写入:

  • public void write(int c)
    向输出流中写入一个字符数据,该字节数据为参数b的16位.
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo02 {
    //这里仅声明异常,在实际中需要捕获异常;
    public static void main(String[] args) throws IOException {
        //指定要输入的文件;当文件不存在,会抛异常
        FileReader fr=new FileReader("F:/JAVAIO流练习使用的文件夹/文本文件.txt");
        //指定要输出的目标文件;当文件不存在时;会自动创建输出的目标文件,
        FileWriter fw=new FileWriter("F:/JAVAIO流练习使用的文件夹/目标文本文件.txt");
        //public int read()方法进行读取
        //读取一个字符并以整数的形式返回,如果返回-1已到输入流的末尾。
        //public void write(int c)方法进行写入;
        //向输出流中写入一个字符数据,该字节数据为参数b的16位
        int r=0;
        while((r= fr.read())!=-1){
           fw.write(r);
        }
        //关闭流;释放系统资源;
        fr.close();
        fw.close();
    }
}

高效读写


类似字节流的高效读写,在读写时,把数据存到数组中,一块一块地传输.

读取方法

  • public int read(char[ ] cbuf)
    读取[一个数组长度的]字符内容并存储到一个数组中,返回实际读取的字符数,如果读取前已到输入流的末尾就返回-1.

  • public void write(char[] cbuf,int off,int len)
    将字符类型的数组中的从指定位置(offset)开始的,length个字符写入到输出流.

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo03 {
    //这里仅声明异常,在实际中需要捕获异常;
    public static void main(String[] args) throws IOException {
        //指定要输入的文件;当文件不存在,会抛异常
        FileReader fr=new FileReader("F:/JAVAIO流练习使用的文件夹/文本文件.txt");
        //指定要输出的目标文件;当文件不存在时;会自动创建输出的目标文件,
        FileWriter fw=new FileWriter("F:/JAVAIO流练习使用的文件夹/目标文本文件.txt");
        char[] c=new char[10];
        int length=0;
        while((length= fr.read(c))!=-1){
            fw.write(c,0,length);
        }
        //关闭流;释放系统资源;
        fr.close();
        fw.close();
    }
}

2.字符缓冲流


封装字符流对象的即为字符缓冲流.

常用类:

缓冲字符输入流 BufferedReader.
缓冲字符输出流 BufferedWriter.


构造方法


缓冲字符输入流 BufferedReader

构造方法注释
BufferedReader(Reader in)创建使用默认大小的输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)创建使用指定大小的输入缓冲区的缓冲字符输入流。

缓冲字符输出流 BufferedWriter

构造方法注释
BufferedWriter(Writer out)创建使用默认大小的输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。

类似于字节流的缓冲区;在字符缓冲区的底层,也是默认的具有一个8192个字节长度的数组空间;也可以用构造方法指定这个缓冲区的大小.

缓冲输入流的方法

返回值方法
voidclose( ) ;关闭流并释放与之相关联的任何系统资源
Streamlines( );返回一个 Stream ,其元素是从这个 BufferedReader读取的行
voidmark(int readAheadLimit) 标记流中的当前位置
booleanmarkSupported( ) ;判断这个流是否支持mark( )操作;
intread( ) ;读一个字符
intread(char[ ] cbuf, int off, int len) ;将字符读入数组的一部分。
StringreadLine( ) 读一行文字;当读取到末尾时,会输出null.
booleanready( )
voidreset() 将流重置为最近的标记
longskip(long n) 跳过字符

除了类似于字节流的一个一个读/写存到缓冲区,以及一个数组一个数组读/写存到缓冲区,还可以一行一行地存储到缓冲区(返回值是字符串类型);然后通过输出方法中的写入一串字符串的方法写到缓冲区.

缓冲输出流的方法

返回值方法
voidclose( ) , 关闭流,先刷新
voidflush( ),刷新流
voidnewLine( ) ;写一行行分隔符;可达到换行写入的操作
voidwrite(char[ ] cbuf, int off, int len) 写入字符数组的一部分
voidwrite(int c) 写一个字符
voidwrite(String s, int off, int len) 写一个字符串的一部分

一行一行地读写文本文件:

在这里插入图片描述

import java.io.*;
public class Demo01 {
    //这里仅声明异常,在实际中需要捕获异常;
    public static void main(String[] args) throws IOException {
        //指定要输入的文件;当文件不存在,会抛异常
        FileReader fr=new FileReader("F:/JAVAIO流练习使用的文件夹/文本文件.txt");
        //创建缓冲输入流对象;
        BufferedReader br=new BufferedReader(fr);
        //指定要输出的目标文件;当文件不存在时;会自动创建输出的目标文件,
        FileWriter fw=new FileWriter("F:/JAVAIO流练习使用的文件夹/目标文本文件.txt");
        //创建缓冲输出流对象;
        BufferedWriter bw=new BufferedWriter(fw);
        String line =null;
        //设置循环,到文本末尾时停止;
        //public String readLine( );一行一行地读取字符;然后存到输入缓冲区;
        while((line=br.readLine())!=null){
            //public void write(String str);
            bw.write(line);//每次写入一串字符串;
            //public void newLine();进行换行操作;
            bw.newLine();
        }
        //刷新输出缓冲流;
        bw.flush();
        //关闭流;释放系统资源;
        br.close();
        bw.close();
    }
}

没有进行换行操作时;
目标文件:

在这里插入图片描述

进行了换行操作:
目标文件:

在这里插入图片描述



以上是关于JavaSE基础九----<IO流 >字符流,字符缓冲流的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE基础九---<IO流 >print打印流,对象输入输出流,对象序列化,transient关键字

JavaSE基础九----<IO流 >流的体系和分类,字节流,字节缓冲流

JavaSE案例 04——IO流综合运用案例案例

javaSE (二十一)字符流IO流小结案例

javaSE (二十)递归IO流自学字符流

JavaSE——IO流(字节流&字符流)