一、FileWriter和FileReader
1、FileWriter写数据路径问题及关闭和刷新方法的区别
相对路径:相对当前项目而言的,在项目的根目录下(a.txt)
绝对路径:以盘符开始的路径(d:\a.txt)
这是相对路径(a.txt)的文件位置,在workspace工作环境下。
2、关闭和刷新方法的区别
flush():刷新缓冲区。流对象还可以继续使用。
close():先刷新缓冲区,然后通知系统释放资源。流对象不可以再被继续使用了。
例如:
fw.write("hello");
fw.flush();
fw.write("world");
fw.flush();
fw,close();
//这是可以的
fw.write("hello");
fw.flush();
fw.close();
fw.write("world");
//这是错误的
3、FileWriter写数据的五种方法:
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):写一个字符数组的一部分数据
FileWriter常见问题:
1、如何实现数据的换行:\n可以实现换行,但是windows系统自带的记事本打开并没有换行,这是为什么呢?因为windows识别的换行不是\n,而是\r\n.
windows:\r\n
linux:\n
mac:\r
2、如何实现数据的追加写入呢?
FileWriter(String fileName,boolean append)
4、FileReader读数据
构造方法:
FileReader(String fileName):传递文件名称
成员方法:
int read():一次读取一个字符,注意:因为返回值类型是int类型,所以结果是字符的编码,如果想要控制台出现字符需进行强制类型转换,代码在下面。
文件b.txt中数据为abcde。
循环语句实现全部输出:
输出是System.out.print不要加ln进行换行,因为print会自动识别换行字符从而进行换行,例如:
5、一次读取一个字符复制文本文件
6、FileReader读数据一次一个字符数组
一次读取一个字符数组的方法:
int read(char[] cbuf)
7、复制文件数据到另一文件的两种方式
一次读取一个字符方式
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("FileWriterDemo.java");
FileWriter fw = new FileWriter("b.txt");
int ch;
while((ch=fr.read())!=-1) {
fw.write(ch);
}
fw.close();
fr.close();
}
}
一次读取一个字符数组方式
//一次读取一个字符数组的方式实现复制文件
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFileDemo2 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("FileWriterDemo.java");
FileWriter fw = new FileWriter("a.txt");
char[] chs = new char[1024];
int len;
while((len=fr.read(chs))!=-1) {
fw.write(chs,0,len);
}
fw.close();
fr.close();
}
}
二、BufferedWriter和BufferedReader
1、BufferedWriter:
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高速写入。
BufferedReader:
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高速读取。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
//创建输出缓冲流对象
/* BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
bw.write("hello");
bw.close();*/
//创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("b.txt"));
/*//一次读取一个字符
int ch;
while((ch=br.read())!=-1) {
System.out.print((char)ch);
}
br.close();
System.out.println("---------------------------");
*/
//一次读取一个字符数组
char[] chs = new char[1024];
int len;
while((len=br.read(chs))!=-1) {
System.out.print(new String(chs,0,len));
}
br.close();
}
}
运行结果:
2、缓冲流的特殊功能
BufferedWriter
void newLine():写一个换行符,这个换行符由系统决定
BufferedReader
String readLine():一次读取一行数据,但是不读取换行符
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedWriterDemoi2 {
public static void main(String[] args) throws IOException {
/*BufferedWriter bw = new BufferedWriter(new FileWriter("d.txt"));
bw.write("hello");
bw.newLine();
bw.write("world");
for(int x=0;x<10;x++) {
bw.write("helloworld"+x);
bw.newLine();
bw.flush();
}
bw.close();*/
BufferedReader br = new BufferedReader(new FileReader("d.txt"));
String line;
while((line=br.readLine())!=null) {
System.out.println(line);//因为String readLine()方法不读取换行符,所以要加ln换行
}
br.close();
}
}
例题:把FileWriterDemo.java文本中的数据复制到copy.txt中
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFileDemo3 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("copy.txt"));
String line;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}
复制文本文件的五种方式
package zhangzuoyan;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//复制文本文件(五种方式)
public class CopyFileTest {
public static void main(String[] args) throws IOException {
String srcFileName="FileName";
String destFileName="copy.txt";
method1(srcFileName,destFileName);
method2(srcFileName,destFileName);
method3(srcFileName,destFileName);
method4(srcFileName,destFileName);
method5(srcFileName,destFileName);
}
//基本流一次读写一个字符
public static void method1(String srcFileName,String destFileName) throws IOException {
FileReader fr = new FileReader(srcFileName);
FileWriter fw = new FileWriter(destFileName);
int ch;
while((ch=fr.read())!=-1) {
fw.write(ch);
}
fr.close();
fw.close();
}
//基本流一次读写一个字符数组
public static void method2(String srcFileName,String destFileName) throws IOException{
FileReader fr = new FileReader(srcFileName);
FileWriter fw = new FileWriter(destFileName);
char[] chs = new char[1024];
int len;
while((len=fr.read(chs))!=-1) {
fr.read(chs, 0, len);
}
fw.close();
fr.close();
}
//缓冲流一次读写一个字符
public static void method3(String srcFileName,String destFileName) throws IOException{
BufferedReader br = new BufferedReader(new FileReader(srcFileName));
BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName));
int ch;
while((ch=br.read())!=-1) {
bw.write(ch);
}
bw.close();
br.close();
}
//缓冲流一次读写一个字符数组
public static void method4(String srcFileName,String destFileName) throws IOException{
BufferedReader br = new BufferedReader(new FileReader(srcFileName));
BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName));
char[] chs =new char[1024];
int len;
while((len=br.read(chs))!=-1) {
bw.write(chs,0,len);
}
bw.close();
br.close();
}
//缓冲流一次读写一个字符串
public static void method5(String srcFileName,String destFileName) throws IOException{
BufferedReader br = new BufferedReader(new FileReader(srcFileName));
BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName));
String line;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}
练习1:把集合中的数据写到文本文件中
package zhangzuoyan;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
//把ArrayList集合中的字符串数据存储到文本文件中
//把每一个字符串数据作为文件中的一行数据
/*分析:A:创建集合对象
B:往集合中添加字符串对象
C:创建输出缓冲流对象
D:遍历集合,得到每一个字符串元素,然后把该字符串元素作为数据写到文本文件
E:释放资源*/
public class ArrayListToFileTest {
public static void main(String[] args) throws IOException {
ArrayList<String> array= new ArrayList<String>();
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();
}
}
练习2:从文本文件中读取数据到ArrayList集合中,并遍历集合
package zhangzuoyan;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
//从文本文件中读取数据到ArrayList集合中,并遍历集合
/*分析:A:创建输入缓冲流对象
B:创建集合对象
C:读取数据,每次读取一行数据,把该行数据作为一个元素存储到集合中
D:释放资源
E:遍历集合*/
public class FileToArrayListTest {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("array.txt"));
ArrayList<String> array=new ArrayList<String>();
String line;
while((line=br.readLine())!=null) {
array.add(line);
}
for(int x=0;x<array.size();x++) {
String s =array.get(x);
System.out.println(s);
}
}
}
1、IO流练习
一、键盘录入三个学生信息(学号,姓名,年龄,居住地)存入集合。然后遍历集合把每一位学生信息存入文本文件(每一个学生信息为一行数据,自己定义分割标记)
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
//键盘录入三个学生信息(学号,姓名,年龄,居住地)存入集合。然后遍历集合把每一位学生信息存入文本文件(每一个学生信息为一行数据,自己定义分割标记)
/*分析:A:定义学生类
B:创建集合对象
C:写方法实现键盘录入学生信息,并把学生对象作为元素添加到集合
D:创建输出缓冲流对象
E:遍历集合,得到每一个学生信息,并把学生信息按照一定的格式写入文本文件
举例:201716010106,向问天,20,北京
F:释放资源*/
public class ArrayListToFileTest {
public static void main(String[] args) throws IOException {
//创建集合对象
ArrayList<Student> array= new ArrayList<Student>();
//写方法实现键盘录入学生信息,并把学生对象作为元素添加到集合
addStudent(array);
addStudent(array);
addStudent(array);
//创建输出缓冲流对象,
BufferedWriter bw = new BufferedWriter(new FileWriter("array.txt"));
//遍历集合,得到每一个学生信息,并把学生信息按照一个的格式写入文本文件中
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();
}
//添加学生
public static void addStudent(ArrayList<Student> array) {
//创建键盘录入对象
Scanner sc =new Scanner(System.in);
//为了让id能够被访问到,我们就把id定义在了循环的外边
String id;
//为了代码能够回到这里,用循环
while(true) {
System.out.println("请输入学生学号:");
//String id=sc.nextLine();
id=sc.nextLine();
//判断学号有没有被人占用
//定义标记
boolean flag = false;
//遍历集合,得到每一个学生
for(int x =0;x<array.size();x++) {
Student s=array.get(x);
//获取该学生的学号,和键盘录入的学号进行比较
if(s.getId().equals(id)) {
flag=true;//说明学号被占用了
break;
}
}
if(flag) {
System.out.println("你输入的学号已经被占用,请重新输入");
}else {
break;//结束循环
}
}
System.out.println("请输入学生姓名:");
String name=sc.nextLine();
System.out.println("请输入学生年龄:");
String age=sc.nextLine();
System.out.println("请输入学生居住地:");
String address=sc.nextLine();
//创建学生对象
Student s =new Student();
s.setId(id);
s.setAddress(address);
s.setName(name);
s.setAge(age);
//把学生对象作为元素添加到集合
array.add(s);
System.out.println("添加学生成功");
}
}
二、把上一题的文本文件中的学生信息读取出来存储到集合中,然后遍历集合,在控制台输出
package zhangzuoyan;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
//把上一题的文本文件中的学生信息读取出来存储到集合中,然后遍历集合,在控制台输出
/*分析:
A:定义学生类
B:创建输入缓冲流对象
C:创建集合对象
D:读取文件数据,并把数据按照一定的格式进行分割赋值给学生对象,然后把学生对象作为元素存储到集合
E:释放资源
F:遍历集合*/
public class FileToArrayListTest {
public static void main(String[] args) throws IOException {
//创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("array.txt"));
//创建集合对象
ArrayList<Student> array=new ArrayList<Student>();
//读取文件数据
String line;
while((line=br.readLine())!=null) {
//分割字符串
String[] strArray=line.split(",");
//创建学生对象并赋值
Student s =new Student();
s.setId(strArray[0]);
s.setName(strArray[1]);
s.setAge(strArray[2]);
s.setAddress(strArray[3]);
//把学生对象作为元素存储到集合
array.add(s);
}
//释放资源
br.close();
//遍历集合
System.out.println("学号\t\t姓名\t年龄\t居住地");
for(int x=0;x<array.size();x++) {
Student s=array.get(x);
System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getAddress());
}
}
}