Java基础18 read(byte[] b) read()区别 字节高效缓冲流

1.一次读取多个字节
public int read(byte[] b)
参数: 读取的字节存放到数组 数据类似于缓冲区
返回值:表示读取的有效的字节个数
2.代码

package day18;

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

public class Test04 {
    public static void main(String[] args) throws IOException {
        byte[] b = new byte[2];
        FileInputStream fis = new FileInputStream("E:\\admin01\\d.txt");
        //调用读的方法
        int leng = fis.read(b);
        System.out.println(new String(b));
        System.out.println(leng);
        int leng1 = fis.read(b);
        System.out.println(new String(b));
        System.out.println(leng1);
        int leng2 = fis.read(b);
        System.out.println(new String(b));
        System.out.println(leng2);
        int leng3 = fis.read(b);
        System.out.println(new String(b));
        System.out.println(leng3);
        int leng4 = fis.read(b);
        System.out.println(new String(b));
        System.out.println(leng4);
        //关闭资源
        fis.close();
    }
}

结果图
在这里插入图片描述
在这里插入图片描述
最后读取字节数组,不够时往回读,但返回的是准确的数字,当读完所有再读时返回-1;

一、字符缓冲流

1.BufferedInputStream 输入缓冲区流 读取 加快读取速度(高效流)
2.BufferedOutputStream 输出缓冲区流 写入 加快写入速度(高效流)
3.注意点:
BufferedInputStream 与BufferedOutputStream 没有读写的功能 只是对InputStream 与
OutputStream
的封装 提供了一个缓冲区的数组 加快读写操作的速度
4.构造方法
在这里插入图片描述
5.高效流 高效的原因

BufferedInputStream 高效流的底层提供了一个缓冲的数组 这个数组的长度是8127个字节
使用高效流进行读取的时候 一次读取8127的字节的数据放入到缓冲区的数组,再进行读取数据的时候
就从缓冲区中获取数据(内存中) 如果8127字节的数据全部读取完毕之后 又从新读取8127个字节
填入到
缓冲区中 可以避免反复与磁盘来进行交互 从内存中获取数据 数据会更加快 所以高效
BufferedOutputStream 高效的原因与上面的一样
理解:即再内存与磁盘交互之间 在内存中开辟一个专门读取的空间,这个空间与磁盘交互更快,这个空间一次读取8127个字节,内存往这个空间读取数据,数据不够时这个空间再去磁盘读取

package day18;

import java.io.*;

public class Test03 {
    public static void main(String[] args) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new
                File("E:\\admin01\\d.txt")));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new
                File("E:\\admin01\\b\\b.txt")));
        int leng =-1;
        while ((leng=bis.read())!= -1){
            bos.write(leng);
        }
        bos.close();
        bis.close();

    }
}


flush()与close()

1.flush() 刷新缓冲区 将缓冲区中的数据 刷入到硬盘中(文件)
2.close() 关闭的流资源
3.close() 在关闭流资源之前会自动调用flush() 方法
4.区别:
flush() 调用 之后 流资源可以正常的使用
close() 调用之后 流资源是不能正常使用
建议完成写入操作后都flush 一下
5.代码

package day18;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test02 {
    public static void main(String[] args) throws IOException {
          //高效读的流
         //BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("E:\\a\\下载.jpg")));
          //高效写的流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("E:\\admin01\\d.txt")));
          //读取
        // int leng =-1;
          // while ((leng= bis.read()) !=-1) {
                // bos.write(leng);
         // }
         // bos.flush();
         // bos.write("11111".getBytes());
         //关闭资源
        //一个类中第一次调用写入时会清空重输,第二次以及之后调用写入是添加内容
        bos.write("11111".getBytes());
        bos.flush();
        bos.write("2222".getBytes());
        bos.close();
         //bos.flush();
        //bos.close();
        // bis.close();
        // bos.write("11111".getBytes());
    }
}


关闭流资源

1.使用流资源异常的处理: 抛出 捕获
可以确定其异常的时候 使用捕获 程序不会停止运行 可以继续下面的代码
不能确定其异常的时候 就抛出异常 发生异常 程序就会停止运行
2.流资源的关闭
1.流资源应该是从下往上进行关闭
2.不管是否发生异常都需要关闭流资源 放在finally中关闭
3.关闭流资源的时候一定要进行非空判断
3.代码

package day18;

import java.io.*;

public class Test01 {
    public static void main(String[] args) {
        InputStream is = null;
        BufferedInputStream bis = null;
        OutputStream os = null;
        BufferedOutputStream bos = null;
        try {
            is= new FileInputStream("E:\\admin01\\d.txt");
            bis= new BufferedInputStream(is);
            os= new FileOutputStream("E:\\admin01\\b\\b.txt");
            bos= new BufferedOutputStream(os);
            int leng = -1;
            while ((leng = bis.read()) != -1) {
                bos.write(leng);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //从下往上关闭流资源
            try {
                if (bos !=null){
                    bos.close();
                }
                if(os !=null){
                    os.close();
                }
                if(bis !=null) {
                    bis.close();
                }
                if(is !=null) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

read(byte[] b) read()区别

1.read(byte[] b) 一次读取多个字节 效率高 read() 一次性读取一个字节 效率低
2.read() 返回的是读取的字节 read(byte[] b) 返回值是读取的有效的字节的个数
//用字节数组读取,才能正确解码中文,字符即char,字节即byte,char是字符类型,byte属于整数类型
//计算机用二进制(01)存储,一个0或1,表示一位,1bit; java中最小单位是字节byte,1B=8b,
//用read(b)字节数组读取,返回读取到字节的个数,读取到的字节存入字节数组 所以需要 byte [] b = new byte[1024];
//通过String构造方法使用utf-8编码格式 将字节数组解码转为字符串
//用read() 读取,返回的int类型,向上转型,int转为char使用Ascll码表 a 97 A 65 0 48
//byte转为char 使用的解码不是Ascll 只是0~127的字节默认对应ascll
// read()读取返回的int 因为byte范围是-128~127 有-1,java识别流的读取结束符号是-1,有冲突,
//将byte转为int类型,其读取范围变为0~255,结束返回-1;解决了冲突(byte类型的-1通过补0转为int类型的255)

重要代码理解

bos.write(“ablashdfkjhjadlfkasdfabb”.getBytes());
bos.flush();//刷入到内存和磁盘交互的缓冲区,bis 才能读取到,否则为空
BufferedOutputStream bos = null;//为了让finally 里的代码能够调用close()方法
int leng =-1;//读取用 while
while ((leng = bis.read()) !=-1){
list.add((char)leng);
}
while ((leng = bis.read(b))!=-1){
str = new String(b,0,leng);
}
//通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
bytes - 要解码为字符数组
offset - 要解码的第一个 byte 的索引
length - 要解码的 byte 数
s = str.split(" ")[0]; 将字符串str以空格分割为数组,数组0索引的数据赋值给s
io代码标准格式 看代码
完成写入操作后flush 一下
io对象先复制为null
try catch finally 结构
try里 再用if 判断是否不存在 不存在就创建
finall 里 再用try catch 结构关闭流,判断非空,关闭流,从代码下往上依次关闭

package day18.work;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Work02 {
    public static void main(String[] args) {
        File file = new File("E:\\admin\\2.txt");
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;

        try {
            if(!file.exists()){
                file.createNewFile();
            }
            bis = new BufferedInputStream(new FileInputStream(file));
            bos = new BufferedOutputStream(new FileOutputStream(file));
            bos.write("name=张三 age=12 psw=234".getBytes());
            bos.flush();
 
            byte [] b = new byte[1024];
            String str = "";
            int leng =-1;
            while ((leng = bis.read(b))!=-1){
                str = new String(b,0,leng);
        }
            /*List<Byte> list = new ArrayList<>();
            int leng=-1;
            while ((leng = bis.read())!=-1){
                list.add((byte)leng);
            }
            byte [] bytes = new byte[list.size()];
            for (int i = 0; i < list.size(); i++) {
                bytes[i] = list.get(i);
            }
            String str = new String(bytes,0,bytes.length);
            System.out.println(str);*/
            

            //对字符进行分割
            StringBuilder sb = new StringBuilder();
            //以空格进行分割
            String [] arrays = str.split(" ");
            for (String s : arrays) {
                // substring 两个参数包头不包尾 ,一个参数从参数索引开始截取后面所有
                // insexOf   返回第一次出现时的索引
                sb.append(s.substring(s.indexOf("=")+1)+" ");
            }
            System.out.println(sb);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                if(bis!=null){
                    bis.close();
                }
                if(bos!=null){
                    bos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

package day18.work;

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

public class Work03 {
    public static void main(String[] args) {
        File file = new File("E:\\admin\\d\\1.txt");
        File file1 = new File("E:\\admin\\2.txt");
        FileOutputStream os = null;
        FileInputStream is = null;
        FileOutputStream os1 =null;

        try {
            if(!file.exists()){
                File f = new File(file.getParent());
                f.mkdirs();
                file.createNewFile();
            }
            if(!file1.exists()){
                File f1 = new File(file.getParent());
                f1.mkdirs();
                file1.createNewFile();
            }
            os = new FileOutputStream(file);
            is = new FileInputStream(file);
            os1 = new FileOutputStream(file1);

            os.write("admin 12345".getBytes());
            os.flush();//完成写入操作后flush 一下,是个好习惯,但没有使用高效流 不写也可以
            byte [] b = new byte[1024];
            String str ="";
            int leng =-1;
            while ((leng=is.read(b))!=-1){
                //str = new String(b,0,leng);
                os1.write(b);
            }



        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                if(os1!=null){
                    os1.close();
                }
                if(is!=null){
                    is.close();
                }
                if(os!=null){
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值