FileReader读取方式

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文件中的内容改成abcd,读取到的数组的长度设置为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放入数组中,这时候数组中存着的是上次读取到的数据,所以,这时候,ba覆盖掉,往后没有读取到数据,所以数组中存的是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)。

 

 

猜你喜欢

转载自blog.csdn.net/pigziprogrammer/article/details/95185918