IO包里有很多对象提供使用。这些对象分为两个功能,要么读要么写。
字节流的抽象基类,InputStream (输入流),OutputStream(输出流)。
字符流的抽象基类,Reader(输入流) , Writer(输出流)。
需求:将一些文字存储到硬盘一个文件中。
记住;如果要操作文字数据,建议优先考虑字符流。而且要将数据从内存写到硬盘上,要使用字符流中的输出流,Writer。硬盘的数据基本体现是文件。 所以希望找到一个可以操作文件的Writer。FileWriter是能操作文件的。
FileWriter,用来写入字符文件的便捷类。
1.创建一个可以往文件中写入字符数据的字符输出流对象。既然是往一个文件中写入文字数据,那么在创建对象时,就必须明确该文件(用于存储数据的目的地),所以在构造方法中传入文件名。这个时候,如果文件不存在,则会自动创建。 如果文件存在,则会被覆盖。使用时,可能会发生IO异常,可以使用try...catch捕获,也可以throws抛出去。
try {
FileWriter fw = new FileWriter("demo.txt");
} catch (IOException e) {
e.printStackTrace();
}
2.调用Writer对象中的write(string)方法,写入数据。这时候运行文件中什么也没有。其实数据写入到临时存储缓冲区中。(把数据写到流里)
fw.write("abcd");
3.到Writer中查找方法,flush() 刷新该流的缓冲。“如果该流已保存缓冲区中各种 write() 方法的所有字符,则立即将它们写入预期目标。”所以就用这个方法。进行刷新,将数据直接写到目的地中。这时候运行,文件中有数据。
fw.flush();
4.再次使用write()和flush(),还是可以把内容输出。
fw.write("effg");
fw.flush();
5.流在使用的时候会使用Windows的资源,当程序运行结束的时候,需要释放资源,所以要使用close方法关闭资源。close()方法最好写在finally块中。此时发现,fw超出了作用域,所以,将fw的声明提取到try...catch...finally块之外,关闭时需要捕获异常。还有一点需要注意,fw是对象,所以如果它是null的时候,关闭就会出现问题。所以fw在不等于null的时候,才可以进行关闭。这时候运行,即使没有使用flush()方法,文件中也会有内容。我们说一下关闭的方法,“关闭此流,但要先刷新它。”所以close()会使用flush()方法。“在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。关闭以前关闭的流无效。”
if(fw != null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
6.在文件后追加内容。在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。
7.在运行的时候,我们发现每次运行,都会重新创建文件,所以,文件中的内容每次都会清空,为了不使文件失去原有的内容,我们可以使用这样的构造方法,添加一个参数,参数值为true,这时候,如果文件不存在,创建文件,文件存在,则在文件中追加内容。
FileWriter fw = new FileWriter("demo.txt", true);
8.到此,将一些文字存储到硬盘一个文件中的功能就写完了。
9.完整代码:
FileWriter fw = null;
try{
fw = new FileWriter("demo.txt",true);
fw.write("abcd");
fw.flush();
fw.write("efg");
fw.flush();
}catch(IOException e){
e.printStackTrace();
}finally{
if(fw != null){
try{
fw.close();
}catch(IOException e){
e.printStackTrace();
}
}
}