目录

前言

字符编码

面向字符输入/输出流类

转换流

转换输入流(InputStreamReader)类

转换输入流(InputStreamReader)类实例

转换输出流(OutputStreamWriter)类

转换输出流(OutputStreamWriter)类实例

FileWriter类

FileWriter类实例

FileReader类

FileReader类实例

BufferedWriter类

BufferedWriter类实例

BufferedReader类

BufferedReader类实例

PrintWriter类

PrintWriter类实例

最后


前言

上篇文章中,我们学习了Java I/O流——面向字节的输入/输出流(超级详细),字节流中数据的最小单元为字节,而Java采用Unicode字符编码,对每个字符,JVM会为其分配2字节的内存,而用字节流类读/写字符文本会很不方便,因此,java.io包中提供了Reader/Writer类,用表示字符的输入/输出流。

字符编码

在读/写文本文件时,最主要的问题是进行字符编码的转换。文本文件中字符有可能是采用各种类型的编码。例如:

  • String类getBytes(String encode)方法能返回字符串的特定类型的编码,其中encode参数指定编码类型;
  • String类不带参数的getBytes()方法则使用本地操作系统的默认字符编码。

在Java程序中,以下两种方式都能获得本地平台的字符编码类型:

System.getProperty("file.encoding");            //方式一
Charset cs=Charset.defaultCharset();            //方式二
System.out.println(cs);

注意:Windows操作系统,上面的代码一般会显示“GBK”;而在中文Linux平台上,通常会显示“UTF-8”。

面向字符输入/输出流类

面向字符的输入/输出流类是Reader/Writer的后代,如下图所示:

         

  • Reader类是一个抽象类,提供的方法与InputStream类似只是将基于byte的参数改为基于char;
  • Writer类是一个抽象类,提供的方法与OutputStream类似,只是将基于byte的参数改为基于char。

转换流

字符流建立在字节流的基础上,Java可将字节流和字符流互相转换。

Reader和Writer类默认在本地平台的字符编码和Unicode码之间进行转换:

  • Reader类:能够将输出流中采用其他编码类型的字节流转换为Unicode字符,再为这些字符分配内存;
  • Writer类:将内存中的Unicode字符转换为其他编码类型的字节流,再写到输出流中。

采用特定类型编码的字节流:

  • InputStreamReader类:将一个字节流中若干字节解码成字符;
  • OutputStreamWriter类:将字符编码成若干字节后写入一个字节流。

在实际应用中要根据流数据的特点来决定是否需要进行转换,例如:标准键盘输入提供的数据是字节形式的,实际上,想从键盘输入的数据是字符系列,因此转换成字符流更符合应用的特点。

使用InputStreamReader将字节流转换为字符流,为了能一次性地从键盘输入一行字符串,再用BufferedReader对字符流进行包装处理:

BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String  x=in.readLine();                //读取一行字符串

转换输入流(InputStreamReader)类

InputStreamReader是Reader的子类,一个InputStreamReader对象接受一个字节输入流作为源,产生相应的UTF-16字符。常用的构造方法有:

  • InputStreamReader(InputStream in):使用默认的字符集编码,将字节输入流转换为字符输入流并读取数据;
  • InputStreamReader(InputStream in,Charset c):按指定字符集的编码从输入流读取数据;
  • InputStreamReader(InputStream in,String enc)throws UnsupportedEncodingException:使用指定的字符集编码,将字节输入流转换为字符输入流并读取数据。

转换输入流(InputStreamReader)类实例

使用字符输入流读取文件内容:

import java.io.*;
public class first {public static void main(String[] args){String filename="D:/welcome.txt";        //创建一个变量filename存放文件路径try {InputStreamReader isr=new InputStreamReader(new FileInputStream(filename),"UTF-8"); //创建转换输入流,按UTF-8的编码从输入流读取数据int c;                               //创建int类型变量cwhile((c=isr.read())!=-1)            //使用while循环读取文件数据System.out.print((char)c);       //输出打印字符}catch(IOException e) {                  e.printStackTrace();                 //查看完整错误信息}}
}

运行结果为:

欢迎学习Java!!!

注意:支持汉字的编码字符集有GB2312、GBK、UTF-8、UTF-16。其中GBK是GB2312的扩展,它们均是双字节编码,UTF-16采用定长的双字节,而UTF-8采用变长字节表示不同字符;

转换输出流(OutputStreamWriter)类

OutputStreamWriter类是Writer的子类。一个OutputStreamWriter对象将UTF-16字符转换为指定的字符编码的形式写入字节输出流。常用的构造方法有:

  • OutputStreamWriter(OutputStream out):按默认字符集的编码将字节输出流转换为字符输出流并写入数据;
  • OutputStreamWriter(OutputStream out,Charset c):按指定字符集的编码往输出写入数据;
  • OutputStreamWriter(OutputStream out,String enc)throws UnsupportedEncodingException:按名称所指字符集的编码将字节输出流转换为字符输出流写入数据。

转换输出流(OutputStreamWriter)类实例

使用字符输出流往文本文件写入数据

import java.io.*;
public class first {public static void main(String[] args){String filename="D:/welcome.txt";try {OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(filename),"UTF-8");    //创建转换输出流osw.write("Hello,我是霖hero博主,一个想当英雄的男人!!!");    //向文本文件写入数据osw.close();                //关闭文件}catch(IOException e) {    e.printStackTrace();        //查看所有错误信息}}
}

FileWriter类

FileWriter类用于写字符文件,每次写入一个字符、一个数组或一个字符串,其类对象通常看成一个以字符为基本单位的无格式字符输出流。其构造方法有:

  • FileWriter(File file,boolean append)throws IOException:根据File对象构造一个FileWriter对象,若第二个参数为true,则将字符以添加的方式写入文件尾处,若为false则原有文件内容被清除;
  • FileWriter(String fileName,boolean append)throws IOException:根据字符串文件名构造一个FileWriter对象,若第二个参数为true,则将字符以添加的方式写入文件尾处,若为false则原有文件内容被清除。

FileWriter类实例

将九九乘法表写入文本文件中

import java.io.*;
public class first {public static void main(String[] args) throws IOException{String filename="D:/table.txt";        FileWriter fw=new FileWriter(filename,true);    //创建FileWriter对象for(int i=1;i<=9;i++) {                         //利用两个for循环打印九九乘法表for(int j=1;j<=i;j++) {String s=i+"*"+j+"="+j*i+" ";fw.write(s);                            //将乘法表写入文本文件中}fw.write("\r\n");                           //写入回车换行符}fw.flush();                                     //强制刷新流}
}

运行结果为:

FileReader类

FileReader类用于读字符文件,每次读取一个字符或一个字符数组,其类对象通常看成一个以字符为基本单位的无格式字符输入流。其构造方法有:

  • FileReader(String fileName)throws FileNotFoundException:在给定中的文件名读取数据的情况下创建一个新的FileReader类;
  • FileReader(File file)throws FileNotFoundException:在给定中的File参数读取数据的情况下创建一个新的FileReader类。

FileReader类实例

读取上面FileReader类实例中的table.txt文件中的九九乘法表

import java.io.*;
public class first {public static void main(String[] args) throws IOException{FileReader fr=new FileReader("D:/table.txt");   //创建FileReader对象int c;while((c=fr.read())!=-1) {                //读取文件中的内容System.out.print((char)c);            //将c转换为char类型并输出文件中的内容}}
}

运行结果为:

BufferedWriter类

BufferedWriter是带缓冲的字符流,可用于以文本行为单位处理文本的场合,其常用的方法有:

  • BufferedWriter(Writer out):将输出流out转换成带缓冲的字符流,缓冲区大小为系统默认的;
  • BufferedWriter(Writer out,int sz):将流out转换成带缓冲的字符流,缓冲区大小为sz;
  • void newLine()throws IOException:写入行结束标记,该标记不是简单的换行符('\n'),而是由系统定义的属性line.separator。

BufferedWriter类实例

将100以内所有的质数写入文本文件,要求每10个数一行。

import java.io.*;
public class first {static boolean isPrime(int n) {for(int i=2;i<=n/2;i++)          //判断是否为质数if(n%i==0)return false;return true;}public static void main(String[] args) throws IOException{BufferedWriter bw=new BufferedWriter(new FileWriter("D:/number.txt"));  //创建BufferedWriter对象int j=0;for(int i=2;i<=100;i++) {if(isPrime(i)) {j++;String s=String.valueOf(i);String s1=s+" ";bw.write(s1);            //写入数据到文本文件中if(j==10) {                    j=0;                 bw.newLine();        //当j=10时,写入一个换行符}}}bw.flush();                      //强制刷新流bw.close();                      //关闭文本文件}
}

运行结果为:

BufferedReader类

BufferedReader是带缓冲的字符流,可用于以文本行为单位处理文本的场合,其常用的方法有:

  • BufferedReader(Reader in):将输入流in转换成带缓冲的字符流,缓冲区大小系统默认的;
  • BufferedReader(Reader in ,int sz):将流in转换成带缓冲的字符流,缓冲区大小为sz;
  • String readLine()throws IOException:从输入流中读取一行字符,行结束标志为回车('\r')/换行('\n')或连续的回车换行符(''r''\n')。

BufferedReader类实例

打印输出BufferedWriter类实例对象中的number.txt文件中的数据。

import java.io.*;
public class second {public static void main(String[] args)throws IOException {BufferedReader br=new BufferedReader(new FileReader("D:/number.txt"));    //创建BufferedReader对象int c;                            //创建int型变量cwhile((c=br.read())!=-1)          //判断是否读完文本中的数据System.out.print((char)c);    //将int型转换为char型并输出System.out.println();}
}

运行结果为:

PrintWriter类

文本文件的输出流有FileWriter类,该类通常是以字符为单位写入文本文件,但有时需要以Java的基本数据类型为单位写入文本文件,使用FileWriter类写入处理起来不是很方便,因此Java引入PrintWriter类进行此类文本的输出。其构造方法有:

  • PrintWriter(Writer out):将任意一个字符输出流out串接成一个PrintWriter对象,不自动刷空流;
  • PrintWriter(Writer out,boolean autoFlush):将任意一个字符输出流out串接成一个PrintWriter对象,若boolean值为true则自动刷空流;
  • PrintWriter(OutputStream out):将任意一个字符输出流out串接成一个PrintWriter对象,不自动刷空流;
  • PrintWriter(OutputStream out,boolean autoFlush):将任意一个字节输出流out串接成一个PrintWriter对象,若boolean值为true则自动刷空流。

PrintWriter类实例

如果一个四位数是11的倍数且十位数字加上百位数字刚好等于前位数字,则将该四位数写入文本文件中。

import java.io.*;
public class printWriter {public static void main(String[] args)throws IOException{FileWriter fw=new FileWriter("D:/four.txt");    //创建FileWriter对象PrintWriter pw=new PrintWriter(fw);             //创建PrintWriter对象int num=0;for(int i=1000;i<10000;i++) {                   //利用for循环获得各个位的数字int A=i/1000;                               //千位上的数int B=i/100%10;                             //百位上的数int C=i/10%10;                              //十位上的数if(i%11==0&&A==B+C) {                       //如果是11的倍数,且十位数字加百位数字等于千位数字pw.print(i+"  ");                       //打印输出该四位数if(++num==10) {                         //每十个数换一行num=0;pw.println();}}}fw.close();                                     //关闭文本文件}
}

运行结果为:

最后

好了,关于Java  I/O流——面向字符输入/输出流的知识学到这里,谢谢观看!!!

我们下篇文章再见!!!

成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。

Java I/O流——面向字符输入/输出流(超详细)相关推荐

  1. JAVA的IO流 和网络编程 超详细每行代码都有备注

    IO流: {     文件的操作: f1.getAbsolutePath();//获取绝对路径               f1.getPath();//获取相对路径               f1 ...

  2. java字节输入与字符输入_Java中的字节输入出流和字符输入输出流

    Java中的字节输入出流和字符输入输出流 下面哪个流类属于面向字符的输入流( ) A BufferedWriter B FileInputStream C ObjectInputStream D In ...

  3. Java中的字节输入出流和字符输入输出流

    Java中的字节输入出流和字符输入输出流 下面哪个流类属于面向字符的输入流( ) A BufferedWriter  B FileInputStream  C ObjectInputStream  D ...

  4. Java I/O流——面向字节的输入/输出流(超级详细)

    目录 前言 流的概念 I/O设备与文件 面向字节的输入流 InputStream类 类InputStream的子类的使用 文件输入流(FileInputStream) 文件输入流(FileInputS ...

  5. Java中IO流,输入输出流概述与总结(转载自别先生文章)

    Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  6. java中nio流_Java输入输出流IO介绍(与NIO比较)

    一.Java中流的类型 根据流的方向划分:输入流,输出流 根据流的传输单位:字节流,字符流 根据流的角色划分:节点流,处理流 节点流:直接连接数据源的流 处理流:通过构造方法接收一个节点流,对节点流使 ...

  7. Java中IO流,输入输出流概述与总结

    1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的 ...

  8. java IO(二)—— 字符输入输出流

    javo. io. Reader:字符输入流 是字符输入流的最顶层的父类,定义了-些共性的成员方法,是一个抽象类 共性的成员方法: int read() 读取单个字符并返回. int read(cha ...

  9. 被怼到绝望的我,Java框架体系架构的知识,超详细

    前言 消息中间件作为分布式系统的重要成员,各大公司及开源均有许多解决方案.目前主流的开源解决方案包括RabbitMQ.RocketMQ.Kafka.ActiveMQ等.消息这个东西说简单也简单,说难也 ...

最新文章

  1. Ubuntu10.04下PDF中文无法显示或显示乱码的解决方法
  2. TensorFlow框架--Keras
  3. 【CyberSecurityLearning 73】DC系列之DC-4渗透测试
  4. 大数据集群问题排查:时间不同步导致hbase regionserver只启动了部分节点的进程
  5. 全局变量-函数内部不允许修改局部变量的值
  6. How does UDO tool resolve objects
  7. 第一个Android程序
  8. Javascipt超详细版思维导图+基础语法导航
  9. salesforce php,具有自动登录功能的Salesforce php REST API
  10. 仿苹果手机闹钟_原来iPhone闹钟这么牛!用6年苹果今天才发现,以前不懂一直想删...
  11. Ruby学习笔记-循环与选择结构
  12. 数据结构与算法 汉诺塔问题和列车车厢重排问题
  13. FreeSwitch给会议室人员增加标识
  14. yaws mysql_MySQL入门之C语言操作MySQL
  15. 南广学院计算机清考,请问下中国传媒大学南广学院补考和重修要收费吗
  16. 用HTML代码实现个人简历的编写
  17. 2020-12-30
  18. python中等高线填充颜色_Matplotlib:使用透明颜色填充等高线图
  19. 蓝桥杯B组初赛2019
  20. 什么是GIS,GIS能干什么

热门文章

  1. Joint Tx-Rx Beamforming Design for Multicarrier MIMO Channels: A Unified Framework (2)
  2. OpenStack使用Bosh部署CloudFoundry(四)—使用Micro Bosh部署Bosh
  3. linux pdf中文不显示,linux下pdf中文不显示
  4. 什么是次世代游戏?发展前景好吗?
  5. word中出现公式上浮的解决办法
  6. No such file or directory:Failed to chmod /Users/hthy/Library/Developer/CoreSimulator/Devices/125D87
  7. 各大平台卡卷直充接口源码
  8. Golang学习笔记08 链表
  9. Ubuntu安装英伟达驱动CUDA,CUDNN,PyTorch保姆级教程
  10. 2018洛奇英雄传永恒最新服务器,洛奇英雄传:永恒官方网站-这一次让经典成为永恒...