🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## Java编程那些事儿88——文件操作之写文件 陈跃峰 出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb) #### 11.3.1.4 写文件 如前所述,将程序内部的数据输出到程序外部的数据源,应该使用IO类体系中的输出流。在实际的编程中,将程序中的数据,例如用户设定或程序运行时生成的内容,存储到外部的文件中,应该使用输出流进行编程。 基本的输出流包含OutputStream和Writer两个,区别是OutputStream体系中的类(也就是OutputStream的子类)是按照字节写入的,而Writer体系中的类(也就是Writer的子类)是按照字符写入的。 使用输出流进行编程的步骤是: 1、建立输出流 建立对应的输出流对象,也就是完成由流对象到外部数据源之间的转换。 2、向流中写入数据 将需要输出的数据,调用对应的write方法写入到流对象中。 3、关闭输出流 在写入完毕以后,调用流对象的close方法关闭输出流,释放资源。 在使用输出流向外部输出数据时,程序员只需要将数据写入流对象即可,底层的API实现将流对象中的内容写入外部数据源,这个写入的过程对于程序员来说是透明的,不需要专门书写代码实现。 在向文件中输出数据,也就是写文件时,使用对应的文件输出流,包括FileOutputStream和FileWriter两个类,下面以FileOutputStream为例子说明输出流的使用。示例代码如下: ~~~ import java.io.*; /**  * 使用FileOutputStream写文件示例  */ public class WriteFile1 {          public static void main(String[] args) {                    String s = "Java语言";                    int n = 100;                    //声明流对象                    FileOutputStream fos = null;                    try{                             //创建流对象                             fos = new FileOutputStream("e://out.txt");                             //转换为byte数组                             byte[] b1 = s.getBytes();                             //换行符                             byte[] b2 = "/r/n".getBytes();                             byte[] b3 = String.valueOf(n).getBytes();                             //依次写入文件                             fos.write(b1);                             fos.write(b2);                             fos.write(b3);                    } catch (Exception e) {                             e.printStackTrace();                    }finally{                             try{                                      fos.close();                             }catch(Exception e){}                    }          } } ~~~ 该示例代码写入的文件使用记事本打开以后,内容为: Java语言 100 在该示例代码中,演示了将一个字符串和一个int类型的值依次写入到同一个文件中。在写入文件时,首先创建了一个文件输出流对象fos: fos = new FileOutputStream("e://out.txt"); 该对象创建以后,就实现了从流到外部数据源e:/out.txt的连接。说明:当外部文件不存在时,系统会自动创建该文件,但是如果文件路径中包含未创建的目录时将出现异常。这里书写的文件路径可以是绝对路径也可以是相对路径。 在实际写入文件时,有两种写入文件的方式:覆盖和追加。其中“覆盖”是指清除原文件的内容,写入新的内容,默认采用该种形式写文件,“追加”是指在已有文件的末尾写入内容,保留原来的文件内容,例如写日志文件时,一般采用追加。在实际使用时可以根据需要采用适合的形式,可以使用: public FileOutputStream(String name, boolean append) throws FileNotFoundException 只需要使用该构造方法在构造FileOutputStream对象时,将第二个参数append的值设置为true即可。 流对象创建完成以后,就可以使用OutputStream中提供的wirte方法向流中依次写入数据了。最基本的写入方法只支持byte数组格式的数据,所以如果需要将内容写入文件,则需要把对应的内容首先转换为byte数组。 这里以如下格式写入数据:首先写入字符串s,使用String类的getBytes方法将该字符串转换为byte数组,然后写入字符串“/r/n”,转换方式同上,该字符串的作用是实现文本文件的换行显示,最后写入int数据n,首先将n转换为字符串,再转换为byte数组。这种写入数据的顺序以及转换为byte数组的方式就是流的数据格式,也就是该文件的格式。因为这里写的都是文本文件,所以写入的内容以明文的形式显示出来,也可以根据自己需要存储的数据设定特定的文件格式。 其实,所有的数据文件,包括图片文件、声音文件等等,都是以一定的数据格式存储数据的,在保存该文件时,将需要保存的数据按照该文件的数据格式依次写入即可,而在打开该文件时,将读取到的数据按照该文件的格式解析成对应的逻辑即可。 最后,在数据写入到流内部以后,如果需要立即将写入流内部的数据强制输出到外部的数据源,则可以使用流对象的flush方法实现。如果不需要强制输出,则只需要在写入结束以后,关闭流对象即可。在关闭流对象时,系统首先将流中未输出到数据源中的数据强制输出,然后再释放该流对象占用的内存空间。 使用FileWriter写入文件时,步骤和创建流对象的操作都和该示例代码一致,只是在转换数据时,需要将写入的数据转换为char数组,对于字符串来说,可以使用String中的toCharArray方法实现转换,然后按照文件格式写入数据即可。 对于其它类型的字节输出流/字符输出流来说,只是在逻辑上连接不同的数据源,在创建对象的代码上会存在一定的不同,但是一旦流对象创建完成以后,基本的写入方法都是write方法,也需要首先将需要写入的数据按照一定的格式转换为对应的byte数组/char数组,然后依次写入即可。 所以IO类的这种设计形式,只需要熟悉该体系中的某一个类的使用以后,就可以触类旁通的学会其它相同类型的类的使用,从而简化程序员的学习,使得使用时保持统一。