Java语法回顾之FileWriter&&FileReader
读了那么多年的书让我明白一个道理。人要稳重,不要想到啥就做啥。做一行越久即使你不会,几年之后慢慢的你也会了,加上一点努力你或许你能成为别人眼中的专家。
FileWriter简介
/*
* IO流:
* 字节流
* 字节输入流 读取数据 InputStream
* 字节输出流 写入数据 OutputStream
* 字符流
* 字符输入流 读取数据 Reader
* 字符输出流 写入数据 Writer
*
* 需求:我要把一句话:"hello,io,我来了。祝你元旦快乐。"写入一个test.txt中。
*
* 分析:
* A:由于我们是写数据,所以使用OutputStream或者Writer。
* B:由于我们要写入到一个文本文件中,所以最终选择了Writer。
*
* 通过查看API,我们发现,Writer是一个抽象类。那么,怎么办呢?
* 只能找子类使用。又由于我们是对文件操作,我们猜测了这个子类的名称是:FileWriter
*
* 去看FileWriter的构造方法:
* A:FileWriter(File file)
* B:FileWriter(String fileName)
*/
FileWriter代码测试
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
// 创建字符输出流对象
/*
* 创建字符输出流对象做了几件事情? A:调用系统功能创建了文件 B:创建字符输出流对象 C:把字符输出流对象指向创建的文件
*/
FileWriter fw = new FileWriter("a.txt");
// 调用写数据的功能
fw.flush();
// 释放资源
fw.close();
/*
* 为什么要close()呢?
* 1:让流对象变成垃圾。
* 2:通知系统去释放和文件相关的资源。
*/
}
}
FileWriter知识点
/*
* 字符输出流操作步骤:
* A:创建字符输出流对象
* B:调用对象的写入数据方法,并刷新缓冲区
* C:释放资源
*
* 问题1:为什么FileWriter没有无参构造方法?
* 因为写数据的时候,一定要明确写道哪里去。
*
* 问题2:flush()和close()的区别?
* flush():只刷新缓冲区,流对象还可以继续使用。
* close():先刷新缓冲区,在关闭流对象。流对象不可以继续被使用。
*
* 问题3:难道每次调用方法的时候,都需要刷新吗?或者说,不用刷,直接等到close()来解决,行不行?
* 这两种方式都不可取。
*/
FileWriter知识点补充
/*
* 1:写入数据的方式,有5种。
* write(int ch)
* write(char[] chs,int index,int len)
* write(char[] chs)
* write(String str,int index,int len)
* write(String str)
*
* 3:数据没次都把以前的给覆盖了,如果我想追加写入,怎么办?
* 构造的时候,用带两个参数的。
* public FileWriter(String fileName,boolean append)
*/
FileWriter知识点补充代码测试
public class FileWriterDemo3 {
public static void main(String[] args) throws IOException {
// 创建字符输出流对象
FileWriter fw = new FileWriter("b.txt",true);
// 追加数据
fw.write("hello\r\n");
fw.write("world\r\n");
fw.write("java\r\n");
fw.flush();
// 释放资源
fw.close();
}
}
FileReader按字节读取字符
/*
* 字符输入流读取数据步骤:
* A:创建字符输入流对象
* B:调用读取数据功能,并显示
* C:释放资源
*
* 一次读取一个字符。
*/
FileReader按字节读取字符代码测试
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
// 创建字符输入流对象
FileReader fr = new FileReader("b.txt");
//初始的len为0,就是没有读
int len = 0;
//如果len不等于-1,就一直读。
while ((len = fr.read())!=-1) {
System.out.print((char)len);
}
fr.close();
}
FileReader按字符数组读取字符
/*
* 一次读取一个字符数组
* public int read(char[] cbuf)
* 每次读取数据,把数据存储到字符数组中,返回值是实际读取长度。
*/
FileReader按字符数组读取字符代码测试
public class FileReaderDemo2 {
public static void main(String[] args) throws IOException {
// 创建字符输入流
// FileReader fr = new FileReader("b.txt");
FileReader fr = new FileReader("FileReaderDemo.java");
// 读取数据
// 如果实际读取长度是-1的情况,那么,说明已经读取到结尾了
// 开发的写法
// 数组的长度一般定义为1024的整数倍。
char[] chs = new char[1024];
int len = 0;
while((len = fr.read(chs))!=-1){
System.out.print(new String(chs,0,len));
}
// 释放资源
fr.close();
}
}
FileRead文件复制
/*
* 需求:我要把项目路径下的FileReaderDemo.java复制到/Users/xwf/Downloads中
*
* 数据源:
* 读取数据:
* FileWriterDemo.java -- Reader -- FileReader
*
* 目的地:
* 写入数据:
* /Users/xwf/Downloads -- Writer -- FileWriter
*/
FileRead文件复制代码测试
public class CopyFile {
public static void main(String[] args) throws IOException {
// 封装数据源
FileReader fr = new FileReader("FileReaderDemo.java");
// 封装目的地
FileWriter fw = new FileWriter("//Users//xwf//Downloads//1.txt");
// 读取数据
char[] chs = new char[1024];
int len = 0;
while ((len = fr.read(chs))!=-1) {
fw.write(chs,0,len);
}
// 释放资源
fw.close();
fr.close();
}
}