Java文件读操作(两种read方法)

来源:互联网 发布:淘宝香港地址怎么填写 编辑:程序博客网 时间:2024/06/06 17:08

将文件中的数据读入程序,是将程序外部的数据传入程序中,应该使用输入流——InputStream或Reader。而由于读取的是特定的数据源——文件,则可以使用输入对应的子类FileInputStream或FileReader实现。
在实际书写代码时,需要首先熟悉读取文件在程序中实现的过程。在Java语言的IO编程中,读取文件是分两个步骤:

1、将文件中的数据转换为流(由系统完成,只需要创建对应的流对象即可);
2、读取流内部的数据(第二个步骤使用输入流对象中的read方法即可实现);

使用输入流进行编程时,代码一般分为3个部分:

1、创建流对象,
2、读取流对象内部的数据,
3、关闭流对象。

下面以读取文件的代码示例:

 import java.io.*;/** * 使用FileInputStream读取文件 */public class ReadFile1 {         public static void main(String[] args) {                   //声明流对象                   FileInputStream fis = null;                                    try{                            //创建流对象                            fis = new FileInputStream("e:\\a.txt");                            //读取数据,并将读取到的数据存储到数组中                            byte[] data = new byte[1024];                             //当前下标                                   int i = 0;                             //读取流中的第一个字节数据,一次读一个字节                            int n = fis.read();                            //依次读取后续的数据                            //未到达流的末尾                                   while(n != -1){                           //将有效数据存储到数组中,将已经读取到的数据n强制转换为byte,即取n中的有效数据——最后一个字节                                     data[i] = (byte)n;                                     //下标增加                                     i++;                                     //读取下一个字节的数据                                      n = fis.read();                            }                            //解析数据                            String s = new String(data,0,i);                            //输出字符串                            System.out.println(s);                   }catch(Exception e){                            e.printStackTrace();                   }finally{                            try{                                     //关闭流,释放资源                                     fis.close();                            }catch(Exception e){}                   }         }}

在该示例代码中,首先创建一个FileInputStream类型的对象fis:

  fis = new FileInputStream("e:\\a.txt");

这样建立了一个连接到数据源e:\a.txt的流,并将该数据源中的数据转换为流对象fis,以后程序读取数据源中的数据,只需要从流对象fis中读取即可。
读取流fis中的数据,需要使用read方法,该方法是从InputStream类中继承过来的方法,该方法的作用是每次读取流中的一个字节,如果需要读取流中的所有数据,需要使用循环读取,当到达流的末尾时,read方法的返回值是

int n = fis.read();

将读取的值赋值给int值n,如果流fis为空,则n的值是-1,否则n中的最后一个字节包含的时流fis中的第一个字节,该字节被读取以后,将被从流fis中删除。环读取流中的其它数据,如果读取到的数据不是-1,则将已经读取到的数据n强制转换为byte,即取n中的有效数据——最后一个字节,并存储到数组data中,然后调用流对象fis中的read方法继续读取流中的下一个字节的数据。一直这样循环下去,直到读取到的数据是-1,也就是读取到流的末尾则循环结束。
这里的数组长度是1024,所以要求流中的数据长度不能超过1024,所以该示例代码在这里具有一定的局限性。如果流的数据个数比较多,则可以将1024扩大到合适的个数即可。


上面详细介绍了读取文件的过程,其实在实际读取流数据时,还可以使用其它的read方法,下面的示例代码是使用另外一个read方法实现读取的代码

import java.io.FileInputStream;/** * 使用FileInputStream读取文件 */public class ReadFile2 {         public static void main(String[] args) {                   //声明流对象                   FileInputStream fis = null;                                    try{                            //创建流对象                            fis = new FileInputStream("e:\\a.txt");                            //读取数据,并将读取到的数据存储到数组中                            byte[] data = new byte[1024]; //数据存储的数组                            int i = fis.read(data);//对比上面代码中的 int n = fis.read();读取第一个字节的数据返回到n中                            //解析数据                            String s = new String(data,0,i);                            //输出字符串                            System.out.println(s);                   }catch(Exception e){                            e.printStackTrace();                   }finally{                            try{                                     //关闭流,释放资源                                     fis.close();                            }catch(Exception e){}                   }         }}

该示例代码中,只使用一行代码:

int i = fis.read(data);

就实现了将流对象fis中的数据读取到字节数组data中。该行代码的作用是将fis流中的数据读取出来,并依次存储到数组data中,返回值为实际读取的有效数据的个数。
使用该中方式在进行读取时,可以简化读取的代码。


拓展:
读取文本文件时:使用Reader类的子类FileReader进行实现,在编写代码时,只需要将上面示例代码中的byte数组替换成char数组即可。

读取二进制文件或自定义格式的文件时:使用FileInputStream进行读取,方便对于读取到的数据进行解析和操作。

原创粉丝点击