IO流--字节流

11 篇文章 0 订阅

IO:输入输出

流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输成为流,流的本质是数据传输。

IO流就是用来处理设备间数据传输问题的

常见的应用:文件复制,文件上传,文件下载

IO流分类:

按数据的流向:输入流(读数据)、输出流(写数据)

按数据类型:字节流、字符流(一般来说,我们说IO流的分类是按照数据类型来分的。)

那么这两种流都在什么情况下使用呢

如果数据通过Windows子代的记事本软件打开,我们还可以读懂里面的内容,就是用字符流,

否则使用字节流。如果你不知道该使用哪种类型的流,就是用字节流,因为字节流是万能的流。

如下图所示,我们通过记事本软件打开后,完全看不懂里面的内容是啥,这就是字节流。

字节流内容

//创建字节流输出对象(参数就是我们要写入数据的文件)

FileOutputStream fos = new FileOutputStream(name:"myByteStream\\fos.txt")

//释放资源(每次我们使用完流之后都要进行资源的释放)

fos.close();

//一次写一个字节数据void write(int b )(该方法是向文件中写入数据)

fos.write(99);

fos.write(98);

fos.write(97);

//我们在文件中得到的结果为cba

// 一次写一个字节数组数据void write(byte[] b)

Byte [] bys ={97,98,99};

fos.write(bys);

Byte[] bys="abc".getBytes(); //返回字符串对应的字节数组

void write(byte [] b , int off , int len)一次写一个字节数组的部分数据

例:fos.write(bys,1,2)//从第二个字节开始读取两个长度的数据

字节流写数据的两个小问题:

1:字节流写数据如何实现换行呢?(下面是不同的操作系统的不同操作)

window:\r\n

linux:\n

mac:\r

2:字节流写数据如何实现追加写入呢?(如果第二个参数为true,则字节将写入文件的末尾而不是开头,从而实现追加写入

public FileOutputStream(Stringname,booleanappend)

第一个参数为写入文件的名称

 

//写数据

for(inti=0;i<10;i++){

fos.write("hello".getBytes());

fos.write("\r\n".getBytes());

}

异常处理

 //加入finally来实现释放资源
        FileOutputStream fos=null;
        try{
             fos = new FileOutputStream("idea_test\\fos.txt");
            fos.write("hello".getBytes());
        }  catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

字节流读取数据

 //一次读一个字符数据
        int ch;
        while ((ch=isr.read())!=-1){
            System.out.print((char)ch);
        }
//一次读一个字符数组数据
        char [] chs = new char[1024];
        int len;
        while ((len=isr.read(chs))!=-1){
            System.out.println(new String(chs,0,len));
        }
     

复制文件

 //根据数据源创建字节输入流对象
        FileInputStream fis = new FileInputStream("某个文件夹");
        //根据数据源创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("某个文件夹");
        //读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)
        int by;
        while ((by=fis.read())!=-1){
            fos.write(by);
        }
/*        //一次读取一个字节数组,一次写入一个字节数组
        byte[] bys = new byte[1024];
        int len ;
        while ((len=fis.read(bys))!=-1){
            fos.write(bys,0,len);
        }*/
        //释放资源
        fis.close();
        fos.close();

字节缓冲流

BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用(也就是说我们可以一部分一部分的写进去)

BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。

构造方法:

字节缓冲输出流:BufferOutputStream(OutputStream out)

字节缓冲输入流:BufferedInputStream(InputStream in)

从上我们可以看到,构造方法需要的是字节流,而不是具体的文件或者路径。这是因为字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值