字节流OutputStream和InputStream

日常学习总结,方便后期查阅,喜欢的点赞收藏!!!

字节流


一切文件数据(文本、图片、视频等)在存储时,都以字节形式存储的。

字节输出流和字节输入流
OutputStream和InputStream

1.字节输出流【OutputStream】

java.io.OutputStream抽象类是表示字节输出流的所有类的超类.
方法:
public void close() :关闭此输出流并释放与此流相关联的任何系统资源。  
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。  
public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。  
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。  
public abstract void write(int b) :将指定的字节输出流。

由于OutputStream为抽象类不用直接使用:常用它的实现类FileOutputStream来操作

FileOutputStream的构造方法:
public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。 
public FileOutputStream(String pathName): 创建文件输出流以指定的名称写入文件。

注意:当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件,如果有这个文件,会清空这个文件的数据。
  代码:

package OutputStream;

import java.io.FileOutputStream;
import java.io.IOException;

public class Demo01 {
    public static void main(String[] args) throws IOException {
//        两种构造方法
//        FileOutputStream outStream = new FileOutputStream(new File("dir/test.txt"));
//注意再路径正确的情况下,如果文件不存在会被直接创建出来
        FileOutputStream outStream = new FileOutputStream("dir/test.txt");
        //将内容写出
        outStream.write(97);//a
        outStream.write(98);//b
        //关流
        outStream.close();

    }
}

结果:

package OutputStream;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo02 {
    public static void main(String[] args) throws IOException {
        //创建对象
        FileOutputStream out = new FileOutputStream("dir/file.txt");

        //写出内容
        byte [] buf ={97,98,99,100};

//        public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
        out.write(buf);
        out.write("\r\n".getBytes());//换行
//        public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
        out.write(buf,0,1);

        //关流
        out.close();


    }
}

结果:

上面的写入都是清空之前的内容,再写入对应的内容,是否可以追加写再之前的文本上继续添加内容呢?

数据追加续写

public FileOutputStream(File file, boolean append)  创建文件输出流以写入由指定的 File对象表示的文件。  
public FileOutputStream(String name, boolean append)  创建文件输出流以指定的名称写入文件。 

再创建对象是开启续写即可

代码:

package OutputStream;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo03 {
    public static void main(String[] args) throws IOException {
        //开启续写
        FileOutputStream outputStream = new FileOutputStream("dir/file.txt",true);
        //输出内容
        outputStream.write("\r\n".getBytes());
        outputStream.write("续写是否可以".getBytes());
        outputStream.write("\r\n".getBytes());
        outputStream.write(99);
        //关流
        outputStream.close();
    }
}

代码执行两次的结果:

输出流的换行符:

Windows系统里,每行结尾是 回车+换行 ,即\r\n;
Unix系统里,每行结尾只有 换行 ,即\n;
Mac系统里,每行结尾是 回车 ,即\r

获取最佳换行符:String ls = System.lineSeparator(); 

package OutputStream;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo04 {
    public static void main(String[] args) throws IOException {
        FileOutputStream out = new FileOutputStream("dir/test1.txt");
        String s = System.lineSeparator();
        out.write(65);
        out.write(s.getBytes());//换行
        out.write(66);
        out.write(s.getBytes());//换行
        out.write(67);

    }
}

结果:

输出流的基本使用步骤:
1.创建对象(指定路径和文件名称)
2.写内容(write)
3.关流

2.字节输入流【InputStream】

字节输入流【InputStream】是抽象类,此抽象类是表示字节输入流的所有类的超类
方法:
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。    
public abstract int read(): 从输入流读取数据的下一个字节。 
public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中

实现类:java.io.FileInputStream类是文件输入流,从文件中读取字节。
FileInputStream 用于读取诸如图像数据之类的==原始字节流==,要读取字符流,请考虑使用FileReader。

构造方法:
FileInputStream(File file):通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。 
FileInputStream(String pathname):通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。 

注意:当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException输出流,没有文件直接创建,输入流读取文件如果不存在就不会创建文件,而会报错。

int read() :一次读取一个字节,并将读取的字节数据以int形式返回,读取的文件末尾,会返回-1表示读取结束。

package InputStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //创建对象
//        FileInputStream inputStream = new FileInputStream(new File("dir/fieInput.txt"));
        FileInputStream inputStream = new FileInputStream("dir/fileInput.txt");
        //读取内容
        int len1 = inputStream.read();
        System.out.println("len1 = " + len1);
        int len2 = inputStream.read();
        System.out.println("len2 = " + len2);
        int len3 = inputStream.read();
        System.out.println("len3 = " + len3);
        int len4= inputStream.read();
        System.out.println("len4 = " + len4);
        int len5 = inputStream.read();
        System.out.println("len5 = " + len5);
        int len6 = inputStream.read();
        System.out.println("len6 = " + len6);
        //关流
        inputStream.close();

    }
}

结果:


 

1.读取文本的时候,读取的是存在文件中的字节数据,字节数据是字符对应的ASCII码值

2.图中可以看到已经读完了,但是还能一直读并且返回是-1。

3.上述代码冗余,开发不可能这样用

代码修改:

package InputStream;

import java.io.FileInputStream;
import java.io.IOException;

public class Demo02 {
    public static void main(String[] args) throws IOException {
        //创建对象
//        FileInputStream inputStream = new FileInputStream(new File("dir/fieInput.txt"));
        FileInputStream inputStream = new FileInputStream("dir/fileInput.txt");
        //读取内容

        int len;
        while ((len=inputStream.read())!=-1){

            System.out.println("读取内容:" + len);
        }
        //关流
        inputStream.close();

    }
}

已修正,但是开发中也不用此中方法。

public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中(效率高)

继续改造代码:

package InputStream;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

public class Demo03 {
    public static void main(String[] args) throws IOException {
        //创建对象
//        FileInputStream inputStream = new FileInputStream(new File("dir/fieInput.txt"));
        FileInputStream inputStream = new FileInputStream("dir/fileInput.txt");
        //读取内容

        int len;
        //定义数组,一次读取多少由数组大小决定
        byte[] buf=new byte[4];
        while ((len=inputStream.read(buf))!=-1){

            System.out.println("读取内容:" + Arrays.toString(buf));
        }
        //关流
        inputStream.close();

    }
}

结果:

这里用byte数组虽然效率可以,但是出现问题,继续改造代码:

package InputStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Demo04 {
    public static void main(String[] args) throws IOException {
        FileInputStream inputStream = new FileInputStream("dir/fileInput.txt");

        int len;
        byte[] buf = new byte[4];
        while ((len=inputStream.read(buf))!=-1){
            //offset为起始 length个字节变成字符串
            String content = new String(buf, 0,len);
            System.out.println("最终内容: " + content);
        }

        inputStream.close();

}
}

结果:


输入流的基本使用步骤:
1.创建对象(指定路径和文件名称)
2.写内容(read,需要用byte数组)
3.关流

3.利用输入输出流实现图片复制功能

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class InOutputStream {
    public static void main(String[] args) throws IOException {
//        1.创建输入输出流
        FileInputStream in = new FileInputStream("dir/1.png");
        FileOutputStream out = new FileOutputStream("tager/2.png");
//        2.边读边写
        byte [] buf = new byte[1024];
        int len;

        while ((len=in.read(buf))!=-1){
            out.write(buf,0,len);
        }
//        3.关流

        out.close();
        in.close();
    }
}

结果:

个人观点:代码都很简单,就是日常开发的时候操作流程可能会忘,日常都敲多看笔记。(更深一点的,可以参考我TCP通讯文章中的流的使用)

如对你帮助帮忙点赞收藏,谢谢!!!

下个章节总结字符流-Reader-Writer   !!!!

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值