字节流InputStream和OutputStream(二)上

简介: 字节流InputStream和OutputStream(二)

一. OutputStream


OutputStream 是字节输出流, 用于从程序中往文件里写入内容。 常常使用其子类, FileOutputStream.


一.一 OutputStream 接口方法


image.png


一定要关闭流。


一.二 FileOutputStream 类


对于文件的字节操作,常常使用 FileOutputStream 类。


一.二.一 构造方法


一.二.一.一 方法


image.png


实际上,常用这两种方式,一种是传入文件,另外一种是传入文件路径。


如果传入的文件不存在的话,那么构造时会创建该文件。


老蝴蝶建议, 传入文件。


一.二.一.二 演示


   @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() 方法。


20200617105222312.png


一.三 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();
    }


运行程序,查看文件内容


20200617105231323.png


会将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();
    }


运行程序,查看内容


20200617105236611.png


发现,将以前的内容,先删除,再进行写入。 那么,能不能保留以前的内容呢?


一.三.三 追加内容,构造方法时令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();
    }


运行程序:


20200617105241731.png


会发现,格式非常不好,都连在一起了, 能不能换行呢?


一.三.四 换行,写入 \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();
    }


运行程序:


20200617105246871.png


现在写入的都是英文字符,能不能写入我们伟大的中国汉字呢?


一.三.五 写入汉字


@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();
    }


运行程序:


20200617105252823.png


正常写入汉字。 能够将内容写入到文件里面,那么就可以将文件内容读取出来。

相关文章
|
8月前
|
C语言 C++ 开发者
C++输入流和输出流介绍
C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案: 使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据; 使用 fscanf()、fgets() 等函数读取文件中的数据,使用 fprintf()、fputs() 等函数向文件中写入数据。 要知道,C 语言的这套 I/O 解决方案也适用于 C++ 程序,但 C++ 并没有“偷懒”,它自己独立开发了一套全新的 I/O 解决方案,其中就包含
50 0
|
11月前
|
存储 缓存 Java
【Java I/O 流】字节输入输出流:InputStream & OutputStream
本篇介绍字节输入输出流,它们是所有字节流的超类,提供了一些常用方法,我们一起看一下。
45 0
|
11月前
|
存储 缓存 Java
【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter
本篇文章主要讲述“文件字符输入流”和“文件字符输出流”两个类的使用,并列举了一些读写案例,帮助学习。
362 0
|
缓存 Java
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
111 0
|
存储 缓存 Java
输入流--outputStream
输入流--outputStream
|
存储 Java API
输入流--InputStream
输入流--InputStream
|
文件存储
IO流的字节输入输出流(InputStream,OutputStream)及文件复制
字节输出流与文件字节输出流 文件存储原理和记事本打开文件原理 OutputStream及FileOutputStream import java.io.FileOutputStream; import java.io.IOException; /* java.io.OutputStream:字节输出
|
消息中间件 前端开发 JavaScript
InputStream 和 OutputStream 基础
大家好,我是指北君。 PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】
InputStream 和 OutputStream 基础