OutputStream
字节输出流
案例:
1,写代码实现把"Hello World!"写到"c:/a.txt"文件中。
a, c:/a.txt不存在时,测试一下。
b, c:/a.txt存在时,也测试一下。
要写两个版本:
a, 使用write(int b) 实现。
b, 使用write(byte[] b) 实现。
2,在已存在的c:/a.txt文本文件中追加内容:“Java IO”。
显然此时需要向指定文件中写入数据。
使用的就是可以操作文件的字节流对象。OutputStream。该类是抽象类,需要使用具体的实现类来创建对象查看API文档,找到了OutputStream的实现类FileOutputStream 创建FileOutputStream 流对象,必须指定数据要存放的目的地。通过构造函数的形式。创建流对象时,调用了系统底层的资源。在指定位置建立了数据存放的目的文件。
流程: 1:打开文件输出流,流的目的地是指定的文件 2:通过流向文件写数据 3: 用完流后关闭流
1.1. 输出流写出方式1:
使用write(int b)方法,一次写出一个字节.
在C盘下创建a.txt文本文件
import java.io.FileOutputStream; import java.io.IOException; public class IoTest2 { public static void main(String[] args) throws IOException { String path = "c:\a.txt"; writeTxtFile(path); } private static void writeTxtFile(String path) throws IOException { // 1:打开文件输出流,流的目的地是指定的文件 FileOutputStream fos = new FileOutputStream(path); // 2:通过流向文件写数据 fos.write('j'); fos.write('a'); fos.write('v'); fos.write('a'); // 3:用完流后关闭流 fos.close(); } }
当c盘下的a.txt不存在会怎么样?
测试:将c盘下的a.txt文件删除,发现当文件不存在时,会自动创建一个,但是创建不了多级目录。
注意:使用write(int b)方法,虽然接收的是int类型参数,但是write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。
1.2. 输出流写出方式2:
使用write(byte[] b),就是使用缓冲.提高效率.
上述案例中的使用了OutputStram 的write方法,一次只能写一个字节。成功的向文件中写入了内容。但是并不高效,如和提高效率呢?是否应该使用缓冲,根据字节输入流的缓冲原理,是否可以将数据保存中字节数组中。通过操作字节数组来提高效率。查找API文档,在OutputStram类中找到了write(byte[] b)方法,将 b.length 个字节从指定的 byte 数组写入此输出流中。
如何将字节数据保存在字节数组中,以字符串为例,”hello , world” 如何转为字节数组。显然通过字符串的getBytes方法即可。
public class IoTest2 { public static void main(String[] args) throws IOException { String path = "c:\a.txt"; writeTxtFile(path); } private static void writeTxtFile(String path) throws IOException { // 1:打开文件输出流,流的目的地是指定的文件 FileOutputStream fos = new FileOutputStream(path); // 2:通过流向文件写数据 byte[] byt = "java".getBytes(); fos.write(byt); // 3:用完流后关闭流 fos.close(); } }
仔细查看a.txt文本文件发现上述程序每运行一次,老的内容就会被覆盖掉。,那么如何不覆盖已有信息,能够往a.txt里追加信息呢。查看API文档,发现FileOutputStream类中的构造方法中有一个构造可以实现追加的功能FileOutputStream(File file, boolean append) 第二个参数,append - 如果为 true,则将字节写入文件末尾处,而不是写入文件开始处
private static void writeTxtFile(String path) throws IOException { // 1:打开文件输出流,流的目的地是指定的文件 FileOutputStream fos = new FileOutputStream(path,true); // 2:通过流向文件写数据 byte[] byt = "java".getBytes(); fos.write(byt); // 3:用完流后关闭流 fos.close(); }