zoukankan      html  css  js  c++  java
  • Java IO流:(五)节点流(文件流)之 FileReader

    一、FileReader 

      1、FileReader 类概述

        java.io.FileReader 类是读取字符文件的子类。构造时使用系统默认的字符编码和默认字符缓冲区。

        FileReader 是用来操作字符文件的输入流,可以从字符文件中进行读取。

        Tips

          ① 字符编码:字节与字符的对应规则,Windows 系统的中文编码默认是GBK编码表,或者为 UTF-8;

          ② 字符缓冲区:一个字节数组,用来临时存储字节数据;

      2、FileReader 类结构及方法

        

       3、构造方法

    FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
    FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。
    

      

        参数:读取文件的数据源。

          String fileName:文件的路径

          File file:文件对象

        构造方法的作用

          ① 创建一个 FileReader 对象

          ② 会把 FileReader 对象指向要读取的文件

        字符输入流的使用步骤

          ① 创建 FileReader 对象,构造方法中绑定要读取的数据源(选择IO流,创建IO对象)。

          ② 使用 FileReader 对象中的方法 read 读取文件(读/写操作)。

          ③ 释放资源(关闭IO流)。

    二、常用方法

        可以发现在 FileReader 中并为声明过多的方法,都是调用其父类中已经存在的方法。

    int read()
    

        读取单个字符。 作为整数读取的字符, 范围在 0 到 65535 之间 (0x00-0xffff)(2个字节的Unicode码) , 如果已到达流的末尾, 则返回 -1

    int read(char[] cbuf)
    

        将字符读入数组。 如果已到达流的末尾, 则返回 -1。 否则返回本次读取的字符数。

    int read(char[] cbuf,int off,int len)
    

        将字符读入数组的某一部分。 存到数组cbuf中, 从off处开始存储, 最多读len个字符。 如果已到达流的末尾, 则返回 -1。 否则返回本次读取的字符数。

    public void close() throws IOException
    

        关闭此输入流并释放与该流关联的所有系统资源。

    三、案例

      1、将工程下的hello.txt文件内容读入程序中,并输出到控制台

     1     @Test
     2     public void testFileReader() {
     3         FileReader fileReader = null;
     4         try {
     5             //1. 实例化File类的对象,指明要操作的文件
     6             File file = new File("hello.txt");
     7 
     8             //2.提供具体的流
     9             fileReader = new FileReader(file);
    10 
    11             //3.数据的读入
    12             //read():返回读入的一个字符。如果达到文件末尾,返回-1
    13             //方式一:
    14            /*
    15            int data = fileReader.read();
    16             while (data != -1) {
    17                 System.out.print((char)data);
    18                 data = fileReader.read();
    19             }
    20             */
    21             //方式二:语法上针对于方式一的修改
    22             int data;
    23             while ((data = fileReader.read()) != -1) {
    24                 System.out.print((char)data);
    25             }
    26 
    27         } catch (IOException e) {
    28             e.printStackTrace();
    29         } finally {
    30             //4.流的关闭操作
    31             //方式一:
    32             /*
    33             try {
    34                 if (fileReader != null) {
    35                     fileReader.close();
    36                 }
    37             } catch (IOException e) {
    38                 e.printStackTrace();
    39             }
    40             */
    41             if (fileReader != null) {
    42                 try {
    43                     fileReader.close();
    44                 } catch (IOException e) {
    45                     e.printStackTrace();
    46                 }
    47             }
    48         }
    49     }

         read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -,循环读取。

      2、使用read的重载方法

        代码实现:

     1     //对read()操作升级:使用read的重载方法
     2     @Test
     3     public void testFileReader1() {
     4         FileReader fileReader = null;
     5         try {
     6             //1. 实例化File类的对象,指明要操作的文件
     7             File file = new File("hello.txt");
     8 
     9             //2.FileReader流的实例化
    10             fileReader = new FileReader(file);
    11 
    12             //3.读入的操作
    13             //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
    14             char[] cbuf = new char[5];
    15             int len;  //记录的是每次读取的有效字符个数
    16             while((len = fileReader.read(cbuf)) != -1){
    17                 //方式一:
    18                 //错误的写法
    19                 /*
    20                 for(int i = 0;i < cbuf.length;i++){
    21                     System.out.print(cbuf[i]);
    22                 }
    23                 */
    24                 //正确的写法
    25                 /*
    26                 for (int i = 0; i < len; i++) {
    27                     System.out.print(cbuf[i]);
    28                 }
    29                 */
    30 
    31                 //方式二:
    32                 //错误的写法,对应着方式一的错误的写法
    33                 //String str = new String(cbuf);
    34                 //System.out.print(str);
    35 
    36                 //正确的写法
    37                 String str = new String(cbuf,0,len);
    38                 System.out.print(str);
    39             }
    40         } catch (IOException e) {
    41             e.printStackTrace();
    42         } finally {
    43             //4.资源的关闭
    44             try {
    45                 if (fileReader != null) {
    46                     fileReader.close();
    47                 }
    48             } catch (IOException e) {
    49                 e.printStackTrace();
    50             }
    51 
    52         }
    53     }

        read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回 -1。

      3、

    四、读取文件注意点

      1、异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理;

      2、读入的文件一定要存在,否则就会报FileNotFoundException;

      3、字符流操作字符,只能操作普通文本文件。 最常见的文本文件: .txt.java.c.cpp 等语言的源代码。尤其注意.doc,excel,ppt这些不是文本文件。

  • 相关阅读:
    相关术语随笔
    JDK简介和mac下安装和查看版本命令
    英语
    英语学习2
    英语学习-19.1
    为什么java是只有值传递而没有引用传递
    线程
    关于同步异步

    jdk动态代理实现原理总结
  • 原文地址:https://www.cnblogs.com/niujifei/p/14836722.html
Copyright © 2011-2022 走看看