当前位置: 首页 > news >正文

黑马程序员_IO流基本操作(Writer,Reader)

--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------


1.概述

硬盘之间的文件的传输,硬盘中文件的操作,他们之间的操作都是需要流进行操作的,对数据的操作是通过流进行操作的。

对流操作的类型进行分类:字节流和字符流

按流的流向分为:输入流和输出流

字符流是基本流,操作的二进制数据,可以对文本文件进行操作,要是操作图片,那么用字符流

他们的基类:

字节流类:InputStream 和OutputStream

字符流:Reader和Writer

2. FileWriter

此流是输入流,写入流,当文件中写入信息。

1.基本操作

 import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
 
public class WriterDemo {
    public static void main(String [] agrs) throws IOException{
    /*利用构造方法指定文件的地址 FileWriter(String fileName)
     * 1.当此时路径下已经存在此文件,那么就会覆盖此文件,
     *   如果不存在此文件,那么就会在当前路径下创建此文件
     * 2.如果你的路径写错了,就不当前硬盘下或者说电脑下,没有此应该或者是此目录,那么就是报异常
     *   例如:你电脑下不存在K盘,你写的路径是new FileWriter("K:\\demo.txt")那么就会报异常
     *       例如你电脑上存在F盘,但是不存在dd文件夹,你写new FileWriter("F:\\dd\\demo.txt")也会报异常*/
    Writerwriter=new FileWriter("F:\\demo.txt");
    /*当创建好文件后,想里面写数据,利用write()方法,有很多重载方法*/
    writer.write("hello");
    /*调用了方法write后,只是把数据写到了缓冲流中,必须使用flush()方法来刷新缓冲
     * 当你写完毕后,也可以调用close()方法,此方法会关闭流,在关闭之间就自动刷新了该缓冲,关闭后,就不能利用此流继续写了
     * 但是你使用flush()方法,还可以使用此流继续写,这也是close()和flush()的区别*/
    writer.flush();
    writer.close();
    }
}

结果:创建了指定的文件,也写入了写入的数据。

2.异常处理格式

 import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
 
public class WriterDemo {
  public static void main(String[] agrs) {
    /* 先声明流对象,实例的时候可能会报异常,那么就捕获 */
    FileWriter writer = null;
 
    try {
      writer = new FileWriter("F:\\demo.txt");
      writer.write("hello");
      writer.flush();
    } catch (Exception e) {
      System.out.println(e.toString());
    } finally {
      /*
       * 在finally中关闭流,这样不管前面是否出现异常,此流必须关闭,加入流创建了,那么就关闭,加入没有创建就不需要关闭,
       * 所以要先判断一下
       */
 
      try {
         if (writer != null)
           writer.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
    }
  }
}

3.对已存在的文件进行续写

 import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
 
public class WriterDemo {
  public static void main(String[] agrs) {
    /* 先声明流对象,实例的时候可能会报异常,那么就捕获 */
    FileWriter writer = null;
/*对已有文件进行续写,在构造方法中有个执行是否是续写的参数,
 * FileWriter(String fileName,boolean append)
 * append是true写到尾部,当为false,表示重新写入
 * 
 * 
 *  在这说明一下换行,window的记事本上\r\n表示换行,如果只写\n不换行
 *  由于软件不同,换行的标志也不一样,有的软件\n就表示换行
*/
    try {
      writer = new FileWriter("F:\\demo.txt",true);
      writer.write("\r\nworld");
      writer.flush();
    } catch (Exception e) {
      System.out.println(e.toString());
    } finally {
      try {
         if (writer != null)
           writer.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
    }
  }
}

结果:

在文件中续写了,并且换行了

3. FileReader

读取文件,当读取文件的时候,必须指定文件的路径,如果路径不正确,那么会报异常,有i自己默认额编码方式,和java的虚拟机默认的编码一样,一般是gbk。

1. 单个读取

  import java.io.FileReader;
import java.io.IOException;
 
public class ReaderDemo {
  public static void main(String[] agrs) {
    FileReader fr = null;
    try {
      fr = new FileReader("F:\\demo.txt");
      /*
       * 使用 read()单个读取文件,当读取当最后的时候返回-1,否则返回的是字符对应的ASCII码,我们要转换字符
       */
      int r = -1;
      while ((r = fr.read()) != -1) {
         System.out.print((char) r);
      }
    } catch (IOException e) {
      System.out.println(e.toString());
    } finally {
      try {
         if (fr != null)
           fr.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
    }
 
  }
}


2. 数组读取

public class ReaderDemo {
  public static void main(String[] agrs) {
    FileReader fr = null;
    try {
      fr = new FileReader("F:\\demo.txt");
      /*
       * 使用 read(char[] cbuf)读取的是到数组中,然后的是读取的到字符的个数,当去读到最后的返回的是-1
       */
      int len= -1;
      /*在定义数组长度的时候,一般是1024的倍数,在这个为了测试,写3*/
      char [] cs=new char[3];
      while ((len= fr.read(cs)) != -1) {
         /*在读取到字符数组的数组,转换为字符串,读取了多少字符,我们就转换多少,这个长度是不固定的
          * 如果固定的话,那么读取出来的会多的,例如:
          * 文件中的字符是abcdefg
          * 第一次读取:abc   数组中的信息是: a b c
          * 第二次读取:def   数组中的信息是: d e f
          * 第三次读取:g     数组中的信息是: g e f
          * 但是第三次返回的长度是1.所以我们值把g转换为字符串即可
          * */
         System.out.print(new String(cs,0,len));
      }
    } catch (IOException e) {
      System.out.println(e.toString());
    } finally {
      try {
         if (fr != null)
           fr.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
    }
 
  }
}


4. 文件复制

思路:

定义两个流:读和写,分别指向文件要读取的文件和复制到的文件地址,可以边读取变写入到另一个文件中,也可以都读取出来,然后一起写入到另一个文件。

1.单个复制

 import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class ReaderDemo {
  public static void main(String[] agrs) {
    FileWriter fw = null;
    FileReader fr = null;
    try {
      fr = new FileReader("F:\\A\\demo.txt");//定义读取对象,读取要复制的文件
      fw = new FileWriter("F:\\B\\demo.txt");//定义写入对象,写到目的文件
      int r = -1;
      while ((r = fr.read()) != -1) {//读取
         fw.write(r);//写入
                fw.flush();//刷新
      }
    } catch (IOException e) {
      System.out.println(e.toString());
    } finally {
      try {
         if (fr != null)
           fr.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
      try {
         if (fw != null)
           fr.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
    }
 
  }
}

2. 数组复制

 import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class ReaderDemo {
  public static void main(String[] agrs) {
    FileWriter fw = null;
    FileReader fr = null;
    try {
      fr = new FileReader("F:\\A\\demo.txt");// 定义读取对象,读取要复制的文件
      fw = new FileWriter("F:\\B\\demo.txt");// 定义写入对象,写到目的文件
      int len = -1;
      char[] cs = new char[1024];//字符数组
      while ((len = fr.read(cs)) != -1) {// 读取
         fw.write(cs,0, len);// 写入
         fw.flush();// 刷新
      }
    } catch (IOExceptione) {
      System.out.println(e.toString());
    } finally {
      try {
         if (fr != null)
           fr.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
      try {
         if (fw != null)
           fr.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
    }
 
  }
}

--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------


相关文章:

  • aptana 插件离线下载方式
  • Eclipse安装aptana 插件的方法
  • VC写的双人版俄罗斯方块
  • 2014百度校招笔试题之动态链接库静态链接库详解
  • centos 安装与操作
  • win7 防火墙开启ping
  • 人人网2014笔试算法题汇总
  • 暴风影音2014笔试算法题汇总
  • 华为2014笔试算法题汇总
  • 百度2014笔试算法题汇总
  • 美团网2014笔试算法题汇总
  • 2014百度校招笔试题
  • 从程序员到项目经理:认识项目经理
  • Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)...
  • 每天一道算法_2_求高精度幂
  • HTTP中的ETag在移动客户端的应用
  • Javascript设计模式学习之Observer(观察者)模式
  • JS基础之数据类型、对象、原型、原型链、继承
  • MySQL-事务管理(基础)
  • Xmanager 远程桌面 CentOS 7
  • 测试如何在敏捷团队中工作?
  • 模型微调
  • 你真的知道 == 和 equals 的区别吗?
  • 前端技术周刊 2019-02-11 Serverless
  • 前端面试之闭包
  • 数组的操作
  • 微信小程序:实现悬浮返回和分享按钮
  • 微信小程序填坑清单
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 国内开源镜像站点
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #162 (Div. 2)
  • (2.2w字)前端单元测试之Jest详解篇
  • (超详细)语音信号处理之特征提取
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (论文阅读11/100)Fast R-CNN
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转载)从 Java 代码到 Java 堆
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET 事件模型教程(二)
  • .NET 中的轻量级线程安全
  • @Autowired 与@Resource的区别
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @font-face 用字体画图标
  • @KafkaListener注解详解(一)| 常用参数详解
  • @RequestMapping 的作用是什么?
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [1] 平面(Plane)图形的生成算法
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [APIO2015]巴厘岛的雕塑
  • [c++] 自写 MyString 类
  • [C语言]编译和链接