参见 FileDescriptor。 OutputStream 中这个方法的实现什么也没做。 具体子类应该重写这个方法。 FileOutputStream 没有使用缓存,因此没有重写这个方法。因此,上面代码示例中,这个方法调用与否对运行 结果没有影响。 public void close() throws IOException 这个方法用于关闭流。虽然,如果用户忘记调用这个方法,系统可以通过 finalyze 方法在 OutputStream 对象垃圾回收的时候替用户关闭这个流。但用户应该养成良好的习惯显示的 调用这个方法! OutputStream 中这个方法的实现什么也没做。具体子类应该重写这个方法。 java.io.FileOutputStream 重写了这个方法。 用于真正关闭相应的文件资源。 [FileOutputStream 的其他方法]: java.io.FileOutputStream 除了重写 OutputStream 中上述四个方法之外,还提供了额外三个 方法: protected void finalize() throws IOException 。这个方法其实是重写了 Object 中的这个方法 (Object 是所有 Java 类(包括数组类型)的“根级”父类)。这个方法是被 Java 虚拟机中 的垃圾回收器调用的。用于 Java 对象已经不存在了但它占有的资源没有释放的情况。 FileOutputStream 实现中,这个方法主要是调用了 close() 方法。上面例子中,如果用户没 有调用 close() 方法,系统就通过这个方法在垃圾回收的时候关闭文件。但写程序时应该养 成显示关闭文件的习惯。 public final FileDescriptor getFD() throws IOException。 这个方法返 回 FileDescriptor 对象,这个对象表示这个文件流对应的文件系统中的实际文件。 关于 FD 的使用,请参见本站相关文章。 public FileChannel getChannel() 这是在 JDK1.4 中引入的方法。用于支持 New IO 的特性。 这个方法返回 FileChannel 对象,这个对象表示这个文件对应的文件系统中的通道。关于 Channel 和 New IO,请参阅本站其它文章。 [关于 FileOutputStream 的构造] FileOutputStream 提供了五个构造方法: FileOutputStream(File file) throws FileNotFoundException 和 FileOutputStream(String name) throws FileNotFoundException 都是通过实际文件路径(或其标识的 File 对象)来创建文 件流。需要注意的是,如果文件不存在,(待查:是否会创建文件)。如果文件存在,则这 两个构造方法中有打开文件的操作。如果文件给定的是目录而不是文件,或者文件不存在 又不能创建,或者文件存在却不能打开,则抛出 FileNotFoundException 异常。如果 文件由于安全保护而不允许读取,则抛出 SecurityException 异常。 写文件需要考虑的一个问题是,是从文件头写入(覆盖原有数据),还是从文件尾写入(增 加数据) 。 上面的两个构造方法都是按照前者实现的, 针对后者的情况, FileOutputStream 提 供另外两个构造方法: FileOutputStream(File file, boolean append) throws FileNotFoundException 和 FileOutputStream(String name, boolean append) throws FileNotFoundException 这两个构造方法多了一个 append 参数,如果参数值是 true, 则是“增加数据”,如果参数值 是 false, 则是“覆盖原有数据”。即,退化成前两种构造方法。 最后,同 FileInputStream 一样, FileOutputStream 提供了用已经打开的文件来创建 一个新的文件流: public FileInputStream(FileDescriptor fdObj) 这个构造方法里没有打开文 件操作。输入的 FD 对应的一定是一个已经打开的文件。 有一个有趣的问题:如果我用同一个 FileDescriptor 对象创建两个流:一个输入流,一个 输出流。他们能同时进行读写操作吗?下面的示例代码给出试验: 还有一个问题: 是否允许对同一个文件打开多个流, FileReader 和 FileWriter ava 中的 FileWriter 类 和 FileReader 类的一些基本用法 1,FileWriter 类(字符输出流类) 构造方法:FileWriter fw = new FileWriter(String fileName);//创建字符输出流类对象和已存 在的文件相关联。文件不存在的话,并创建。 如:FileWriter fw = new FileWriter("C:\\demo.txt"); FileWriter fw = new FileWriter(String fileName,boolean append);//创建字符输 出流类对象和已存在的文件相关联,并设置该该流对文件的操作是否为续写。 如:FileWriter fw = new FileWriter("C:\\demo.txt",ture); //表示 在 fw 对文件再次写入时,会在该文件的结尾续写,并不会覆盖掉。 主要方法: void write(String str) //写入字符串。当执行完此方法后,字符数据还并没有写 入到目的文件中去。此时字符数据会保存在缓冲区中。 此时在使用刷新方法就可以使数据保存到目的文件中 去。 viod flush() 文件中去。 viod close() [java] view plain copy //刷新该流中的缓冲。将缓冲区中的字符数据保存到目的 //关闭此流。在关闭前会先刷新此流的缓冲区。在关闭后, 再写入或者刷新的话,会抛 IOException 异常。 1. package filewriter; 2. 3. import java.io.FileWriter; 4. import java.io.IOException; 5. 6. public class Filewriter { 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. /** * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { /** * 创建一个可以往文件中写入字符数据的字符流输出流对象 * 创建时必须明确文件的目的地 * 如果文件不存在,这回自动创建。如果文件存在,则会覆盖。 private static final String LINE_SEPARATOR = System.getProperty("line.se parator"); 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. // 31. 32. 33. 34. 35. 36. // 37. 38. 39. 40. 41. 42. 43. 44. 45. } } * 当路径错误时会抛异常 * * 当在创建时加入 true 参数,回实现对文件的续写。 */ FileWriter fw = new FileWriter("C:\\demo1.txt",false); /** * 调用该对象的 write 方法,向文件写入字符。 * * 其实写入到了临时存储缓冲区中 */ fw.write("hello \r\nworld!");//windows 中的换行为\r\n fw.write("aello"+LINE_SEPARATOR+"world!"); fw.write("hahaha"); /** * 进行刷新,将字符写到目的地中。 */ fw.flush(); /** * 关闭流,关闭资源。在关闭前会调用 flush 方法 刷新缓冲区。关闭后在写的话, 会抛 IOException */ fw.close(); unix 下为\r。 关于 FileWriter 的的异常处理。 [java] view plain copy 1. package filewriter; 2. 3. import java.io.FileWriter; 4. import java.io.IOException; 5. 6. public class IOExceptionDemo { 7. 8. 9. 10. 11. 12. FileWriter fw = null; try { private static final String LINE_SEPARATOR = System.getProperty("line.se parator"); public static void main(String[] args) { 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. } } } fw = new FileWriter("k:\\Demo.txt", true); fw.write("hello" + LINE_SEPARATOR + "world!"); } catch (Exception e) { System.out.println(e.toString()); } finally { if (fw != null) try { fw.close(); } catch (IOException e) { throw new RuntimeException("关闭失败!"); } 2,FileReader 类 1,构造方法 FileReader fr = new FileReader(String fileName);//使用带有指定文件的 String 参数的构造 方法。创建该输入流对象。并关联源文件。 2,主要方法 int read(); // 读取单个字符。返回作为整数读取的字符,如果已达到流末尾,则返回 -1。 int read(char []cbuf);//将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1。 void close();//关闭此流对象。释放与之关联的所有资源。 [java] view plain copy 1. package Filereader; 2. 3. import java.io.FileReader; 4. import java.io.IOException; 5. 6. public class FileReaderDemo { 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. public static void main(String[] args) throws IOException { /** * 创建读取字符数据的流对象。 * 读取路径不正确时会抛 IOException * 用以个读取流对象关联一个已存在文件。 */ FileReader fr = new FileReader("demo.txt"); /** * 用 Reader 中的 read 方法读取字符。 */ 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. } /*int ch = fr.read(); System.out.print((char)ch); int ch1 = fr.read(); System.out.print((char)ch1); int ch2 = fr.read(); System.out.print((char)ch2);*/ int ch = 0; while((ch = fr.read()) != -1){ System.out.print((char)ch); } fr.close(); } 用 FileReader 和 FileWriter 写的复制文本文件的小程序。 [java] view plain copy 1. package IOtest; 2. 3. import java.io.FileNotFoundException; 4. import java.io.FileReader; 5. import java.io.FileWriter; 6. import java.io.IOException; 7. 8. public class TxtCopy { 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. // /** * 将 C:\\的 myHeart.txt copy 到 D:\\下 * * 首先创建 Reader 读取数据数据的 读取流对象。 * * @throws FileNotFoundException */ public static void main(String[] args) { FileReader fr = null; FileWriter fw = null; try { fr = new FileReader("C:\\my.txt"); fw = new FileWriter("D:\\you.txt"); //读一个字符,写一个字符方法 int ch = 0; 25. // 26. // 27. // 28. // 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. } } } } } if (fw != null) try { fw.close(); } catch (IOException e) { throw new RuntimeException("关闭失败!"); } catch (Exception e) { System.out.println(e.toString()); } finally { if (fr != null) try { fr.close(); } catch (Exception e2) { throw new RuntimeException("关闭失败!"); } } char []