java的IO流---字符流

一、字符输入流Reader

Reader 是所有的输入字符流的父类,它是一个抽象类。

           

Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。

(1)看看几个常用的实现类

  • InputStreamReader类

      该类从数据源读取字节并将其解码为使用指定的字符集的字符。InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。字节流比字符流的使用范围更广,但字符流比字节流操作方便。如果现在有一个字节流,但可以确定这个字节流的内容都是文本内容,我们就可以将它转换成字符流处理起来会更方便一点。

//创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in)  
// 创建使用指定字符集的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
  • FileReader类

       该类继承于InputStreamReader,用于读取字符类文件,如文本文件。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。

  • BufferedReader类

    字节输入缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine。

//读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
public String readLine()throws IOException

(2)看看常用方法:下面是Reader类的常用方法介绍。

  •  public int read(int b) throws IOExecption:

       该方法用于读取单个字符,返回作为整数读取的字符,如果已经到达流的末尾,返回-1。

  •  public int read(char[] cbuf) throws IOExecption

       该方法用于将字符读入到cbuf,返回读取的字符数。

  •  public abstract int read(char[] cbuf,int off,int len) throws IOExecption

       该方法用于读取len个字符的数据,并从数组cbuf的off位置读入到这个数组中。

  •  public abstract void close() throws IOExecption

      关闭此输入流,并释放与此输出流相关联的所有系统资源。

二、字符输出流

Writer:是所有的输出字符流的父类,它是一个抽象类。

                 

  • OutputStreamWriter

       将字节输出流转为字符输出流,是字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。常用够造方法如下:

//可以设置编码格式
public OutputStreamWriter(OutputStream out, String charsetName); 
//创建使用默认字符编码的 OutputStreamWriter。
public OutputStreamWriter(OutputStream out)
  • FileWriter:该类写文件方式与OutputStreamWriter基本一样

        从OutputStreamWriter类继承而来。该类按字符向流中写入数据,可以关联源文件。主要够造函数:

//创建字符输出流类对象和已存在的文件相关联。
FileWriter fw = new FileWriter(String fileName);
//文件不存在的话,并创建。 
如:FileWriter fw = new FileWriter("C:\\demo.txt");
//创建字符输出流类对象和已存在的文件相关联,并设置该该流对文件的操作是否为续写。
FileWriter fw = new FileWriter(String fileName,boolean append);
// 表示在fw对文件再次写入时,会在该文件的结尾续写,并不会覆盖掉。
如:FileWriter fw = new FileWriter("C:\\demo.txt",ture); 
  • BufferedWriter(缓冲流)

       字节输出缓冲流,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。 该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。该类写入文本的方法就是父类Writer提供的write()系列方法,在这里我们演示他特有的newLine( )方法:

public static void newLineTest() throws IOException{
        BufferedWriter bw=new BufferedWriter(new FileWriter("E:\\test\\javaIo\\2.txt"));
        bw.write("爱我");
        bw.newLine();
        bw.write("中华");
        bw.flush();
        bw.close();
    }
//结果:(加入了换行符)
  爱我
  中华

三、使用示例

1、InputStreamReader:

  • public int read() throws IOException

       读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。

  • public int read(char[] cbuf) throws IOException  

       从输入流读取若干字符数据,并存储到字符数组。在某个输入可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。

  • abstract int read (char[] cbuf, int off, int len)       

       从输入流读取至多len个字符数据,并存储到字符数组

public class InputStreamReaderTest {
	public static void main(String[] args) throws IOException {
		InputStreamReader isr = new InputStreamReader(
				    new FileInputStream("src\\IOTest\\testfile.txt"));
		char[] c = new char[1024];
		int len = 0;
		while((len=isr.read(c))!=-1) {
			System.out.println(new String(c,0,len));
		}
	}
}

2、OutputStreamWriter:

  •     void write(char[] cbuf)                                            将指定字符数组的内容写入输出流
  •     abstract void write(char[] cbuf,int off,int len)          将指定字符数组从off位置开始的len个字符写入输出流
  •     write(int c)                                                             将指定的字符写入输出流
  •    abstract void flush()                      刷新输出流,强制将缓冲区内容写入输出流
public class OutputStreamWriterTest {

	public static void main(String[] args) throws IOException {
		OutputStreamWriter osw = new OutputStreamWriter(
				new FileOutputStream("src\\IOTest\\osw.txt"));
		String str = "Hello OutputStreamWriter";
		osw.write(str);
		osw.flush();
		osw.close();

	}

}

3、字符流提供了带缓冲区的包装流,分别是BufferedReader和BufferedWriter,其中BufferedReader用于对字符输入流进行包装,BufferedWriter用于对字符输出流进行包装。缓冲区的出现提高了对数据的读写效率。

文件复制示例:

public class BufferedRWTest {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(
				  new FileInputStream("src\\IOTest\\testfile.txt")));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
				  new FileOutputStream("src\\IOTest\\copy.txt")));
		/*一次读一行的方式
		String str = null;
		while((str=br.readLine())!=null) {//一次读一行
			bw.write(str);
			bw.newLine();//读完一行给一个换行符
			bw.flush();
		}
		*/
		//另一种方式:
		char [] ch=new char[1024];
        int len=0;
        while((len=br.read(ch))!=-1){
            bw.write(ch, 0, len);
            bw.flush();
        }
		br.close();
		bw.close();
	}
}

借鉴博客:https://www.cnblogs.com/jalja/p/6030137.html

https://www.cnblogs.com/justdoitba/p/7582139.htmlhttp://baijiahao.baidu.com/s?id=1600444161351758219&wfr=spider&for=pc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值