IO流(字符流FileReader)

IO流(字符流FileWriter)

IO流(字符流的拷贝)

IO流(什么情况下使用字符流)

IO流(字符流是否可以拷贝非纯文本的文件)

IO流(自定义字符数组的拷贝)

IO流(带缓冲的字符流)

IO流(readLine()和newLine()方法)

IO流(将文本反转)

IO流(LineNumberReader)

IO流(装饰设计模式)

IO流(使用指定的码表读写字符)

IO流(转换流图解)

IO流(获取文本上字符出现的次数)

IO流(试用版软件)

File类(递归)

File类(练习)

IO流(总结)

 

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

FileReader fr = new FileReader("xxx.txt");

    int x = fr.read();

System.out.println(x);

    char c = (char)x;

System.out.println(c);

fr.close();

FileReader fr = new FileReader("xxx.txt");

    int c;

    while((c = fr.read()) != -1) {//通过项目默认的码表一次读取一个字符

System.out.print((char)c);

}

fr.close();

###21.02_IO流(字符流FileWriter)
 FileWriter类的write()方法可以自动把字符转为字节写出

FileWriter fw = new FileWriter("yyy.txt");

fw.write("大家好,基础班快接近尾声了,大家要努力,要坚持!!!");

fw.write(97);

fw.close();

###21.03_IO流(字符流的拷贝)
    FileReader fr = new FileReader("a.txt");
    FileWriter fw = new FileWriter("b.txt");
    
    int ch;
    while((ch = fr.read()) != -1) {
        fw.write(ch);
    }
    
    fr.close();
    fw.close();

FileReader fr = new FileReader("xxx.txt");

FileWriter fw = new FileWriter("zzz.txt");

    int c;

    while((c = fr.read()) != -1) {

fw.write(c);

}

fr.close();

fw.close();//Writer类中有一个2k的小缓冲区,如果不关流,就会将内容写到缓冲区里,关流会将缓冲区内容刷新,再关闭

###21.04_IO流(什么情况下使用字符流)
     字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.
     程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
     读取的时候是按照字符的大小读取的,不会出现半个中文
     写出的时候可以直接将字符串写出,不用转换为字节数组

###21.05_IO流(字符流是否可以拷贝非纯文本的文件)
 不可以拷贝非纯文本的文件
 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去
 如果是?,直接写出,这样写出之后的文件就乱了,看不了了

//字符流不能拷贝纯文本的文件

FileReader fr = new FileReader("双元.jpg");

FileWriter fw = new FileWriter("copy.jpg");

    int c;

    while((c = fr.read()) != -1) {

fw.write(c);

}

fr.close();

fw.close();

###21.06_IO流(自定义字符数组的拷贝)

FileReader fr = new FileReader("xxx.txt");

FileWriter fw = new FileWriter("yyy.txt");

    char[] arr = new char[1024];

    int len;

    while((len = fr.read(arr)) != -1) {//将文件上的数据读取到字符数组中

    fw.write(arr,0,len);//将字符数组中的数据写到文件上

  }

  fr.close();

  fw.close();

###21.07_IO流(带缓冲的字符流) 
 BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率
 BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率

  BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));

  BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));

  int c;

  while((c = br.read()) != -1) {//read一次,会先将缓冲区读满,从缓冲去中一个一个的返给临时变量c

    bw.write(c);//write一次,是将数据装到字符数组,装满后再一起写出去

  }

  br.close();

  bw.close();

###21.08_IO流(readLine()和newLine()方法)    
   BufferedReader的readLine()方法可以读取一行字符(不包含换行符号)
   BufferedWriter的newLine()可以输出一个跨平台的换行符号"\r\n"

  * newLine()与\r\n的区别

    newLine()是跨平台的方法

   \r\n只支持的是windows系统

  BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));

  String line;

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

    System.out.println(line);

  }

  br.close();

  BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));

  BufferedWriter bw = new BufferedWriter(new FileWriter("aaa.txt"));

  String line;

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

    bw.write(line);

    bw.newLine();//写出回车换行符

    //bw.write("\r\n");

  }

  br.close();

  bw.close();

###21.09_IO流(将文本反转)
   将一个文本文档上的文本反转,第一行和倒数第一行交换,第二行和倒数第二行交换

  //改写后是尽量晚开早关

  // 1,创建输入输出流对象

  BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));

  //2,创建集合对象

  ArrayList<String> list = new ArrayList<String>();

  //3,将读到的数据存储在集合中

  String line;

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

    list.add(line);

  }

  br.close();//关流

  //4,倒着遍历集合将数据写到文件上

  BufferedWriter bw = new BufferedWriter(new FileWriter("revzzz.txt"));

  for(int i = list.size() - 1; i >= 0; i--) {

    bw.write(list.get(i));

    bw.newLine();

  }

  //5,关流

  bw.close();

###21.10_IO流(LineNumberReader) 
 LineNumberReader是BufferedReader的子类, 具有相同的功能, 并且可以统计行号
     调用getLineNumber()方法可以获取当前行号
     调用setLineNumber()方法可以设置当前行号

  LineNumberReader lnr = new LineNumberReader(new FileReader("zzz.txt"));

  String line;

  lnr.setLineNumber(100);//设置行号,从101开始

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

    System.out.println(lnr.getLineNumber() + ":" + line);//获取行号

  }

  lnr.close();

###21.11_IO流(装饰设计模式)

public class Demo6_Wrap {

  /**

   * 装饰设计模式的好处是:

   * 耦合性不强,被装饰的类的变化与装饰类的变化无关

   */

  public static void main(String[] args) {

    HeiMaStudent hms = new HeiMaStudent(new Student());

    hms.code();

  }

}

interface Coder {

  public void code();

}

class Student implements Coder {

  @Override

  public void code() {

    System.out.println("javase");

    System.out.println("javaweb");

  }

}

class HeiMaStudent implements Coder {

  //1,获取被装饰类的引用

  private Student s;//获取学生引用

  //2,在构造方法中传入被装饰类的对象

  public HeiMaStudent(Student s) {

    this.s = s;

  }

  //3,对原有的功能进行升级

  @Override

  public void code() {

    s.code();

    System.out.println("ssh");

    System.out.println("数据库");

    System.out.println("大数据");

    System.out.println("...");

  }

}

javase

javaweb

ssh

数据库

大数据

...

###21.12_IO流(使用指定的码表读写字符) 
 FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)
 FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)

  //用默认编码表读写,出现乱码

  FileReader fr = new FileReader("utf-8.txt");

  FileWriter fw = new FileWriter("gbk.txt");

  int c;

  while((c = fr.read()) != -1) {

    fw.write(c);

  }

  fr.close();

fw.close();

InputStreamReader isr = new InputStreamReader(new FileInputStream("utf-8.txt"), "uTf-8");//指定码表读字符

  OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk");//指定码表写字符

  int c;

  while((c = isr.read()) != -1) {

    osw.write(c);

  }

  isr.close();

  osw.close();

升级后

BufferedReader br = //更高效的读

  new BufferedReader(new InputStreamReader(new FileInputStream("utf-8.txt"), "utf-8"));

  BufferedWriter bw = //更高效的写

  new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk"));

  int c;

  while((c = br.read()) != -1) {

    bw.write(c);

  }

  br.close();

  bw.close();

###21.13_IO流(转换流图解)
 画图分析转换流

###21.14_IO流(获取文本上字符出现的次数)
 获取一个文本上每个字符出现的次数,将结果写在times.txt上

* 分析:

1,创建带缓冲的输入流对象

2,创建双列集合对象TreeMap

3,将读到的字符存储在双列集合中,存储的时候要做判断,如果不包含这个键,就将键和1存储,如果包含这个键,就将该键和值加1存储

4,关闭输入流

5,创建输出流对象

6,遍历集合将集合中的内容写到times.txt中

7,关闭输出流

  //1,创建带缓冲的输入流对象

  BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));

  //2,创建双列集合对象TreeMap

  TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();

  //3,将读到的字符存储在双列集合中,存储的时候要做判断,如果不包含这个键,就将键和1存储,如果包含这个键,就将该键和值加1存储

  int ch;

  while((ch = br.read()) != -1) {

    char c = (char)ch;//强制类型转换

    /*if(!tm.containsKey(c)) {

      tm.put(c, 1);

    }else {

      tm.put(c, tm.get(c) + 1);

    }*/

    tm.put(c, !tm.containsKey(c) ? 1 : tm.get(c) + 1);

  }

  //4,关闭输入流

  br.close();

  //5,创建输出流对象

  BufferedWriter bw = new BufferedWriter(new FileWriter("times.txt"));

  //6,遍历集合将集合中的内容写到times.txt中

  for(Character key : tm.keySet()) {

    switch (key) {

      case '\t':

        bw.write("\\t" + "=" + tm.get(key));

        break;

      case '\n':

        bw.write("\\n" + "=" + tm.get(key));

        break;

      case '\r':

        bw.write("\\r" + "=" + tm.get(key));

        break;

      default:

        bw.write(key + "=" + tm.get(key)); //写出键和值

        break;

      }

      bw.newLine();

    }

    //7,关闭输出流

    bw.close();

###21.15_IO流(试用版软件)
  当我们下载一个试用版软件,没有购买正版的时候,每执行一次就会提醒我们还有多少次使用机会用学过的IO流知识,模拟试用版软件,试用10次机会,执行一次就提示一次您还有几次机会,如果次数到了提示请购买正版
* 分析:

1,创建带缓冲的输入流对象,因为要使用readLine方法,可以保证数据的原样性

2,将读到的字符串转换为int数

3,对int数进行判断,如果大于0,就将其--写回去,如果不大于0,就提示请购买正版

4,在if判断中要将--的结果打印,并将结果通过输出流写到文件上

  //1,创建带缓冲的输入流对象,因为要使用readLine方法,可以保证数据的原样性

  BufferedReader br = new BufferedReader(new FileReader("config.txt"));//定义次数

  //2,将读到的字符串转换为int数

  String line = br.readLine();

  int times = Integer.parseInt(line);//将数字字符串转换为数字

  //3,对int数进行判断,如果大于0,就将其--写回去,如果不大于0,就提示请购买正版

  if(times > 0) {

    //4,在if判断中要将--的结果打印,并将结果通过输出流写到文件上

    System.out.println("您还有" + times-- + "次机会");

    FileWriter fw = new FileWriter("config.txt");

    fw.write(times + "");

    fw.close();//如果没关流,内容在缓冲区里

  }else {

    System.out.println("您的试用次数已到,请购买正版");

  }

  //关闭流

  br.close();

###21.16_File类(递归)
 5的阶乘

* 递归:方法自己调用自己

5!

5 * 4 * 3 * 2 * 1

5 * fun(4)(代表4!)

4 * fun(3)(代表3!)

3 * fun(2)(代表2!)

2 * fun(1)(代表1!)

递归的弊端:不能调用次数过多,容易导致栈内存溢出

递归的好处:不用知道循环次数

构造方法是否可以递归调用?

class Person {

  public Person() {

    this();//无限调用自己

  }

}

构造方法不能使用递归调用

递归调用是否必须有返回值?

不一定(可以有,也可以没有)

  public static void main(String[] args) {

    /*int result = 1;

    for(int i = 1; i <= 5; i++) {

      result = result * i;

    }

    System.out.println(result);*/

    System.out.println(fun(6000));

  }

  public static int fun(int num) {

  if(num == 1) {

    return 1;

  }else {

    return num * fun(num - 1);

  }

}

###21.17_File类(练习)
 需求:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名
 * 分析:

从键盘接收一个文件夹路径

1,如果录入的是不存在,给与提示

2,如果录入的是文件路径,给与提示

3,如果是文件夹路径,直接返回

打印出该文件夹下所有的.java文件名

1,获取到该文件夹路径下的所有的文件和文件夹,存储在File数组中

2,遍历数组,对每一个文件或文件夹做判断

3,如果是文件,并且后缀是.java的,就打印

4,如果是文件夹,就递归调用

    public static void main(String[] args) {

    File dir = getDir();

    printJavaFile(dir);

  }

  /*

   * 获取键盘录入的文件夹路径

   * 1,返回值类型File

   * 2,不需要有参数

   */

  public static File getDir() {

    Scanner sc = new Scanner(System.in);//创建键盘录入对象

    System.out.println("请输入一个文件夹路径");

    while(true) {

      String line = sc.nextLine();//将键盘录入的文件夹路径存储

      File dir = new File(line);//封装成File对象

      if(!dir.exists()) {

        System.out.println("您录入的文件夹路径不存在,请重新录入");

      }else if(dir.isFile()) {

        System.out.println("您录入的是文件路径,请重新录入文件夹路径");

      }else {

        return dir;

      }

    }

  }

  /*

   * 获取文件夹路径下的所.java文件

   * 1,返回值类型 void

   * 2,参数列表File dir

   */

  public static void printJavaFile(File dir) {

    //1,获取到该文件夹路径下的所有的文件和文件夹,存储在File数组中

    File[] subFiles = dir.listFiles();

    //2,遍历数组,对每一个文件或文件夹做判断

    for (File subFile : subFiles) {

      //3,如果是文件,并且后缀是.java的,就打印

      if(subFile.isFile() /*&& subFile.getName().endsWith(".java")*/) {

        System.out.println(subFile);

        //4,如果是文件夹,就递归调用

      }else if (subFile.isDirectory()){

        printJavaFile(subFile);

      }

    }

  }

###21.18_IO流(总结)
 1.会用BufferedReader读取GBK码表和UTF-8码表的字符
 2.会用BufferedWriter写出字符到GBK码表和UTF-8码表的文件中
 3.会使用BufferedReader从键盘读取一行

###21.19_作业

1,从键盘接收一个文件夹路径,统计该文件夹大小

2,从键盘接收一个文件夹路径,删除该文件夹

3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

4,从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印, 例如:

aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹,eee中有fff.txt和ggg.txt,打印出层级来

aaa

  bbb.txt

  ccc.txt

  ddd.txt

  eee

    fff.txt

    ggg.txt

day21<IO流+&FIle递归>的更多相关文章

  1. IO流----File,递归,字节流,字符流

    要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘.光盘.U盘等)上. 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作. 当把持久设备上的数据读 ...

  2. java基础之IO流及递归理解

    一.IO流(简单理解是input/output流,数据流内存到磁盘或者从磁盘到内存等) 二.File类(就是操作文件和文件夹的) 1.FIleFile类构造方法 注意:通过构造方法创建的file对象是 ...

  3. 021.1 IO流——File类

    ########################################IO流:    IO:用于处理设备上的数据的技术.设备:内存,硬盘,光盘    流:系统资源,Windows系统本身就可 ...

  4. IO流——File类(文件流类)

    java语言的输入输出操作是借助于输入输出包java.io来实现的,按传输方向分为输入流与输出流,从外设传递到应用程序的流为输入流,将数据从应用程序输入到外设的流为输出流. File类的构造方法: 1 ...

  5. JAVA:IO流——File类

    1.掌握File 类的作用 2.可以使用File 类中的方法对文件进行操作 所有的 io 操作都保存在 java.io 包中. 构造方法:public File (String pathname) 直 ...

  6. IO流-File,字节流,缓冲流

    1.1 IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把 ...

  7. Java—IO流 File类的常用API

    File类 1.只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. package cn.test; import java.io.File; import java.io.IOE ...

  8. 09、IO流—File类与IO流

    目录 一.File类 基本认识 实用方法 获取功能 重命名功能(包含剪切) 判断功能 创建.删除文件 实际小案例 二.IO流 1.认识IO流 2.IO流基类介绍 字节流基类介绍 字符流基类介绍 三.节 ...

  9. [javaSE] IO流(递归查找指定文件)

    递归方法,实现查找目录中以.java为后缀的文件路径,并存入文本文件中 定义一个静态方法fileToLine(),传入参数:File对象目录,List集合对象(List<File> 这样做 ...

随机推荐

  1. qt离线下载

    http://www.qtcn.org/bbs/read-htm-tid-1075.html

  2. Maven项目下HttpServletRequest 或 HttpServletResponse需引用的依赖包

    转载: http://xyly624.blog.51cto.com/842520/865630/ Maven项目下HttpServletRequest 或 HttpServletResponse需引用 ...

  3. 【Unity笔记】UGUI的自动布局功能

    一些RectTransform的物体(UGUI元素)已经实现了ILayoutElement接口,如Image. 如果一个RectTransform的物体(UGUI元素)的其中一个组件实现了ILayou ...

  4. nfs简述

    参考:http://www.51lun-wen.cn/shenghuo/dianniaowangluo/diannaowangluo/czxt/Linux/200810/354248.html 1.什 ...

  5. find 命令一个命令多参数如何使用,????,perm

    [root@ob2 mytmp]# find -mtime -7 -type f \( -name "*.html" -o -name "*.tar.gz" \ ...

  6. GDI+(一):GDI+ 绘图基础

    一.GDI+绘图基础 编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数. ...

  7. 数据处理包plyr和dplyr包的整理

    以下内容主要参照 Introducing dplyr 和 dplyr 包自带的简介 (Introduction to dplyr), 复制了原文对应代码, 并夹杂了个人理解和观点 (多附于括号内). ...

  8. there are 0 datanode.....

    当时执行hive的导入数据load data  inpath "XXXX" into table.....的时候发现总是导不进去,最后试了下简单的从Linux 到 HDFS上传文件 ...

  9. VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。解决方案

    新买了个笔记本,在学习大数据的时候装上VMWare,运行虚拟机发现提示无法执行64位操作.本人系统是win7,64位系统. 之后就是一顿度娘,发现千篇一律都是检测CPU支不支持虚拟化,支持的话去BIO ...

  10. Mastering the game of Go with deep neural networks and tree search浅析

    Silver, David, et al. "Mastering the game of Go with deep neural networks and tree search." ...