• 文件输入输出处理(二)-字节流


    大佬的理解->《Java IO(三) -- 字节流》 

    1、FileInputStream

    1.1 初始化

    FileInputStream(String name)
    FileInputStream(File file)
    //直接通过文件地址初始化
    FileInputStream fis = new ileInputStream("D:/test/test1.txt");
    
    //通过File对象初始化
    File file = new File("D:/test/test1.txt");
    FileInputStream fis = new FileInputStream(file)
    

    1.2 获取文件大小

    available()

    FileInputStream fis = new ileInputStream("D:/test/test1.txt");
    fis.available(); //文件大小
    

    1.3 读取文件内容

    read() 读取一个字节(返回对应字节的ascii码值)
    read(byte b[]) 根据字节缓冲数组的长度,进行读取(返回读取的字节数)

    read()

    //文件 D:/test/test1.txt 
    内容
    KH96abcdefghijk
    
    FileInputStream fis = new ileInputStream("D:/test/test1.txt");
     while (true){
         //read() 方法:从输入流对象中,一次读取一个字节(返回的是对应字节的ascii码值,int类型)
         int hasRead = fis.read();
    
         //当读取到末尾,返回-1,代表文件读取结束
         if(hasRead == -1){
             break;
         }
    
         System.out.print((char) hasRead); 
         //打印文件中字符的ascii值
         //转化为字符:KH96abcdefghijk
     }
    
     //最后一定要关闭资源
     fis.close();
    

    运行结果:

    源文件的大小:15
    KH96abcdefghijk
    

    read(byte b[])

    带缓冲字节数,读取文件内容,一次读取就不是一个字节,而是根据字节缓冲数组的长度,进行读取
    

    错误案例

    读取时通过read()来判断是否继续循环,读取到错误值

    FileInputStream fis = new ileInputStream("D:/test/test1.txt");
    //带缓冲字节数,根据字节缓冲数组的长度,进行读取
    byte[] bytes = new byte[5];
    //容易出错的判断方式:read()方式执行一次,就读取一个字节(没有保存,读完就扔,字节丢失),不可以作为判断条件
    while(fis.read() != -1){
        //循环读取内容
        //带缓冲数组的读取,方法返回的是读取的字节数,不是读取的内容
        //每次读取的数据,是由缓冲字节数组长度决定,每次都是从上一次读取的位置后开始继续读取,每次都是将读取的内容依次放入缓存数组
        int hasRead = fis.read(bytes);
        System.out.println("读取的字节数:"+hasRead);
        System.out.println(new String(bytes));
        System.out.println("读取文件成功");
    }
    fis.close();
    

    运行结果:

    源文件的大小:15
    读取的字节数:5
    H96ab       //K丢失
    读取文件成功
    读取的字节数:5
    defgh        //c丢失
    读取文件成功
    读取的字节数:2
    jkfgh        //i丢失,并且还多出了上一次留下 dgh,这是因为没有读满缓冲字节数组,而造成的读取上一次的值
    读取文件成功
    

    正确案例

    因为带字节缓冲数组返回的时读取到的长度,所以,用读取到的长度来判断是否要继续读取,和要写入多少个字节

    FileInputStream fis = new ileInputStream("D:/test/test1.txt");
    //带缓冲字节数,根据字节缓冲数组的长度,进行读取
    byte[] bytes = new byte[5];
    //正确写法
    int hasRead = 0;
    while((hasRead = fis.read(bytes)) > 0){
        //每次读取的内容
        System.out.println(new String(bytes,0,hasRead));
    }
    fis.close();
    

    运行结果:

    源文件的大小:15
    KH96a
    bcdef
    ghijk
    // 没有丢失字节
    

    1.4 资源关闭

    close();

    ​ 在使用流资源的时候一定要关闭资源,否则会造成资源浪费;

    放在try( ) 里面

    ​ JDK1.7以后,只需将资源初始化放在try()里面就可以不用手动关闭流资源;

    2、FileOutputStream

    2.1初始化

    FileOutputStream(File file)
    FileOutputStream(File file, boolean append)
    FileOutputStream(String name)
    FileOutputStream(String name, boolean append)

    与FileInputStream类似,不过写入的文件不一定要存在,如果文件不存在,会自动创建一个空的文件;

    2.2 写入方式 boolean append

    boolean append 使用否以追加方式方式写入;

    false(默认值,覆盖)
    true(追加)
    

    2.3 写入文件内容

    String string = "KH96班,正在学习文件输出流,输出文件2";
    //File file = new File("D:/test/test2.txt");
    
    //JDK1.7以后,只需将资源初始化放在try()里面就可以不用手动关闭流资源,推荐使用;
    try(FileOutputStream fos =  new FileOutputStream("D:/test/test2.txt",true)){
    
        //将字符串转成字节数组,写入目标文件
        fos.write(string.getBytes());
    
        //手动刷新缓冲区
        fos.flush();
        
    }catch (IOException e){
        e.printStackTrace();
    }
    
  • 相关阅读:
    5G高可靠低时延通信标准现状及产业进展
    单页vue 列表图片懒加载 vue-lazyload 、html5
    如何计算Bert模型的参数量
    mybatis异常:Invalid bound statement (not found): com.lm.mapper.ArticleMapper.list
    SAP FI 系列 (035) - 应收票据的接收和承兑方法二
    我的数学学习回忆录——一个数学爱好者的反思(一)
    java Spring Boot2.7写一个接口 提供图片预览 前端可以直接用接口地址当src为图片地址使用
    恶意代码可视化检测技术研究综述
    python学习笔记——字典
    dpdk实现dns
  • 原文地址:https://www.cnblogs.com/xiaoqigui/p/16390035.html