JavaSE 面向对象程序设计进阶 IO流 字节流详解 抛出异常

input output 像水流一样读取数据

存储和读取数据的解决方案

内存中数据不能永久化存储 程序停止运行 数据消失

File只能对文件本身进行操作 不能读写文件里存储的数据

读写数据必须要有IO流

可以把程序中的数据保存到文件当中

还可以把本地文件中的数据读取到数据当中

分类

流的方向

输入流 读取

输出流 写出

操作文件类型

字节流 操作所有类型的文件

字符流 只能操作纯文本文件

纯文本文件时用微软自带的记事本打开能读的懂的文件

基本用法

写一段文字到本地文件当中

需要把文件放到包下 先创建文件

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

public class Main {
    public static void main(String[] args) throws IOException {//抛出异常
        //本地文件
        FileOutputStream fos=new FileOutputStream("untitled1\\a.txt");
        fos.write(97);//父类异常
        fos.close();//释放资源
    }
}

创建对象时 会根据路径让程序和文件产生通道

之后我们即可以进行数据的传输

当使用了close方法后 相当于切断了通道

写出数据的细节

创建字节输出流对象

1.参数是字符串表示的路径或者是File对象都是可以的

2.如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

3.如果文件已经存在,则会清空文件

写数据

1.write 方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

97 -> a

100 -> d

释放资源

是IO流中每一种流都要使用

每一次使用完流后,都要释放IO流

如果不释放流

会显示,操作无法完成,文件已经在Java Platform SE binary中打开

释放资源就是解决了资源的占用

总结

字节输出流FileOutputStream

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        FileOutputStream f=new FileOutputStream("untitled1\\a.txt");
        byte arr[]=new byte[]{97,98,99};
        f.write(arr,1,2);
        f.close();
        
        //文件中是bc
    }
}

写出数据的几个问题

1.把字符串写入文件

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        FileOutputStream f=new FileOutputStream("untitled1\\a.txt");

        String str="Dduo";

        String s=new String("Dduo");

        byte[] bytes = str.getBytes();
        //把字符串获取成字节数组

        f.write(bytes);

        f.close();
    }
}

window系统

\r 表示回车

\n 表示换行

Linux系统

\n换行

Mac系统

\r换行

在window操作系统中,java对换行进行了优化,虽然完整的是\r\n,但是我们写其中一个\r或者\n

java也可以实现换行,因为java在底层会进行补全

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        FileOutputStream f=new FileOutputStream("untitled1\\a.txt");

        String s1=new String("Dduo");
        byte[] bytes1 = s1.getBytes();
        f.write(bytes1);
        
        String s2=new String("\r\n");
        byte[] bytes2 = s2.getBytes();
        f.write(bytes2);

        String s3=new String("666");
        byte[] bytes3 = s3.getBytes();
        f.write(bytes3);

        f.close();
    }
}

创建对象时第二个参数就是续写开关

默认数值是false 表示关闭续写 此时创建对象会清空文件

手动传递true表示打开续写,此时创建对象的时候不会清空文件

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        while(true){
            FileOutputStream f=new FileOutputStream("untitled1\\a.txt",true);

            String s1=new String("Dduo666");
            byte[] bytes1 = s1.getBytes();
            f.write(bytes1);

            String s2=new String("\r\n");
            byte[] bytes2 = s2.getBytes();
            f.write(bytes2);

            f.close();
        }
    }
}

这样会输出44万行 直到文本文档的大小达到2.56MB

小结

字节输入流FileInputStream

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

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        //创建对象
        FileInputStream fis=new FileInputStream("untitled1\\a.txt");

        //读取数据
        int b1 = fis.read();
        System.out.println((char) b1);

        fis.close();
    }
}

read方法负责读取文件当中的数据

如果读不到了 返回-1

写入数据的细节

如果文件不存在就会直接报错

Java为什么会这么设计呢

输出流:不存在,创建

输入流:不存在,报错 因为创建出来的数据是没有数据的没有任何意义 这种逻辑没有意义

读取数据

一次读一个字节

读出来的数据是在ASCII上对应的数字

读到文件末尾了,read方法返回的是-1

如果是空格 则读取空格所对应的ASCII码30

如果是负数 则会先读取符号 不会当做一个整体

释放资源

每一次使用完流必须要释放资源

字节输入流循环读取

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

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        //创建对象
        FileInputStream fis=new FileInputStream("untitled1\\a.txt");
        int b;
        while((b=fis.read())!=-1) System.out.print((char) b);
    }
}

定义一个变量b

read方法表示读取数据。并且读取一次就移动一次指针

和迭代器相似

所以要用第三方变量接收

文件拷贝 (挨个字节拷贝)

拷贝文件夹到指定的文件当中

先开的流最后关闭

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

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        long start=System.currentTimeMillis();
        //写入
        FileOutputStream fos=new FileOutputStream("untitled1\\a.txt");

        //读取
        FileInputStream fis=new FileInputStream("untitled1\\b.txt");

        int b;
        while((b=fis.read())!=-1) fos.write(b);

        long end=System.currentTimeMillis();//获取当前系统的时间

        System.out.println("运行时间为:"+(end-start));

        //先开的流最后关
        fis.close();
        fos.close();

    }
}

FileInputStream读取的问题

拷贝一次只能读写一个字节

速度太慢了

可以用字节数组

一次读一个字节数组的数据,我们要尽可能将字节数组填满

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

public class Main {
    public static void main(String[] args) throws IOException {

        Scanner sc=new Scanner(System.in);

        long start=System.currentTimeMillis();

        //读取
        FileInputStream fis=new FileInputStream("untitled1\\b.txt");

        //创建字节数组
        byte []bytes=new byte[7];
        System.out.println(fis.read(bytes));
        System.out.println(new String(bytes));

        long end=System.currentTimeMillis();

        System.out.println("运行时间为:"+(end-start)+"毫秒");

        //先开的流最后关
        fis.close();

    }
}

输出结果是7个字节

其中换行回车一共是2个字节 一个英文字母是一个字节

如果越界了 读取不到东西 数组元素就不会改变

read方法如果读取不到数据就会返回-1

文件拷贝代码改写

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

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        long start=System.currentTimeMillis();
        //写入
        FileOutputStream fos=new FileOutputStream("untitled1\\a.txt");

        //读取
        FileInputStream fis=new FileInputStream("untitled1\\b.txt");

        int b;
        byte []bytes=new byte[1024*1024*5];
        while((b=fis.read(bytes))!=-1) fos.write(bytes,0, b);

        long end=System.currentTimeMillis();//获取当前系统的时间
        System.out.println("拷贝成功");
        System.out.println("运行时间为:"+(end-start));


        //先开的流最后关
        fis.close();
        fos.close();

    }
}

后两个参数是防止读取不到东西导致把上一次存入字节数组的数据又写入文件

try...catch异常处理

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

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        long start=System.currentTimeMillis();//获取当前系统的时间

        FileOutputStream fos=null;
        FileInputStream fis=null;

        try {
            //写入
            fos=new FileOutputStream("untitled1\\a.txt");

            //读取
            fis=new FileInputStream("untitled1\\b.txt");

            int b;
            byte []bytes=new byte[1024*1024*5];
            while((b=fis.read(bytes))!=-1) fos.write(bytes,0, b);

            long end=System.currentTimeMillis();//获取当前系统的时间
            System.out.println("拷贝成功");
            System.out.println("运行时间为:"+(end-start)+"毫秒");


        } 
        catch (IOException e) {
            throw new RuntimeException(e);
        } 
        finally {
            if(fos!=null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fis!=null)
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //先开的流最后关
        }
    }

代码复杂

我们需要学习一下设计思想

释放资源过于复杂

AutoCloseable接口

以后所有的异常我们都是抛出处理

个人号推广

博客主页

朱道阳-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/790603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初学SpringMVC之 RestFul 风格、重定向和转发

RestFul 风格改变 URL 形式 比如之前是:http://localhost:8080/add?a1&b2 现在是:http://localhost:8080/add/a/b(全是斜杠) package com.demo.controller;import org.springframework.stereotype.Controller; import org…

ChatTTS的爆火是必然,它正在重新定义我们与机器对话的方式

当AI技术与语音合成相遇,开源技术众多,为什么 ChatTTS 能够一夜爆火?你有听说过能说情感真切文字的 AI 吗? 前言 想象一下,你只需输入一句话,AI就能念得声情并茂,不仅支持中英文混读&#xff0…

Webpack安装以及快速入门

3 Webpack 1 什么是Webpack https://webpack.js.org/ (官网) webpack 是一个现代 javascript 应用程序的 静态模块打包器 (module bundler) 待会要学的 vue-cli 脚手架环境, 集成了 webpack, 所以才能对各类文件进行打包处理 webpack是一个 静态模块 打包器,可以做以下的这…

一文彻底搞懂性能测试

性能测试概念 我们经常看到的性能测试概念,有人或称之为性能策略,或称之为性能方法,或称之为性能场景分类,大概可以看到性能测试、负载测试、压力测试、强度测试等一堆专有名词的解释。 针对这些概念,我不知道你看到的…

牛刀小试--下三角对称矩阵压缩存储

解析博客: 矩阵存储和特殊矩阵的压缩存储_n阶对称矩阵压缩-CSDN博客 函数功能: //为N阶下三角矩阵初始化成的一维数组分配空间 void Init_triangular_matrix(int *&matrix); //返回二维下三角矩阵的值(压缩存取) int get_Value_triangular_matrix(int matrix[],int x,int …

Canvas:实现在线画板操作

想象一下,用几行代码就能创造出如此逼真的图像和动画,仿佛将艺术与科技完美融合,前端开发的Canvas技术正是这个数字化时代中最具魔力的一环,它不仅仅是网页的一部分,更是一个无限创意的画布,一个让你的想象…

谷粒商城学习笔记-22-分布式组件-SpringCloud-OpenFeign测试远程调用

文章目录 一,OpenFeign的简介二,OpenFeign的使用步骤1,场景说明2,引入依赖2,开启OpenFeign3,编写Feign接口4,使用feign调用远程接口5,验证 错误记录 上一节学习了注册中心&#xff0…

Linux-shell编程入门基础

文章目录 前言Shell编程bash特性shell作用域变量环境变量$特殊变量$特殊状态变量 $特殊符号(很重要)其他内置shell命令shell语法的子串截取统计 指令执行时间练习shell特殊扩展变量父子shell的理解内置和外置命令区别 数值计算双括号(())运算letexprexpr模式匹配 bcawk中括号 s…

ts语法---泛型和泛型约束

泛型 泛型,动态类型,是一个初始化不明确的类型,类似于函数中的形参(不明确参数值), 泛型一般用在function定义函数时动态约束类型,和type定义类型时动态约束类型, 泛型一般使用任…

Jenkins教程-18-常用插件-description-setter

上一小节我们学习了Jenkin常用插件Environment Injector的使用方法,本小节我们讲解一下Jenkin常用插件description-setter的使用方法。 在某些情况下,用户可能希望根据构建过程中的某些关键信息来自定义构建的描述,比如部署的用户信息、提交…

​李白一生的过往轨迹矢量地图

今天我们来看一下“天子呼来不上船,自称臣是酒中仙”大诗人李白过往轨迹,看看他一生都去过哪些地方? 我们将李白一生去过的地方搜集整理了一份矢量地图,有需要请在文末查看该数据的领取方法。 李白一生的过往轨迹 李白&#xf…

stm32按键设置闹钟数进退位不正常?如何解决

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

JavaScript-日期对象

日期对象 作用:用来表示时间的对象 获取当前时间 const datenew Date();console.log(date);可以得到日期对象,里面的属性有星期,年月日,时分秒 获取指定时间 const datenew Date(2023-05-01);console.log(date); 获取时间戳 时间…

Deepspeed : AttributeError: ‘DummyOptim‘ object has no attribute ‘step‘

题意:尝试在一个名为 DummyOptim 的对象上调用 .step() 方法,但是这个对象并没有定义这个方法 问题背景: I want to use deepspeed for training LLMs along with Huggingface Trainer. But when I use deepspeed along with trainer I get …

实习记录3

1.Mybaits懒加载 MyBatis 延迟加载(懒加载)一篇入门-腾讯云开发者社区-腾讯云 (tencent.com) 2.高级映射 106-高级映射之多对一映射第一种方式_哔哩哔哩_bilibili 3.TableId(type IdType.INPUT) Mybatis-plus 主键生成策略_mybatis-plus 自增主键等于…

和鲸科技荣耀入选2024 H1 「中国最具价值 AGI 创新机构 TOP 50」

以下文章来源于Founder Park,作者Founder Par 大模型的盛宴,不应该只属于那些无数光环加身的算法天才们。 模型的冰山一角下,是应用层的暗流涌动,这是一个更庞大,也更隐秘的蓝海。但发掘这一切的前提是,所…

redis哨兵模式搭建

先搭建主从结构 当需要运行多个Redis实例时,可以通过为每个实例使用不同的配置文件的方式来实现。 复制redis目录下的redis.conf文件将其重命名为redis6380.conf和redis6381.conf,或者将其放到单独文件夹中,这里为了偷懒,简单实现…

使用 MinIO 赢得 RAG 权利

人们常说,在人工智能时代,数据是你的护城河。为此,构建生产级 RAG 应用程序需要合适的数据基础架构来存储、版本控制、处理、评估和查询构成专有语料库的数据块。由于 MinIO 采用数据优先的 AI 方法,因此对于此类项目,…

TotalSegmentator---针对CT/MRI数据的自动分割

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享开源软件TotalSegmentator,该开源项目针对CT/MRI数据类型,对主要的解剖学结构进行自动分割,并且被集成到MITK中。希望对各…

Global Mapper:地理信息的温柔探索

引言 在这纷繁复杂的世界里,地理信息系统(GIS)如同一把利器,帮助我们剖析、理解和改造这个世界。而在众多GIS软件中,Global Mapper无疑是其中的佼佼者。作为一款功能全面且易于使用的GIS应用程序,Global M…