零、前言

1.字符流只能操作文本
2.本质底层依然是使用字节操作,只不过坐了一层封装
3.字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,对多国语言支持性比较好

一、字符流之FileWriter和FileReader

1.字符流之FileWriter的使用

注:new FileWriter(fileName,true) 追加模式添加数据

FileWriter fileWriter = null;
try {String fileName = "I:\\Java\\Base\\Thinking\\src\\IOTest\\FileWriter.txt";//1.创建一个输出流--写出文件:需明确被操作文件----文件不存在,会自动创建文件(同名覆盖)fileWriter = new FileWriter(fileName);//2.写入数据fileWriter.write("Line1 第一行\r\n");//3.刷新流中的缓冲fileWriter.flush();fileWriter.write("Line2 第二行");//获取文件编码格式
System.out.println(fileWriter.getEncoding());//UTF8
} catch (IOException e) {e.printStackTrace();
} finally {//4.关闭流也会刷新缓冲try {//不为空,才能关闭流if (fileWriter != null) {fileWriter.close();}} catch (IOException e) {e.printStackTrace();}
}
FileWriter.png


2.字符流之FileReader的使用

注:为了简单起见,将FileWriter.txt中的Line2 第二行删除

public class Client {public static void main(String[] args) {String fileName = "I:\\Java\\Base\\Thinking\\src\\IOTest\\FileWriter.txt";try {//1.创建一个输入流--读取文件FileReader fileReader = new FileReader(fileName);//2.读取字符//readOneByOne(fileReader);//一个一个读//readOneByWhile(fileReader);//循环一个一个读//readByCharArray(fileReader);//字符数组读取//readByCharArrayByWhile(fileReader);///字符数组循环读取fileReader.close();} catch (IOException e) {e.printStackTrace();}}
1).read()方法,一次读一个字符
private static void readOneByOne(FileReader fileReader) throws IOException {int ch1 = fileReader.read();System.out.println(ch1 + "=" + (char) ch1);//76=Lint ch2 = fileReader.read();System.out.println(ch2 + "=" + (char) ch2);//105=iint ch3 = fileReader.read();System.out.println(ch3 + "=" + (char) ch3);//110=nint ch4 = fileReader.read();System.out.println(ch4 + "=" + (char) ch4);//101=eint ch5 = fileReader.read();System.out.println(ch5 + "=" + (char) ch5);//49=1int ch6 = fileReader.read();System.out.println(ch6 + "=" + (char) ch6);//32=int ch7 = fileReader.read();System.out.println(ch7 + "=" + (char) ch7);//31532=第int ch8 = fileReader.read();System.out.println(ch8 + "=" + (char) ch8);//19968=一int ch9 = fileReader.read();System.out.println(ch9 + "=" + (char) ch9);//34892=行int ch10 = fileReader.read();System.out.println(ch10 + "=" + (char) ch10);//-1 //结束标志
}
read.png

2).循环读取

可见一个一个读十分麻烦,既然有结束标识,每次read()都会走到下一个位置,很像迭代器模式

 private static void readOneByWhile(FileReader fileReader) throws IOException {int ch = 0;while ((ch = fileReader.read()) != -1) {System.out.println(ch + "=" + (char) ch);}}

结果

76=L
105=i
110=n
101=e
49=1
32=
31532=第
19968=一
34892=行
3).使用字符数组读取
private static void readByCharArray(FileReader fileReader) throws IOException {//字符数组char[] buf = new char[8];int len = fileReader.read(buf);System.out.println("len=" + len + "---->" + new String(buf));//len=8---->Line1 第一char[] buf2 = new char[8];int len2 = fileReader.read(buf2);System.out.println("len=" + len2 + "---->" + new String(buf2));//len=3---->行\r\nchar[] buf3 = new char[8];int len3 = fileReader.read(buf3);System.out.println("len=" + len3 + "---->" + new String(buf3));//len=-1---->读完后len为-1
}
4).使用字符数组循环读取
private static void readByCharArrayByWhile(FileReader fileReader) throws IOException {//字符数组循环读取char[] buf = new char[8];int len = 0;while ((len = fileReader.read(buf)) != -1) {System.out.println(new String(buf, 0, len));//Line1 第一//行}
}
read.png


二、使用字符流FileWriter和FileReader拷贝文件

/*** 作者:张风捷特烈* 时间:2018/10/9 0009:12:47* 邮箱:1981462002@qq.com* 说明:将 I:\Java\Base\Thinking\src\IOTest\Activity.md*      拷贝到 F:\javaTest\IO 文件夹中*/
public class Copy {public static void main(String[] args) {FileWriter fileWriter = null;FileReader fileReader = null;try {//创建一个输出流--写出文件:到F:\javaTest\IO\Activity.mdfileWriter = new FileWriter("F:\\javaTest\\IO\\Activity.md");//创建一个输入流--读取文件:I:\Java\Base\Thinking\src\IOTest\Activity.mdfileReader = new FileReader("I:\\Java\\Base\\Thinking\\src\\IOTest\\Activity.md");int len = 0;//读取的长度char[] buf = new char[1024];//2K的字符数组while ((len = fileReader.read(buf)) != -1) {fileWriter.write(buf, 0, len);//写有效个字符}} catch (IOException e) {throw new RuntimeException("读取失败");}finally {try {//关闭输入流if (fileReader != null) {fileReader.close();}} catch (IOException e) {e.printStackTrace();}try {//关闭输出流if (fileWriter != null) {fileWriter.close();}} catch (IOException e) {e.printStackTrace();}}}
}

三、字符缓冲:BufferedWriter和BufferedReader

将字符读入内存缓冲区,避免频繁执行读写操作,提高流的操作效率默认字符数组缓冲区大小:8192 (即16K的缓冲)
1.BufferedWriter:缓存写出
BufferedWriter bfw = null;
try {String fileName = "I:\\Java\\Base\\Thinking\\src\\IOTest\\BufferedWriter.txt";//1.创建一个输出流--写出文件:需明确被操作文件----文件不存在,会自动创建文件(同名覆盖)bfw = new BufferedWriter(new FileWriter(fileName));//2.写入数据bfw.write("Line1 第一行");bfw.newLine();//换行 BufferedWriter特有方法,可区分不同平台换行//3.刷新流中的缓冲bfw.flush();bfw.write("Line2 第二行");
} catch (IOException e) {e.printStackTrace();
} finally {//4.关闭流也会刷新缓冲try {//不为空,才能关闭流if (bfw != null) {bfw.close();}} catch (IOException e) {e.printStackTrace();}
}
2.BufferedReader:缓存读取
public static void main(String[] args) {String fileName = "I:\\Java\\Base\\Thinking\\src\\IOTest\\Activity.md";try {//1.创建一个输入流--读取文件BufferedReader  bfr= new BufferedReader(new FileReader(fileName));//2.读取字符//读取一行:BufferedReader特有方法String line = null;while ((line = bfr.readLine()) != null) {System.out.println(line);}bfr.close();} catch (IOException e) {e.printStackTrace();}
}

四、效率测试

通过读取一个1275K的文件看时间消耗情况

/*** 一个一个字符读取测试** @param fileName* @return*/
private static String readOneByOne(String fileName) {FileReader fileReader = null;try {StringBuilder sb = new StringBuilder();fileReader = new FileReader(fileName);int ch = 0;while ((ch = fileReader.read()) != -1) {sb.append(new String((new char[]{(char) ch})));}return sb.toString();} catch (Exception e) {e.printStackTrace();return null;} finally {try {if (fileReader != null) {fileReader.close();}} catch (IOException e) {e.printStackTrace();}}
}
    /*** 字符数组效率测试** @param fileName* @return*/private static String readByArray(String fileName) {FileReader fileReader = null;try {StringBuilder sb = new StringBuilder();fileReader = new FileReader(fileName);int len = 0;char[] buf = new char[1024];while ((len = fileReader.read(buf)) != -1) {sb.append(new String(buf, 0, len));}return sb.toString();} catch (Exception e) {e.printStackTrace();return null;} finally {try {if (fileReader != null) {fileReader.close();}} catch (IOException e) {e.printStackTrace();}}}
    /*** BufferedReader效率测试** @param fileName* @return*/private static String readByBuffer(String fileName) {BufferedReader bfr = null;try {StringBuilder sb = new StringBuilder();bfr = new BufferedReader(new FileReader(fileName));String line = null;while ((line = bfr.readLine()) != null) {sb.append(line);}return sb.toString();} catch (Exception e) {e.printStackTrace();return null;} finally {try {if (bfr != null) {bfr.close();}} catch (IOException e) {e.printStackTrace();}}}
\ 一个字符 字符数组 BufferedReader
耗时 0.2798秒 0.1043秒 0.1165秒

后记:捷文规范

1.本文成长记录及勘误表
项目源码 日期 备注
V0.1--无 2018-10-9 Java中的字符流
V0.2--无 - -
2.更多关于我
笔名 QQ 微信 爱好
张风捷特烈 1981462002 zdl1994328 语言
我的github 我的简书 我的CSDN 个人网站
3.声明

1----本文由张风捷特烈原创,转载请注明
2----欢迎广大编程爱好者共同交流
3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4----看到这里,我在此感谢你的喜欢与支持

Java总结IO篇之字符流相关推荐

  1. Java总结IO篇之字节流与字符流转化

    本篇接上篇:Java中的字符流,流的读写的细节参考上篇 本篇讲述字节流相关话题,包括字节流的读取与写出,字节流转化为字符流 1.明确是否是纯文本:纯文本 ? 字符流: 字节流 2.明确数据来源( 输入 ...

  2. Stoker的Java学习之字节流与字符流

    Java学习之字节流与字符流 一. 字节流 字节流是在java.io包中操作文件内容的一大类,字节流将文字图片音频等文件转换成字节,进行数据传输. 在字节流中输出数据主要是使用OutputStream ...

  3. Java学习之字节流和字符流的转化

    Java学习之字节流和字符流的转化 1.字节流转换成字符流 输入字节流转为字符流需要用到InputStreamReader的构造方法: InputStreamReader(InputStream in ...

  4. Java IO 字节流与字符流 (三)

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  5. java.IO字节流和字符流详解

    IO流的分类 在学习字节流和字符流之前因该先学习IO流的分类,效果会更好 有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物, 往内存中去,叫做输入(Input).或者叫做读(Rea ...

  6. Java IO 字节流、字符流详解

    1. 字节流与字符流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接.类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流 ...

  7. java 字节流读取图片,字符流读取,二进制读取

    这两天在学习java中如何对文件进行读取,首先当然是对最简单的文件txt文件进行操练了.并且,逐渐的了解了Java中IO流是如何对文件进行操作的 操练了一段时间,便开始了对图片进行读取,开始的想法如下 ...

  8. [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)...

    一.概念 ------->1.BufferedReader/BufferedWriter [参考19.03.31文章] *Reader/Writer-------->2.InputStre ...

  9. JAVA SE学习day_06:字符流、异常处理

    一.字符流 java将流按照读写单位划分为字节流与字符流 字节流:超类为InputStream和OutputStream,读写单位为字节 字符流:超类为Reader和Writer,读写单位为cahr ...

  10. Java的知识点29—— 文件字符流、字节数组流

    文件字符流 FileReader  FileWriter 分段读取 文件字符输入流 package cn.dym; import java.io.File; import java.io.FileNo ...

最新文章

  1. lnmp环境搭建 wordpress 博客系统
  2. ME21N增强提示警告消息
  3. 装箱---一个工厂制造的产品形状都是长方体,它们的高度都是 h,长和宽都相等,一共有六个型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6.
  4. 认识mysql总结_从根上理解Mysql - 读后个人总结1-搜云库
  5. Schedulerx2.0分布式计算原理最佳实践
  6. MVVM下listbox默认显示最后一行
  7. Java String 对象,你真的了解了吗?| CSDN 博文精选
  8. django系列3.3--CBV 和 FBV
  9. 【C#】C#获取本地的内网(局域网)和外网(公网)IP地址的方法
  10. 【JavaEE】第零章(2020.03.06)模式 表 索引
  11. debug error/runtime error的原因之一
  12. 公务员从事计算机网络工作,干程序员好,还是从事公务员更有前途?网友:要是我就当公务员!...
  13. 灵格斯与众多常用软件的冲突问题
  14. 已知三角形顶点坐标,求其外接圆的公式
  15. 群晖 VMM虚拟机安装openwrt软路由做单臂旁路由
  16. 广度优先搜索和深度优先搜索
  17. geek软件是干什么的_Geek软件下载工具使用说明.pdf
  18. GTK槽回调函数,组件颜色,布局控件
  19. WPA-PSK无线网络破解原理与过程
  20. 如何给mac重做系统

热门文章

  1. 华硕电脑锁定计算机,华硕笔记本电脑的BIOS怎么设置
  2. java判断时间日期是否等于当前日期
  3. 图形验证码 java
  4. Android 传感器篇:(一)方向传感器
  5. php 安装扩展管理工具 pecl
  6. 如何下载最新的NDVI数据?需要翻墙,安装MRT,如何处理下载的NDVI数据?
  7. 固态硬盘扩展分区合并主分区方法
  8. UE4 Chunk分块
  9. 桌面运维之CMD命令
  10. Android系统连按5次电源键,手机连按5次电源键,能开启“紧急护主”功能,好多人没注意...