一. OutputStream
OutputStream 是字节输出流, 用于从程序中往文件里写入内容。 常常使用其子类, FileOutputStream.
一.一 OutputStream 接口方法
一定要关闭流。
一.二 FileOutputStream 类
对于文件的字节操作,常常使用 FileOutputStream 类。
一.二.一 构造方法
一.二.一.一 方法
实际上,常用这两种方式,一种是传入文件,另外一种是传入文件路径。
如果传入的文件不存在的话,那么构造时会创建该文件。
老蝴蝶建议, 传入文件。
一.二.一.二 演示
@Test public void conTest() throws Exception{ //有两种,一种是传入文件File, 一种是传入路径字符串 File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); //传入File,重写文件 OutputStream outputStream=new FileOutputStream(file); //传入File, 追加文件 // OutputStream outputStream=new FileOutputStream(file,true); String path="E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello.txt"; //传入路径, 重写文件 OutputStream outputStream1=new FileOutputStream(path); //传入路径,追加文件 // OutputStream outputStream1=new FileOutputStream(path,true); }
一.二.二 写入和关闭方法
重写父类的方法, 主要是 write() 方法。
一.三 OutputStream 写入文件
一.三.一 write(int b) 单个写入
写入int 类型,如果写入的是字符串的话,需要将字符串转换成字节数组,然后遍历字节数组,一个个写入。
@Test public void writeContentTest() throws Exception{ File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); //这个文件不存在 OutputStream outputStream=new FileOutputStream(file); //输入单个内容 outputStream.write(100); //输入单个内容 outputStream.write((int)'a'); //输入数组 String str="Hello,My Name is TwoButterfly\r\n"; //一次次写入 byte[] bytes=str.getBytes("UTF-8"); //一个一个写入 for(byte b:bytes){ //byte 类型会自动转换成 int 类型 outputStream.write(b); } System.out.println("写入内容成功"); outputStream.close(); }
运行程序,查看文件内容
会将100 转换成字节, 转换后为 d. (97+3, 97为小写字母a)
会发现,当写入字符串时,需要一个一个的写,效率太低。 能不能直接写入字符串呢?
一.三.二 write(byte[] bytes) 字节数组形式写入
当写入字符串时,因为是字节输出,所以是不能直接写入字符串的, 但却可以直接写入字节数组。 就是将一个个字节先封装起来,封装成一个字节数组,然后以字节数组为单位,进行写入。 建议都采用写字节数组的形式。
@Test public void writeContent2Test() throws Exception{ File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); //不是追加,是重写。 OutputStream outputStream=new FileOutputStream(file); //输入字符串 String str="Hello,My Name is TwoButterfly"; //将字符串转换成字节数组 byte[] bytes=str.getBytes("UTF-8"); //写入字节数组, 也可以 后面添加 0, len 形式的。 outputStream.write(bytes); System.out.println("写入文件成功"); outputStream.close(); }
运行程序,查看内容
发现,将以前的内容,先删除,再进行写入。 那么,能不能保留以前的内容呢?
一.三.三 追加内容,构造方法时令append 参数为true
在构造方法 FileOutputStream 时,令参数 append为true 即可。
@Test public void writeContent3Test() throws Exception{ File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); //令参数为true,追加内容 OutputStream outputStream=new FileOutputStream(file,true); //输入字符串, 追加内容 String str="Thank you"; //将字符串转换成字节数组 byte[] bytes=str.getBytes("UTF-8"); //写入字节数组 outputStream.write(bytes); System.out.println("写入文件成功"); outputStream.close(); }
运行程序:
会发现,格式非常不好,都连在一起了, 能不能换行呢?
一.三.四 换行,写入 \r\n
换行,只需要写入换行符就可以了。 换行符是 \r\n
@Test public void writeContent4Test() throws Exception{ File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); //令参数为true,追加内容 OutputStream outputStream=new FileOutputStream(file,true); //输入字符串, 追加内容,并且换行 String str="\r\n I change Line"+"\r\n I change Line too"; //将字符串转换成字节数组 byte[] bytes=str.getBytes("UTF-8"); //写入字节数组 outputStream.write(bytes); System.out.println("写入文件成功"); outputStream.close(); }
运行程序:
现在写入的都是英文字符,能不能写入我们伟大的中国汉字呢?
一.三.五 写入汉字
@Test public void writeContent5Test() throws Exception{ File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); //这个文件不存在 OutputStream outputStream=new FileOutputStream(file,true); //输入汉字 String str="\r\n你好,我是两个蝴蝶飞"; //写入数组 byte[] bytes=str.getBytes("UTF-8"); //换一种形式 outputStream.write(bytes,0,bytes.length); outputStream.close(); }
运行程序:
正常写入汉字。 能够将内容写入到文件里面,那么就可以将文件内容读取出来。