一般使用串行方式读出或者写入文件。总的来说,使用输入流把文件内容读入内存,使用输出流把内存中的信息写出到文件。这些类位于java.io包下。
输入和输出的类和方法往往是对应的
文本文件
先了解如何读写文本文件,然后看如何读写二进制文件。jaVa.ioReader用来读取字符,它的子类FileReader用来读取文本文件。
FileReader打开指定路径下的文件。文件的路径分隔符可以用“\”或者“/”表示。
“\”是Windows风格的写法,因为字符串中的特殊字符要转义,所以用两个斜线表示一个斜线。
FileReader fr = new FileReader ("c: Wautoexec.bat"); //打幵文本文件
“/”是Linux风格的路径写法,因为不需要转义,所以正斜线只需要写一个就可以了。
FileReader fr = new FileReader ("c:/autoexec.bat"); //打开文本文件
如果有一堆砖要搬,一次取不完,不会一次只拿一块砖,会尽量多拿几块。如果有很多内
容要读,不会一次只读一个字节,而是一次尽量多读一些字节到缓存。
FileReader fr = new FileReader ("c:/autoexec.bat"); //打开文本文件
BufferedReader br = new BufferedReader (fr); //缓存读
String line;
while ((line = br .readLine ()) != null) { //按行读入文件
System.out.println(line);
}
fr.close(); //关闭文本文件
输入流把数据从硬盘读入随机访问存储器(Random Access Memory,简称RAM)。可以
根据输入流构建BufferedReader,实现代码如下所示。
String fileName = "SDIC.txt"; //文件名 InputStream file = new FilelnputStream (new File (fileName)); //打开输入流 //缓存读入数据 BufferedReader in = new BufferedReader(new InputStreamReader(file,"GBK"));
for循环按行读入一个文件
String fileName = "SDIC.txt"; //文件名 InputStream file = new FilelnputStream (new File (fileName));"打开输入流 //缓存读入数据 BufferedReader in = new BufferedReader(new InputStreamReader(file,"GBK")); String line = in.readLine(); while (line != null) { System.out.println (line); line = in.readLine(); } in.close ();
一般来说,Writer是把内容立即写到硬盘。如果要多次调用write方法,则批量写入效率会
更高。类似于团购,团购的价格往往比单件购买的价格低。可以使用缓存加快文件写入速度。
//使用缺省的缓存大小 BufferedWriter bw - new BufferedWriter(new FileWriter(fileName)); bw.write (”Hello,China!"); //写入一个字符串 bw.write (” ”); //写入换行符 bw.write("Hello,World!"); bw.close(); //把缓存中的内容写入文件
使用BufferedWriter写入数据时,最后需要调用BufferedWriter的close方法。如果不关闭
文件,可能导致缓存中的数据丢失,写入文件的数据不完整。
按指定编码写入文本的完整代码如下所示。
/* * 向文件写入字符串 * * @param content 字符串 * * @param fileName 文件名 * * @param encoding 编码 */ public static void writeToFile(String content, String fileName, String encoding) { try { FileOutputStream fos = new File0utputStream(fileName); OutputStreamWriter osw = new OutputStreamWriter(fos, encoding); BufferedWriter bw = new BufferedWriter(osw); bw.write(content); bw.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
如果黑板上已经有字,可以选择抹去黑板上已有的字重新写,也可以在原来的文字后继续
写。如果一个文件已经存在,可以把新的内容追加写到最后,也可以从头写入新内容,也就是
覆盖写。FileWriter的构造方法区别于这两种写入方式。
//FileWriter 构造方法 . FileWriter( String fileName, boolean mode) throws IOException
其中的mode = false表示覆盖写,mode = true表示追加写。为了避免冲突,在一个时刻只
能有一个线程写文件。