FileReader读取方式

  • Post author:
  • Post category:其他



1.    读取方式一

Reader中读取的方法有读取单个字符的方法(read() ),有读取字符数组的方法(read(char[] cbuf) ),还有读取部分数组的方法(read(char[] cbuf, int off, int len) )。

1.要读取文件,需要创建读取对象。FileReader是用来读取字符文件的便捷类。那么,我们可以用它来创建读取字符数据的流对象。在创建读取流对象时,必须要明确被读取的文件。所以一定要确定该文件是存在的。用一个读取流关联一个文件,可能会抛出异常FileNotFoundException,处理一下。

2.使用流读取文件,最后一定要关闭文件,使用在finally中关闭文件。

3.使用read()方法读取字符,该方法可能会抛出异常IOException,捕获一下。返回的的是读取到的字符对应的整数。当读到流的末尾,则返回 -1。read()方法每次读取一个字符,就要通过循环,使用readd()方法读取文件内容,当read()方法的返回值时-1的时候,读取停止,即循环停止。

完整代码:

package com.java.base;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo {
	public static void main(String[] args){
		FileReader fr = null;
		try{
			fr = new FileReader("demo.txt");
			int ch = 0;
			while((ch = fr.read()) != -1){
				System.out.println((char)ch);
			}
		}catch(FileNotFoundException e1){
			e1.printStackTrace();
		}catch(IOException e2){
			e2.printStackTrace();
		}finally{
			if(fr != null){
				try{
					fr.close();
				}catch(IOException e3){
					e3.printStackTrace();
				}
			}
		}
	}
}

这就是一次读一个字符的方法。


2.    读取方式二

一次读一个字符和一次读一个数组,它们的返回值都是int,但是一次读一个字符返回的是作为整数读取的字符,而一次读一个数组的方法返回的是读取到的字符数。

使用read(char[])读取文本文件数据。使用这个方法,会将字符读入数组,所以,要先创建字符数组。数组的长度可以随便写。为了方便观察,把demo.txt文件中的内容改成a

bcd


,读取到的数组的长度设置为


3


,写代码读取文件,观察一下运行的结果。

package com.java.base;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo2 {
	public static void main(String[] args){
		FileReader fr = null;
		try{
			fr = new FileReader("demo.txt");
			char[] chs = new char[3];
			int num = fr.read(chs);
			System.out.println("num="+num+":"+new String(chs));
			num = fr.read(chs);
			System.out.println("num="+num+":"+new String(chs));
			num = fr.read(chs);
			System.out.println("num="+num+":"+new String(chs));
		}catch(FileNotFoundException e1){
			e1.printStackTrace();
		}catch(IOException e2){
			e2.printStackTrace();
		}finally{
			if(fr != null){
				try{
					fr.close();
				}catch(IOException e3){
					e3.printStackTrace();
				}
			}
		}
	}
}


这时候,运行的结果是:


num=3:abc


num=1:dbc


num=-1:dbc




第一次读取的时候,依次读取到三个字符,


abc


,分别把


abc


存入到数组中,这时候返回的结果是


3


;第二次读取的时候,读到


d


的时候,把


d


放入数组中,这时候数组中存着的是上次读取到的数据,所以,这时候,


b





a


覆盖掉,往后没有读取到数据,所以数组中存的是


bcd


,返回值是


1


,的三次,没有读取到数据,所以返回


-1


,因为没有读取到任何数据,所以数组中的内容不变,也是


bcd




这时候,可以修改代码,读到几个字符,就把几个字符变成字符串,把能读取到数据的数组变成字符串的代码改成,


new String(chs,0,num)


,第二次读取到的数组变成字符串就是


d


,没有多余的字符了。


在实际读取的时候,是不会这么写代码去读取文件的,修改一下,把它变成循环操作。

package com.java.base;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo2 {
	public static void main(String[] args){
		FileReader fr = null;
		try{
			fr = new FileReader("demo.txt");
			char[] chs = new char[3];
			int len = 0;
			while((len = fr.read(chs)) != -1){
				System.out.println(new String(chs, 0, len));
			}
		}catch(FileNotFoundException e1){
			e1.printStackTrace();
		}catch(IOException e2){
			e2.printStackTrace();
		}finally{
			if(fr != null){
				try{
					fr.close();
				}catch(IOException e3){
					e3.printStackTrace();
				}
			}
		}
	}
}



那么,每次读取一个字符和读取一个字符数组,那种方式比较好?使用第一种方法,每次读取一个字符,需要循环


5


次,使用第二种方法,可以通过修改存入数组的长度改变循环次数,数组长度为


3


的时候,循环两次,长度为


10


的时候,只需要循环依次,所以使用第二种方式,效率高。


这个字符数组的长度组好是


1024


的整数倍,因为


1


个千字节等于


1024


字节(


1kb=1024byte=1024*8bi


)。



版权声明:本文为pigziprogrammer原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。