一、概述。
java对数据的操作是通过流的方式。
java用于操作流的对象都在IO包中。
流按照操作数据不同分为两种,字节流和字符流。
流按照流向分为输入流,输出流。
输入输出的“入”和“出”是相当于内存来说的。
字符流:字节流读取文字字节数据后,不直接操作,而是先查指定的编码表,获取对应的文字,再对这个文字进行操作。简单来说就是字节流+码表。
在IO流中,字节流的顶层父类是Writer和Reader。
二、java.io.FileWriter类。
public class FileWriterextends OutputStreamWriter |
Writer
|--OutputStreamWriter
|--FileWriter
该类是操作字符文件的流,用于将数据写入到文件中。
1.方法摘要
(1).构造方法。
有两个重要的构造方法:
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。 |
FileWriter(File file,
boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。 |
后者相对于前者来说多了一个boolean型的参数,该参数的作用是决定写入文件的方式是追加方式还是覆写方式。
默认的构造方法(前者)构造的FileWriter流对象向文件中写入的时候会默认的将文件的内容清空然后再写入,如果使用后者并将true传入该构造方法,则写入的方式就变成了追加方式。
(2).write方法。
该类没有自己的write方法,全部从父类或者超类中继承而来的write方法。
从OutputStreamWriter中继承而来的方法:
void |
write(char[] cbuf, int off, int len) 写入字符数组的某一部分。 |
void |
write(int c)
写入单个字符。 |
void |
write(String str,
int off, int len) 写入字符串的某一部分。 |
从Writer中继承而来的write方法:
void |
write(char[] cbuf) 写入字符数组。 |
void |
write(String str) 写入字符串。 |
(3).flush方法。
void |
flush() 刷新该流的缓冲。 |
该方法是从OutputStreamWriter中继承而来的,作用是将流中的数据数据刷到文件中。文件关闭前会默认调用此方法。如果不调用此方法,则当缓冲区满了也会自动调用该方法。
(4).close方法。
void |
close() 关闭此流,但要先刷新它。 |
2.flush与close比较
使用flush方法和close方法均可以保存文件,使用这两者各有什么好处?
举一个形象的例子:我们在使用记事本软件的时候,会常常使用“保存”按钮保存住当前内容到文件,如果没有保存,关闭文件的时候就会出现提示信息“是否要保存文件内容?”,然后再关闭文件。在这个例子中,“保存”相当于flush的功能,而关闭文件则相当于close的功能,经常点保存按钮的目的就是为了防止断电丢失和节约内存。
因此,使用flush的目的就是为了防止断电丢失和节约内存,因此在写程序的时候,尽量写入一句刷新一句;如果文件不关闭,最明显的影响就是“删不掉文件”。
3.FileWriter细节:换行和续写
在Windows字符文件中,文件的换行符是\r\n,在linux中则为\n,这样很有可能导致同一个java程序在linux中的运行结果和在windows中的运行结果不一致。解决方法是使用System类中的方法getProperty,得到当前系统中的行分隔符。具体用法:String line_sparator=System.getProperty("line.separator");
如果想要在已存在的文件末尾添加新内容,则需要使用第二种构造方法。
4.异常处理标准模板。
1 package p02.FileWriterDemo.p01.ExceptionCaptureDemo; 2 3 import java.io.FileReader; 4 import java.io.FileWriter; 5 import java.io.IOException; 6 7 public class ExceptionHandleDemo { 8 9 public static void main(String[] args) { 10 standarExceptionHandleDemo(); 11 } 12 13 private static void standarExceptionHandleDemo() { 14 FileWriter fw=null; 15 FileReader fr=null; 16 try 17 { 18 fr=new FileReader("c:\\source.txt");//可能会抛出FileNotFindException 19 fw=new FileWriter("c:\\aim.txt");//可能会抛出IOException 20 char buf[]=new char[1024]; 21 int length=fr.read(buf); 22 fw.write(buf,0,length); 23 fw.flush(); 24 } 25 catch(IOException e) 26 { 27 System.out.println("读写失败!"); 28 } 29 finally 30 { 31 if(fr!=null) 32 { 33 try 34 { 35 fr.close(); 36 } catch (IOException e) 37 { 38 //异常处理程序 39 } 40 } 41 if(fw!=null) 42 { 43 try 44 { 45 fw.close(); 46 } catch (IOException e) 47 { 48 //异常处理程序 49 } 50 } 51 } 52 } 53 54 }