缓存字符流

缓冲字符输出流:java.io.PrintWriter

java.io.BufferedWriter和BufferedReader

缓冲字符流内部也有一个缓冲区,读写文本数据以块读写形式加快效率.并且缓冲流有一个特别的功能:可以按行读写文本数据.

java.io.PrintWriter具有自动行刷新的缓冲字符输出流,实际开发中更常用.它内部总是会自动连接BufferedWriter作为块写加速使用. 

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.PrintWriter;

import java.io.UnsupportedEncodingException;

​

/**

* 缓冲字符流(是一对高级流)

* java.io.BufferedWriter和BufferedReader

* 缓冲流内部维护一个char数组,默认长度8k.以块读写方式读写字符数据保证效率

*

* java.io.PrintWriter则是具有自动行刷新的换成字符输出流(实际缓冲功能是靠BufferedWriter

* 实现的,它内部总是连接着这个流。)

*

* 使用缓冲字符流后就可以实现按行读写字符串,并且读写效率高。

*/

public class PWDemo1 {

   public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {

       //按行向文件pw.txt中写入字符串

       /*

           PrintWriter继承自Writer.

           它提供很多构造方法,其中就有可以直接对文件进行写操作的构造器

           PrintWriter(File file)

           PrintWriter(String filename)

        */

//        PrintWriter pw = new PrintWriter("pw.txt");

       /*

           这里可以按照指定的字符集写出字符串到文本文件中。但是字符集只能以字符串形式

           表达。因此注意拼写。字符集不区分大小写。

           但是如果字符集名字拼写错误,会抛出异常:

           UnsupportedEncodingException

           不支持的    字符集    异常

        */

       PrintWriter pw = new PrintWriter("pw.txt","UTF-8");

       /*

           println()方法是输出字符出后带上换行符

           print()方法输出字符串后不带换行符

        */

       pw.println("第一句话");

       pw.println("第二句话");

       System.out.println("写出完毕!");

       pw.close();

​

   }

}

在流链接中使用PW

import java.io.*;

import java.nio.charset.StandardCharsets;

import java.util.Scanner;

​

/**

* 练习PrintWriter的流连接操作

*/

public class PWDemo2 {

   public static void main(String[] args) throws FileNotFoundException {

       //文件输出流(低级流,字节流) 作用:向文件中写出字节

       FileOutputStream fos = new FileOutputStream("pw2.txt");

       //转换输出流(高级流,字符流) 作用:1衔接字符与字节流的 2:将写出的字符转换为字节

       OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);

       //缓冲字符输出流(高级流,字符流) 作用:块写文本数据加速的(内部有一个8k的char数组)

       BufferedWriter bw = new BufferedWriter(osw);

       //具有自动行刷新功能(高级流,字符流) 作用:1按行写出字符串(println) 2:自动行刷新

       PrintWriter pw = new PrintWriter(bw);

       Scanner scanner = new Scanner(System.in);

       while(true) {

          String line = scanner.nextLine();

          if("exit".equals(line)){

               break;

          }

          pw.println(line);

       }

       System.out.println("写出完毕!");

​

       pw.close();

   }

}

PrintWriter的自动行刷新功能

如果实例化PW时第一个参数传入的是一个流,则此时可以再传入一个boolean型的参数,此值为true时就打开了自动行刷新功能。 即: 每当我们用PW的println方法写出一行字符串后会自动flush.

import java.io.*;

import java.nio.charset.StandardCharsets;

import java.util.Scanner;

​

/**

* 练习PrintWriter的流连接操作

*/

public class PWDemo2 {

   public static void main(String[] args) throws FileNotFoundException {

       //文件输出流(低级流,字节流) 作用:向文件中写出字节

       FileOutputStream fos = new FileOutputStream("pw2.txt");

       //转换输出流(高级流,字符流) 作用:1衔接字符与字节流的 2:将写出的字符转换为字节

       OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);

       //缓冲字符输出流(高级流,字符流) 作用:块写文本数据加速的(内部有一个8k的char数组)

       BufferedWriter bw = new BufferedWriter(osw);

       //具有自动行刷新功能(高级流,字符流) 作用:1按行写出字符串(println) 2:自动行刷新

       /*

           当我们创建PrintWriter时,构造方法里第一个参数为一个流,那么就支持再传入

           一个boolean值参数表示是否打开自动行刷新功能,传入true则打开。

           此时每当我们调用它的println方法写出一行字符串后就会自动flush()一次。

           注意:print方法和write方法写出字符串时并不会自动flush()

        */

       PrintWriter pw = new PrintWriter(bw,true);

       Scanner scanner = new Scanner(System.in);

       while(true) {

          String line = scanner.nextLine();

          if("exit".equals(line)){

               break;

          }

          pw.println(line);

//           pw.print("");//不会自动flush

//           pw.write("");//不会自动flush

       }

       System.out.println("写出完毕!");

​

       pw.close();

   }

}

缓冲字符流

缓冲字符输入流:java.io.BufferedReader

是一个高级的字符流,特点是块读文本数据,并且可以按行读取字符串。

import java.io.*;

​

/**

* 使用缓冲字符输入流按行读取字符串

* 该高级流的主要作用:

* 1:块读文本数据加速(内部有一个默认8k的char数组)

* 2:可以按行读取字符串

*/

public class BRDemo {

   public static void main(String[] args) throws IOException {

       //将当前源代码输出到控制台上

       /*

           思路:

           读取当前源代码文件,按行读取,并且将读取到的每一行字符串都输出到控制台上即可

        */

       //文件输入流(低级流,字节流) 作用:从文件中读取字节

       FileInputStream fis = new FileInputStream("./src/io/BRDemo.java");

       //转换输入流(字符流,高级流) 作用:1衔接字节与字符流 2将读取的字节转换为字符

       InputStreamReader isr = new InputStreamReader(fis);

       //缓冲字符输入流(字符流,高级流) 作用:1块读字符数据加速  2按行读取字符串

       BufferedReader br = new BufferedReader(isr);

       /*

           BufferedReader缓冲字符输入流

           提供了一个独有的方法:readLine()

           作用:读取一行字符串。连续读取若干字符直到遇到了换行符位置,并将换行符之前的

               内容返回。注意:返回的字符串里不包含最后的换行符。

               特殊情况:

               如果这一行只有一个换行符,那么返回值为空字符串:""

               如果读取到了流的末尾,那么返回值为null。

​

           实际运行时:

           当我们第一次调用readLine()方法时,缓冲字符输入流实际会一次性读取8k的char

           回来并存入内部的char数组中(块读文本操作)。readLine方法只将char数组中从头

           开始一直到第一个换行符位置的内容以一个字符串形式返回。

        */

       String line;

       while((line = br.readLine()) != null){

           System.out.println(line);

       }

​

       br.close();

   }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值