一、 FileWriter
1、写数据
需求:
往文件中写数据
写数据---输出流---FileWriter
FileWriter:
FileWriter(String fileName):传递一个文件名称
输出流写数据的步骤
1、创建输出流对象
2、调用输出流对象的写数据的方法,并刷新内存缓冲区
3、释放资源
相对路径:
相对当前项目而言,在项目的根目录下(a.text)
绝对路径:
以盘符开始的路径(d:\\a.text)
close()和flush()方法的区别:
flush():刷新缓冲区,流对象还可以再继续被使用
close():先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用
代码块:
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo{
public static void main(String[] args ) throws IOException{
//创建输出流对象
FileWriter fw = new FileWriter("d:\\a.text");
//若没有加盘符:d
/*
FileWriter fw = new FileWriter("a.text");
相对路径,选中项目,刷新,便会出现在项目下
*/
/*创建输出流对象做了三个事情:
1、调用系统资源创建了一个文件
2、创建输出流对象
3、把输出流对象指向文件
*/
//写一个字符串数据
fw.write(“IO流”);
//数据没有直接写入文件,而是写到了内存缓冲区,需要调用方法进行刷新,刷新缓冲区
fw.flush();
//释放资源(才能对该文件进行删除操作,否则仍然使用该文件,不能对文件进行删除操作)
//通知系统释放和该文件相关的资源
fw.close();
}
}
2、FileWriter写数据-----换行和追加写
如何实现数据的换行:
\n可以实现换行,但是Windows系统自带的记事本打开并没有换行,这是因为Windows系统换行的标记是\r\n
不同操作系统换行对应的标记:
windows:\r\n
linux:\n
mac:\r
如何实现数据的追加写入:
FileWreter(String fileName, boolean append)
代码块
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo{
public static void main(String[] args ) throws IOException{
//创建输出流对象
//FileWriter fw = new FileWriter("c.text");
FileWriter fw = new FileWriter("c.text",true);//表示追加写入,默认值为false
for(int x=0;x<10;x++){
fw.write("hello"+x);
fw.write("\n");
}
//释放资源
fw.close();
}
}
三、FileReader读数据一次读取一个字符
1
需求:
从文件中读取数据并显示到控制台
读数据---输入流---FileReader
FileReader:
FileReader(String fileName):传递文件名称
输入流读文件的步骤:
1、创建输入流对象
2、调用输入流对象的读取方法
3、释放资源
代码块
public class FileReaderDemo{
public static void main(String[] args) throws IOException {
//创建输入流对象
FileReader fr = new FileReader("fr.txt");
//调用输入流对象的读取方法
//Int read():一次读取一个字符
/*
//第一次读数据
int ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
//第二次读数据
int ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
//第三次读数据
int ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
*/
/*代码重复度高,想要用循环进行控制的话,但是不知道循环的结束条件,
从测试的知,当读取数据的返回值是-1时,则说明没有数据,这也是循环的结束条件
*/
//代码改进
int ch ;
while((ch=fr.read())!=-1){
System.out.print((char)ch);//无需进行换行
}
//释放资源
fr.close();
}
}
2、用例:一次读写一个字符复制文本文件
需求:
把项目路径下的FileWriterDemo.java中的内容复制到项目路径下的Copy.java中
文件复制也是有规律可循
数据流:
FileWriterDemo.java-----读数据----FileReader
目的地:
Copy.java----写数据---FileWriter
代码块
public class CopyFileDemo{
public static void main(String[] args) throws IOException{
//创建输入流对象
FileReader fr = new FileReader("FileWriterDemo.java");
//创建输出流对象
FileWriter fw = new FileWriter("Copy.java");
//读写数据
int ch;
while((ch=fr.read())!=-1){
System.out.print((char)ch);
}
//释放资源
fw.close();
fr.close();
}
}
3、FileReader读数据 一次一个字符数组复制文本文件
在Java项目中创建一个file文件:fr2.txt,在文件中输入
hello
world
/*
输入流读取数据的步骤
1、创建输入流对象
2、调用输入流对象的读取数据的方法(换行占两个字符\r\n)
3、释放资源
*/
public class FileReaderDemo2{
public static void main(String[] strs)throws IOException{
//创建输入流对象
FileReader fr = new FileReader("fr.txt");
//调用输入流对象的读取数据方法
//int read(char[] cbuf):一次读取一个字符数组的数据,返回的是实际读取的个数
char[] chs = new char[5];//这里可以是1024及其整数倍
//第一次读数据
int len = fr.read(chs);
System.out.println("len:"+len);
System.out.println(new String(chs));//通过创建字符串对象,存储字符串数组
//System.out.println(new String(chs,0,len))
//第二次读数据
len = fr.read(chs);
System.out.println("len:"+len);
System.out.println(new String(chs));
//System.out.println(new String(chs,0,len))
//第一次读数据
len = fr.read(chs);
System.out.println("len:"+len);
System.out.println(new String(chs));
//System.out.println(new String(chs,0,len))
//释放资源
fr.close();
}
}
输出结果:
len:5
hello
len:5
wor
len:4
ld
r
第一次:
len:5
hello
第二次:
len:5
\r\nwor
wor
第三次:
len:4
ld\r\nr(r是替换第二次输出结果替换前四个字符后剩下的)
ld
r
①为了避免出现多余字符的出现(r),一般使用System.out.println(new String(chs,0,len))语句。
②上面代码冗余度较高,使用循环进行改进:当实际读取长度为-1时,即表示没有数据可读
char[] chs = new char[1024];//一般为1024的整数倍
int len;
//1、fr.read(chs)
//2、len = fr.read(chs)
//3、len!= -1
while((len=fr.read(chs))!=1){
System.out.print(new String(chs,0,len));
}