字符流

只能读写文本文件

Reader 抽象类 字符输出流的父类

Writer 抽象类 字符输出流的父类

字符转换输出流:

OutputStreamWriter(OutputStream out):创建使用默认字符编码的 OutputStreamWriter

OutputStreamWriter(OutputStream out, String charsetName) :创建使用指定字符集的 OutputStreamWriter

案例1:

  1. public class MyTest {
  2. public static void main(String[] args) throws IOException {
  3. //输出流,所关联的文件如果不存在则自动创建
  4. OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("a.txt"));
  5. //往文件中写入数据
  6. out.write('你'); //一次写入一个字符
  7. out.write('好');
  8. out.flush(); //字符流要刷新一下
  9. out.write('你'); //一次写入一个字符
  10. out.write('好');
  11. out.write('你'); //一次写入一个字符
  12. out.write('好');
  13. out.flush();
  14. out.write("好好学习天天向上"); //一次写入一个字符串
  15. out.write("好好学习天天向上",0,6); //一次写入字符串的一部分,
  16. out.write("\r\n");//换行
  17. char[] chars = {'a', 'b', 'c', 'd', '爱', '你', '呦'};
  18. out.write(chars); //一次希尔一个字符数组
  19. out.write("\r\n");
  20. out.write(chars,4,3);//一次写入字符数组的一部分
  21. //释放资源
  22. out.close(); //刷新并关闭
  23. }
  24. }

案例2:

  1. public class MyTest2 {
  2. public static void main(String[] args) throws IOException {
  3. //参数2 可以指定码表 GBK UTF-8
  4. OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("b.txt",true),"UTF-8");
  5. out.write("我们使用GBK编码写入");
  6. out.write("\r\n");
  7. out.write("我们使用GBK编码写入");
  8. out.write("\r\n");
  9. out.flush();//字符流记得刷新
  10. //释放资源
  11. out.close();
  12. }

字符转换输入流

InputStreamReader(InputStream in): 创建一个使用默认字符集的 InputStreamReader。

InputStreamReader(InputStream in, String charsetName):创建使用指定字符集的 InputStreamReader

案例1:字符转换流读取单个字符

  1. public class MyTest {
  2. public static void main(String[] args) throws IOException {
  3. // InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符
  4. //输入流 所关联的文件,如果不存在就报错
  5. InputStreamReader in = new InputStreamReader(new FileInputStream("c.txt"));
  6. //读取文件中的数据
  7. int ch = in.read(); //一次读取一个字符,如果读取不到返回-1 使用-1 就可以判断文件释放读取完毕
  8. System.out.println((char)ch);
  9. ch = in.read(); //一次读取一个字符
  10. System.out.println((char) ch);
  11. ch = in.read(); //一次读取一个字符
  12. System.out.println((char) ch);
  13. ch = in.read();
  14. in.close();

案例2:字符输入流把字符出租转换成字符串

  1. public class MyTest2 {
  2. public static void main(String[] args) throws IOException {
  3. InputStreamReader in = new InputStreamReader(new FileInputStream("a.txt"));
  4. char[] chars = new char[1024];
  5. int len = in.read(chars); //返回值是读取到的有效字符个数
  6. //方式1:把字符数组转换成字符串
  7. String s = new String(chars, 0, len);
  8. System.out.println(s);
  9. //方式2:把字符数组转换成字符串
  10. String s1 = String.valueOf(chars, 0, len);
  11. System.out.println(s1);
  12. System.out.println("====================================");
  13. char[] chars2 = new char[1024];
  14. InputStreamReader in2 = new InputStreamReader(new FileInputStream("a.txt"));
  15. //一次读取一部分字符,填充到字符数组中
  16. int len2 = in2.read(chars2, 0, 10);
  17. for (char c : chars2) {
  18. System.out.println(c);
  19. }
  20. }
  21. }

案例3:使用字符流一次读取一个字符,写一个字符来复制文本文件

  1. public class MyTest3 {
  2. public static void main(String[] args) throws IOException {
  3. InputStreamReader in = new InputStreamReader(new FileInputStream("MyTest.java"));
  4. OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("C:\\Users\\jjh\\Desktop\\a.txt"));
  5. //一次读取一个字符,写一个字符来复制
  6. int len=0;//定义一个变量,来记录读取的字符
  7. while ((len=in.read())!=-1){
  8. out.write(len);
  9. out.flush();
  10. }
  11. //释放资源
  12. in.close();
  13. out.close();
  14. }
  15. }

案例4:使用字符数组充当缓冲区来复制文本文件

  1. public class MyTest4 {
  2. public static void main(String[] args) throws IOException {
  3. InputStreamReader in = new InputStreamReader(new FileInputStream("MyTest.java"));
  4. OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("C:\\Users\\ShenMouMou\\Desktop\\b.txt"));
  5. //定义一个字符数组,来充当缓冲区
  6. char[] chars = new char[1000];
  7. //定义一个变量,用来记录读取到的有效字符个数
  8. int len=0;
  9. while ((len=in.read(chars))!=-1){
  10. System.out.println("循环次数");
  11. out.write(chars,0,len);
  12. out.flush();
  13. }
  14. //释放资源
  15. in.close();
  16. out.close();
  17. }
  18. }

便捷字符流

FileReader(File file):在给定从中读取数据的 File 的情况下创建一个新 FileReader

FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新 FileReader

FileReader(File file):在给定从中读取数据的 File 的情况下创建一个新 FileReader。

FileReader(String fileName):根据给定的 File 对象构造一个 FileWriter 对象

  1. public class MyTest {
  2. public static void main(String[] args) throws IOException {
  3. //父类-------------------------子类
  4. //OutputStreamWriter-----------FileWriter
  5. //InputStreamReader------------- FileReader
  6. //便捷字符流,的缺点是不能指定编码表,用的是平台默认码表
  7. FileReader in = new FileReader("a.txt");
  8. FileWriter out = new FileWriter("aa.txt");
  9. //定义一个字符数组,来充当缓冲区
  10. char[] chars = new char[1000];
  11. //定义一个变量,用来记录读取到的有效字符个数
  12. int len = 0;
  13. while ((len = in.read(chars)) != -1) {
  14. System.out.println("循环次数");
  15. out.write(chars, 0, len);
  16. out.flush();
  17. }
  18. //释放资源
  19. in.close();
  20. out.close();
  21. }
  22. }

高效的字符流

BufferedReader(Reader in): 创建一个使用默认大小输入缓冲区的缓冲字符输入流

BufferedWriter(Writer out) :创建一个使用默认大小输出缓冲区的缓冲字符输出流

  1. public class MyTest {
  2. public static void main(String[] args) throws IOException {
  3. BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));
  4. // BufferedReader bfr2 = new BufferedReader(new FileReader("a.txt"));
  5. // BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("aaa.txt")));
  6. BufferedWriter bfw = new BufferedWriter(new FileWriter("aaaa.txt"));
  7. //以上两种都可以传参 FileReader和FileWriter不能追加而且不能设置码表 只能用平台默认编码表
  8. char[] chars = new char[1000];
  9. int len=0;
  10. while ((len=bfr.read(chars))!=-1){
  11. bfw.write(chars,0,len);
  12. bfw.flush();
  13. }
  14. bfw.close();
  15. bfr.close();
  16. }
  17. }

高效字符流的两个特有方法

BufferedReader readLine() :一次读取一行内容

BufferedWriter newLine():写入换行符且具有平台兼容性

案例1:高效字符流采用读取一行写入一行的方式来复制文本文件

  1. public class MyTest2 {
  2. public static void main(String[] args) throws IOException {
  3. BufferedReader bfr = null;
  4. BufferedWriter bfw = null;
  5. bfr = new BufferedReader(new InputStreamReader(new FileInputStream("MyTest.java")));
  6. bfw = new BufferedWriter(new FileWriter("test.java"));
  7. //定义一个变量来记录读取到的每一行
  8. String line = null;
  9. //String s = bfr.readLine();
  10. while ((line = bfr.readLine()) != null) { //注意一行一行的读取,读取不到返回null
  11. bfw.write(line);
  12. //bfw.write("\r\n");
  13. bfw.newLine();//写个换号符
  14. bfw.flush();
  15. }
  16. }
  17. }

字符流的案例演示

案例1:把ArrayList集合中的字符串数据存储到文本文件

  1. public class MyTest {
  2. public static void main(String[] args) throws IOException {
  3. ArrayList<String> list = new ArrayList<>();
  4. list.add("张飞");
  5. list.add("赵云");
  6. list.add("马超");
  7. list.add("关羽");
  8. list.add("黄忠");
  9. BufferedWriter bfw = new BufferedWriter(new FileWriter("name.txt"));
  10. for (String s : list) { //遍历集合
  11. bfw.write(s);
  12. bfw.newLine();
  13. bfw.flush();
  14. }
  15. bfw.close();
  16. }
  17. }

案例2:从文本文件中读取数据(每一行为一个字符串数据) 到集合中,并遍历集合

  1. public class MyTest2 {
  2. public static void main(String[] args) throws IOException {
  3. BufferedReader bfr = new BufferedReader(new FileReader("name.txt"));
  4. ArrayList<String> list = new ArrayList<>();
  5. while (true) {
  6. String s = bfr.readLine();
  7. if (s == null) {
  8. break;
  9. }
  10. list.add(s.trim());//去掉空格
  11. }
  12. System.out.println(list);
  13. }

案例3:从随机名单里面抽取一个人

  1. public class MyTest3 {
  2. public static void main(String[] args) throws IOException {
  3. BufferedReader bfr = new BufferedReader(new FileReader("name.txt"));
  4. ArrayList<String> list = new ArrayList<>();
  5. while (true) {
  6. String s = bfr.readLine();
  7. if (s == null) {
  8. break;
  9. }
  10. list.add(s.trim());
  11. }
  12. //生成一个随机索引
  13. Random random = new Random();
  14. int index = random.nextInt(list.size()); //0----9
  15. System.out.println(index);//打印出索引
  16. System.out.println(list.get(index));//打印出索引所对的人名
  17. }
  18. }

IO流—字符流的更多相关文章

  1. Java IO: 其他字符流(下)

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...

  2. Java IO流字符流简介及基本使用

    Java IO流字符流简介及常用字符流的基本使用 字符流分为输入字符流(Writer)和输出字符流(Reader),这两种字符流及其子类字符流都有自己专门的功能.在编码中我们常用的输出字符流有File ...

  3. 【Java基础】【21IO(字符流)&字符流其他内容&递归】

    21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写 ...

  4. java-IO流-字符流-FileReader、FileWriter、自定义小数组的拷贝、BufferedReader、BufferedWriter、readLine()和newLine()方法、LineNumberReader、使用指定的码表读写字符

    ###21.01_IO流(字符流FileReader) * 1.字符流是什么     * 字符流是可以直接读写字符的IO流     * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要 ...

  5. JavaSE18-字节缓冲流&字符流

    1.字节缓冲流 1.1 字节缓冲流构造方法 字节缓冲流介绍 BufferOutputStream:该类实现缓冲输出流. 通过设置这样的输出流,应用程序可以向底层输出流写 入字节,而不必为写入的每个字节 ...

  6. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  7. [Java IO]03_字符流

    Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类.  它的定义如下: public abstra ...

  8. IO流---字符流(FileWriter, FileReader ,BufferedWriter,BufferedReader)

    IO   Input  Output IO流用来处理设备之间的数据传输. java对数据的操作是通过流来实现的. 流按流向分:输入流,输出流     是相对内存而言的.把硬盘的数据读取到内存中就是输入 ...

  9. IO流--字符流与字节流--File类常用功能

    IO流的常用方法: 1: 文件的读取和写入图解: 2:字节流: 读写文件的方法: 一般效率读取: 读取文件:        FileInputStream(); 写数据:            Fil ...

  10. Java IO流-字符流

    2017-11-05 18:34:39 Java中的IO流按数据类型分类分为两种,一是字节流,二是字符流.字符流的出现是为了简化文本数据的读入和写出操作. 如果操作的文件是文本文件,那么使用字符流会大 ...

随机推荐

  1. 来自数组原型 Array.prototype 的遍历函数

    1. Array.prototype.forEach() forEach() 是一个专为遍历数组而生的方法,它没有返回值,也不会改变原数组,只是简单粗暴的将数组遍历一次  参数: callback() ...

  2. 隐马尔科夫模型(Hidden Markov Models) 系列之一

    转自:http://blog.csdn.net/eaglex/article/details/6376826 介绍(introduction) 通常我们总是对寻找某一段时间上的模式感兴趣,这些模式可能 ...

  3. android studio学习----The project encoding (windows-1252) does not match the encoding specified in the Gradle build files (UTF-8)

    Warning:The project encoding (windows-1252) does not match the encoding specified in the Gradle buil ...

  4. C# 连接数据操作的时候抛异常,连接超时

    先说说我的业务.我在发送优惠券的时候,同时给6千多个会员发送优惠券,执行了update 和insert语句,这写语句都是通过字符串拼接而来的.update和insert语句加起来一共是一万多条语句.在 ...

  5. Springboot入门及常用注解

    1.微服务:一个项目 可以由多个 小型服务构成(微服务)2.spring boot可以快速开发 微服务模块 a.简化j2ee开发 b.整个spring技术栈的整合(整合springmvc spring ...

  6. Java--8--新特性--串并行流与ForkJoin框架

    并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流.穿行流则相反,并行流的底层其实就是ForkJoin框架的一个实现. 那么先了解一下ForkJoin框架吧. Fork/Join ...

  7. 半小时上手laya

    laya的性能挺高,跟顶级的pixi.js差一些.比egret的性能强一些 laya的代码是偏功能性的, 观赏性,可读性比很差. 第一步,github上看了下,layaair二百星不到? 想不到堂堂的 ...

  8. hdu1677 贪心

    题意: 对于给出的n个俄罗斯套娃,要求将这n个套起来(满足w1 < w2 && h1 < h2才能套进去),最后输出最少剩下的套娃个数(尽可能去套起来) 题目分析: 朴素的 ...

  9. Kustomize安装配置入门文档

    一,简介 kustomize是sig-cli的一个子项目,它的设计目的是给kubernetes的用户提供一种可以重复使用同一套配置的声明式应用管理,从而在配置工作中用户只需要管理和维护kubernet ...

  10. 201871010133-赵永军《面向对象程序设计(java)》第二周学习总结

    201871010133-赵永军<面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...