本帖最后由 阿里云 于 2017-12-8 14:30 编辑
基础班- 主要内容
- day01:java环境,常量变量,数据类型
- day02:Eclipse的概述和安装,运算符,Scanner键盘录入对象
- day03:流程控制语句,循环语句
- day04:Random随机数对象,数组
- day05:方法
- day06:断点调试
- day07:面对对象思想,定义类
- day08:查询API文档,字符串类,StringBuilder类
- day09:快速生成类,集合类,集合版学生管理系统
- day10:IO流,FileReader,FileWriter,BufferedReader,BufferedWriter
- day11:IO版学生管理系统
- 笔记帖子网址
day09day10- IO流(In/Out stream)
- 用来处理设备之间的数据传输,可以把数据存储到文件,也可以从文件中读取
- 实现功能:文件复制,上传文件和下载文件
- 分类:
- 按传输方向分:相对于Java程序
- 输出流(FileWriter):写数据
- 输入流(FileReader):读数据
- 按操作数据的方式分
- 常见应用
- 文件复制U盘拷贝内容
- 上传文件(微信图片、QQ空间图片)
- 下载文件(迅雷)
- 输出流写数据
- 步骤
- 创建输出流对象
- FileWrite fw=new FileWriter("d:\a.txt");//创建输出流对象。导包;【显示错误之后(或者ctrl+1),选择"Add throws declaration"增加抛出异常】;本条语句做了以下事情:
- 调用系统资源创建了一个文件,【如果有重名的文件,那么覆盖重名文件!但是不能创建文件夹!】
- 创建输出流对象
- 把输出流对象指向文件
- 调用写数据方法(写数据和刷新)
- fw.write("IO流你好");//数据写到缓存区,没有写到文件
- fw.flush();//刷新,这时数据写入了文件;【如果下个语句是close、写入比较少,则此句可以省略,让close实现刷新;如果下个语句是write,则此句不能省略】
- ...
- 释放资源【创建流对象时就把关流语句写出来,千万别忘了把close()忘了!】
- fw.close();//关流,【先检测是否刷新,如果没有的话就会刷新;然后通知系统释放和文件相关的资源;这样其他程序就可以对文件进行删除、编辑等操作了;流释放之后,创建的流对象不能再使用了】
- 路径
- 相对路径:与项目的根目录相对,例如:没有写盘符使用相对路径,例如:"a.txt"。根目录指的是项目名称文件夹下,例如:"src\com\itheima\Test01.java"。
- 绝对路径:以盘符开始的路径,例如:"d:\a.txt",【注意:写两个\是因为\为转义符,两个代表一个】
- 写数据的5种方法
- void write(String str);//写一个字符串数据
- void write(String str,int index,int len);//写一个字符串的一部分数据
- void write(int ch);//写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值.'a'或97
- void write(char[] chs);//写一个字符组数据
- void write(char[] chs,int index,int len);//写一个字符组的一部分数据,【参数为开始索引和长度!】
- 测试时刷新(项目右键=>Refresh或者F5)项目后,在文件中查看(有时不用手动刷新),显示新文件需要手动刷新。
- 写数据常见问题
- \n可以换行,但是window记事本等识别的是\r\n(windows:\r\n; linux:\n; mac:\r),window换行是两个字符\r\n
- 如何追加写入?在创建对象时:FileWrite fw=new FileWriter("d:\a.txt",true);//【true追加,false不追加!!!!!!!!!】
- 输入流读数据
- 步骤
- 创建输入流对象
- FileReader fw=new FileReader("d:\a.txt");//读取的文件必须存在,否则报错;读取的文件后缀可以是.java等
- 调用读数据方法
int ch;
String str="";//文件内容
while((ch=fr.read())!=-1){ str += (char)ch;//System.out.print((char)ch)可以输出,注意输出不要有“ln”换行}//【fr.read()表示一次读取一个字符,返回字符int数据...当读取不到数据时返回-1】 - 释放资源
- 复制文件
- 数据源文件=>读数据=>写数据=>目的地文件
- 步骤
- 创建输入流和输出流对象
FileReader fr = new FileReader("a.txt");
FileWrite fw = new FileWriter("b.txt"); - 读写数据
int ch;//注意这里是int类型
while((ch = fr.read())!= -1){fw.write(ch);} - 释放所有资源
fw.close();
fr.close();
- 第二种读取文件方法:一次读一个字符数组数据,相对于之前方法效率更高
...//创建对象
char[] chs = new char[1024];//这里可以是1024的整数倍;
int len;
while((len=fr.read(chs))!=-1){System.out.print(new String(chs,0,len));}
...//释放资源 - 第二种复制文件方法:一次读写一个字符数组数据,相对于之前方法效率更高
...//创建对象
char[] chs= new char[1024];
int len;
while((len = fr.read())!= -1){ fw.write(chs,0,len);}
...//释放所有资源 - 缓冲流:相对于上面的基本流更高效,所以一般我们使用缓冲流!【重点,以后读取和写入文件选择此方法!】
- BufferedWriter:高效写入
- 创建输出流缓冲对象
- BufferedWriter bw =new BufferedWriter(new FileWriter("bw.txt"));//【构造参数为Writer对象!】
- 调用写入数据方法 => 【缓冲流与基本流对象用法相同】
- 释放资源 =>【缓冲流与基本流对象用法相同】
- BufferedReader:高效读取
- 创建输入流缓冲对象
- BufferedReader br =new BufferedReader(new FileReader("br.txt"));//【构造参数为Reader对象!】
- 调用读取数据方法 => 【缓冲流与基本流对象用法相同】
- 释放资源 =>【缓冲流与基本流对象用法相同】
- 缓冲流的特殊功能【必须熟练掌握】
- BufferedWriter:写入换行符
- void newLine():写一个换行符,这个换行符由系统决定,实现跨平台
- bw.write("\r\n"); => bw.newLine();//以后添加换行符用此语句代替
- BufferedReader:读取文件
- String readLine():一次读取一行数据,但是不读取换行符
- 输出一个文件所有数据的标准代码
- String line;
while((line=br.readLine())!=null){System.out.println(line);}
- 利用缓冲流特殊功能复制文本文件【重点,以后复制文件选择此方法!】
- //创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java"));
//创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
//一次读写一个字符数组
char[] chs = new char[1024];
int len;
while((len=br.read(chs))!=-1) {bw.write(chs,0,len);}
//释放资源
bw.close();
br.close();
把集合中的数据写入到文本文件
//创建集合对象
ArrayList array = new ArrayList();
//往集合中添加字符串元素
array.add("hello");
array.add("world");
array.add("java"); //创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("array.txt"));
//遍历集合,得到每一个字符串元素,然后把该字符串元素作为数据写到文本文件
for(int x=0; x<array.size(); x++) { String s = array.get(x);bw.write(s);bw.newLine();bw.flush();//这里增加了刷新}
//释放资源
bw.close();
把文本文件中的数据读取到集合
//创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("array.txt"));
//创建集合对象
ArrayList array = new ArrayList();
//读取数据,每次读取一行数据,把该行数据作为一个元素存储到集合中
String line;
while((line=br.readLine())!=null) { array.add(line);}
//释放资源
br.close(); //遍历集合
for(int x=0; x<array.size(); x++) { String s = array.get(x);System.out.println(s);}
- 下面是正确的语句,如果文件名相同,创建对象能写在一块,但是记得FileWriter后面的true,【如果没有true,就会出现问题,文件被清空!】 BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java")); BufferedWriter bw = new BufferedWriter(new FileWriter("FileWriterDemo.java",true));
- 使用【项目名称右键--new--file】新建一个文件等操作。
day11在原有的学生管理系统中加入两个方法,实现从文件中读取和写入学生信息,代码如下: //从文件中读数据到集合
public static void readData(String fileName,ArrayList array) throws IOException {
//创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader(fileName)); String line;
while((line=br.readLine())!=null) { String[] datas = line.split(","); Student s = new Student(); s.setId(datas[0]); s.setName(datas[1]); s.setAge(datas[2]); s.setAddress(datas[3]); array.add(s); } br.close();
} //把集合中的数据写入文件
public static void writeData(String fileName,ArrayList array) throws IOException {
//创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName)); for(int x=0; x<array.size(); x++) { Student s = array.get(x); StringBuilder sb = new StringBuilder(); sb.append(s.getId()).append(",").append(s.getName()).append(",").append(s.getAge()).append(",").append(s.getAddress()); bw.write(sb.toString()); bw.newLine(); bw.flush(); } bw.close();
}
- 去掉main方法中创建的集合,然后创建一个字符串保存文件路径
- 修改增、删、改、查方法
- 1 方法的参数修改为文件路径
- 2 方法中创建新集合,读取文件到新集合
- 3 修改之后把集合信息写回到文件中
- 修正main方法中调用方法的参数
|
|