/*
* **一.流的分类:
* 1.按照操作数据分:字节流byte,字符流char
* 2.按照数据流向: 输入流inputStream,输出流outputStream
* 3.流的角色: 节点流,和处理流:
*
* 二.流的体系结构
* 抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
* InputStream FileInputStream (io字节) BufferedInputStream
* OutputStream FileOutPutStream (io字节) BufferedOutputStream
* Reader FileReader (字符) BufferedReader
* Writer FileWriter (字符) BufferedWriter
***
*
* */
将文件内容读入到程序中,并且打印输出到控制台
步骤
1.实例化File对象,指明要操作的文件
2.提供具体的流
3.数据的读取
4.关闭流
1.方法一
//为了保证流资源一定会关闭,所以要是用try-cath-finally
FileReader fileReader = null;
try {
//1.实例化File对象,指明要操作的文件
//(此处用的是绝对路径,我们也可以采用相对路径,是相对于该项目的,例如: File file = new File("file.txt");)
File file = new File("D:\\IDEA_Project\\CodeGenerator\\src\\main\\resources\\file\\file.txt");
//实例化完file对象之后,千万别忘记创建file真是的文件,这样file才真是存在!
//如果没有创建则会报错:
//Exception in thread "main" java.io.FileNotFoundException: hello.txt (系统找不到指定的文件。)
file.createNewFile();
System.out.println(file.getAbsolutePath());//绝对路径
//2.提供具体的流,把指定的文件处理成节点流的形式在读入到项目中
fileReader = new FileReader(file);
//执行到这里,我们就可以看到项目中创建的新文件了,我们下面对数据进行读取
//因为我们是刚刚创建的文件,没有内容,所以请手动添加信息,方便下面测试
//3.数据的读取
//read()返回读入的字符,如果达到文件尾部,返回-1
//我们读取的字符是char类型,例如:在内存中a代表97
int read = fileReader.read();
while (read != -1) {
System.out.print((char) read);//强转成字符(char类型)
read = fileReader.read();//继续读取下一个字符
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileReader!=null) {
try {
fileReader.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.方式二.改造加强方法一
主要修改是步骤三(改造原因:方法一的缺点,每次读取一个字符,输出一个字符,需要进行多次的交互,效率太低,方法二采用一次多读取几个字符,放在数组中再输出,输出完之后再去进行交互,这样减少了交互的次数,效率会有提升)
//3.数据的读取
char[] charBuffers = new char[5];//每次会读取5个(可以自定义读取的个数,本例已5为例)
//read(charBuffers)返回每次读入charBuffers数组中字符的个数,如果达到文件尾部,返回-1
int len;//记录每次读取新元素的个数
while ((len=fileReader.read(charBuffers)) != -1) {//循环完之后再继续读取字节流中的字符,知道全部读取完,循环停止
for (int i = 0; i < len; i++) {
//***为什么要i<len而不是i<charBuffers.length?
//因为:数组每次往里面添加数据,是对数组之前里的元素进行覆盖
//假设最后一次,我们读取了三个字符,而我们的数组里还存在上一次读取的五个字符
//我们开始往数组里添加这次的新数据,前三个覆盖完毕,后面两个还是原本的数组,没有字符覆盖
//这样我们的输出就会产生对于的错误数据!
System.out.print(charBuffers[i]);
}
}
@Test
void contextLoads() throws IOException {
FileReader fileReader = null;
try {
//1.实例化File对象,指明要操作的文件
File file = new File("D:\\IDEA_Project\\CodeGenerator\\src\\main\\resources\\file\\file.txt");
file.createNewFile();
System.out.println(file.getAbsolutePath());//绝对路径
//2.提供具体的节点流
fileReader = new FileReader(file);
//3.数据的读取
//read(charBuffers)返回每次读入charBuffers数组中字符的个数,如果达到文件尾部,返回-1
char[] charBuffers = new char[5];//每次会读取5个
int len;
while ((len=fileReader.read(charBuffers)) != -1) {
for (int i = 0; i < len; i++) {
System.out.println(charBuffers[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileReader!=null) {
try {
fileReader.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}