java IO流之FileReader 字符流读入 实例
FileReader
用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
FileReader
用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream
。
构造方法摘要
- FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。
- FileReader(FileDescriptor fd) 在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
- FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
方法摘要
- 从类 java.io.InputStreamReader 继承的方法
close, getEncoding, read, read, ready
- 从类 java.io.Reader 继承的方法
mark, markSupported, read, read, reset, skip
- 从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
read()
读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。 其返回值作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
实例化
-
创建一个File类的对象
File f = new File("IOStream/src/testfile/test.txt");
-
创建一个FileReader的流的对象
FileReader fr = new FileReader(f);
-
读取内容
-
fr.read():如果到了文件的结尾处,那么读取的内容为-1
-
方式1
int n = fr.read(); while(n!=-1){ System.out.print((char)n); n = fr.read(); }
-
方式2
int n; while((n = fr.read())!=-1){ System.out.print((char)n); }
-
方式3缓冲数组
char[] ch = new char[5];//缓冲数组 int len = fr.read(ch);//一次读取五个:返回值是这个数组中的有效长度
关于有效长度,由于使用缓冲数组时并不会在每次使用前都清空,最后一次中未更新使用索引访问时也会返回,但有效长度依然返回最后一次真正读取的个数,例如文件内容为
abcdef
。索引 0 1 2 3 4 第一次内容 a b c d e 第二次内容 f b c d e 此为错误方式
//错误方式:ch.length并非有效长度 while(len!=-1) { for (int i = 0 ;i < ch.length;i++){ System.out.println(ch[i]); } len = fr.read(ch); }
此为正确的方式,len为数组有效长度
//正确方式: while(len!=-1) { for (int i = 0 ;i < len;i++){ System.out.print(ch[i]); } len = fr.read(ch); }
也可以使用将数组转为String的方式
//正确方式2:将数组转为String: while(len!=-1) { String str = new String(ch,0,len); System.out.print(str); len = fr.read(ch); }
-
关闭流。流,数据库,网络资源,靠jvm本身没有办法帮我们关闭,必须手动关闭
fr.close();
综合程序
此处的异常处理选择抛出,扔给JVM
public class FileRead {
public static void main(String[] args) throws IOException {
//文件-->程序:
//1.创建一个File类的对象
File f = new File("IOStream/src/testfile/test.txt");
//2.利用FileReader这个流,这个“管”怼到源文件上去-->创建一个FileReader的流的对象
FileReader fr = new FileReader(f);
//3进行操作“吸”的动作
//将数组转为String:
while(len!=-1) {
String str = new String(ch,0,len);
System.out.print(str);
len = fr.read(ch);
}
//4.“管”不用了,就要关闭 -->关闭流
//流,数据库,网络资源,靠jvm本身没有办法帮我们关闭,此时必须程序员手动关闭:
fr.close();
}
}
异常处理
try-catch-finally
关闭资源放入finally中
public class FileReadTC {
public static void main(String[] args){
//1.创建一个File类的对象
File f = new File("IOStream/src/testfile/test.txt");
//2.建一个FileReader的流的对象
FileReader fr = null;
try {
fr = new FileReader(f);
//3进行操作“吸”的动作-->缓冲数组
char[] ch = new char[5];//缓冲数组
int len = fr.read(ch);//一次读取五个:返回值是这个数组中的有效长度
//将数组转为String:
while (len != -1) {
String str = new String(ch, 0, len);
System.out.print(str);
len = fr.read(ch);
}
} catch (IOException e) {
e.printStackTrace();
} finally{
//4.关闭流
try {
assert fr != null;
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
try-with-resource
能自动关闭资源
public class FileReadTC {
public static void main(String[] args){
//1.创建一个File类的对象
File f = new File("IOStream/src/testfile/test.txt");
//2.建一个FileReader的流的对象
try (FileReader fr = new FileReader(f)){
//3进行操作“吸”的动作-->缓冲数组
char[] ch = new char[5];//缓冲数组
int len = fr.read(ch);//一次读取五个:返回值是这个数组中的有效长度
//将数组转为String:
while (len != -1) {
String str = new String(ch, 0, len);
System.out.print(str);
len = fr.read(ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}