Java入门10(IO流)

这篇具有很好参考价值的文章主要介绍了Java入门10(IO流)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

IO流(input/output)

​ 数据运输的载体或者中间键

字节流

输入字节流(FileInputStream)

​ 以字节为最小单元,读取任何类型的文件,但是要注意字符集类型的转换。

public static void testFileInputStream(){
    // 获取文件对象
    File f = new File("文件绝对路径balabala");
    // 创建字节输入流
    try {
        FileInputStream fls = new FileInputStream(f);
        // 准备一个数组,用来接收一会从流中读取的数据
        byte[] data = new byte[(int)f.length()];
        // 将数据从流中读取,存储在字节数组中
        fls.read(data);
        // 遍历输出字节数组
        // 如果读取的是文本,那么文本在计算机底层存储的是字符集对应的编码,所以要及逆行强制转换
        for (byte b : data) {
            System.out.print((char)b);
        }
    }catch (IOException e){
        System.out.println("IO流异常");
    }
}

输出字节流(FileOutputStream)

​ 如果输出流在创建的时候,如果文件对象在磁盘中不存在,那么将自动创建一个相应文件

public static void testFileOutputStream(){
    File f = new File("文件绝对路径");
    try{
        // 创建字节输出流,默认是覆盖,而不是拼接内容
        // 覆盖:
        FileOutputStream fos = new FileOutputStream(f);
        // 拼接:
        // FileOutputStream fos = new FileOutputStream(f,true);
        
        // 在Java中准备一个数据,用于数据的输出(test01)
        byte[] data = "test01".getBytes();
        // 向文件写入。。。
        fos.write(data);
        // 在流使用完成之后进行关闭
        fos.close();
    }catch(IOException e){
        System.out.println("IO流异常!");
    }
}

字节流关闭(try with)

​ 在JDK1.7之后提供了try with语句块,如果在try with块中声明的对象,实现了AutoCloseable接口,那么这个对象会在try catch语句运行完成之后,进行资源的自动释放

// 修改后的文件输出流demo
public static void testFileOutputStream(){
    File f = new File("文件绝对路径");
    // JDK 在1.7之后提供了try with语句块
    // 如果在try with块中声明的对象,实现了AutoCloseable接口
    // 那么这个对象会在try catch语句运行完成之后,进行资源的自动释放
    try(FileOutputStream fos = new FileOutputStream(f,true);){
        // 在Java中准备一个数据,用于数据的输出(test01)
        byte[] data = "test02".getBytes();
        // 向文件写入。。。
        fos.write(data);
    }catch(IOException e){
        System.out.println("IO流异常!");
    }
}

字符流

​ 在读取数据的时候,会根据JVM定义的默认字符集,对读取的数据进行编码转换

字符输入流(FileReader)

public static void testFileReader(){
    File f = new File("文件绝对路径");
    try(FileReader fr = new FileReader(f)){
        char[] data = new char[(int)f.length()];
        fr.read(data);
        // 遍历字符数组: 如果文件中出现中文,那么文件的字节大小一定大于文件字符的数量,定义的data数组在读取完数据之后一定有空位
        // 遍历的时候要跳过这些空字符
        loop:for (char c : data) {
            if(c == '\u0000'){
                break loop;
            }
            System.out.print(c);
        }
    }catch(IOException e){
        System.out.println("IO流异常!");
    }
}

字符输出流(FileWriter)

public static void testFileWriter(){
    File f = new File("文件绝对路径");
    // 同样可以通过提供第二个参数来指定是覆盖还是补充目标文件
    try(FileWriter fw = new FileWriter(f)){
        char[] data = "这是一个测试样例\n".toCharArray();
        // 字符输出。。。
        fw.write(data);
    }catch(IOException e){
        System.out.println("IO流异常!");
    }
}

字符流和字节流的弊端

  1. 这两种流在读写的时候,分别以字符或字节作为单位,如果读取的文件过大,就会影响磁盘的IO(input,output)性能
  2. 为了避免过多的IO操作,我们建立了缓存的机制,在读取数据的时候,是一次性将较多的数据读取到硬盘当中,后续的读取都从缓存进行读取,直到缓存的数据读取完,在重新从硬盘读取数据
  3. 写入数据也是同样的道理,先将数据写到缓存中,再将缓存一次性提交
  4. 通过减少写入磁盘的次数达到提高效率的目的

缓存流

缓存输入流(BufferedReader)

public static void testBufferedReader(){
    File f = new File("文件绝对路径");
    // 先创建文件流对象,再通过文件流创建缓存流对象
    try(FileReader fr = new FileReader(f);BufferedReader br = new BufferedReader(fr)){
        // 一般来讲会使用readline方法进行整行读取
        // 整行读取的时候默认去掉行末的换行符
        String line = "";
        // 判断line是否为空,读取到了文件最后
        while((line = br.readLine())!=null){
            System.out.println(line);
        }
    }catch(IOException e){
        System.out.println("IO流异常!");
    }
}

缓存输出流(PrintWriter)

public static void testPrintWriter(){
    File f = new File("文件绝对路径");
    // 缓存输出再写入数据的时候,如果没有调用flush方法进行提交
    // 则会再JVM退出之前进行提交
    // 如果你添加了这个autoFlush参数,每写入一行数据,都会自动将缓存提交给硬盘
    try(FileWriter fw = new FileWriter(f,true);PrintWriter pw = new PrintWriter(fw,true)){
        // 缓存输出。。。
        pw.println("这是一个测试样例!");
    }catch(IOException e){
        System.out.println("IO流异常!");
    }
}

对象流

序列化&反序列化

​ 序列化:将Java对象转换为特殊的字节码,或者是字符串,用于存储或者传输

​ 反序列化:将特殊的字节码或者是字符串,还原成Java对象的过程

定义一个测试类

​ ⭐如果某个类可以被序列化,那么这个类一定要实现Serializable接口!

public class Student implements Serializable {
    // 如果某个类可以被序列化,那么这个类一定要实现Serializable接口
    private String name;
    private int age;
    // 如果类被序列化,类中必须有一个最终静态常量,如果后续类添加了成员变量,或者更新了方法,都必须就该版本号
    private static final long serialVersionUID = 1L;
}

对象流序列化(ObjectStream)

public static void testObjectStream(){
    // 创建一个对象,用来测试序列化,反序列化
    Student student01 = new Student("robot01",18);
    // 提供一个文件用于保存对象序列化之后的字节码
    File f = new File("文件绝对路径");
    // 创建对象流
    try(FileOutputStream fos = new FileOutputStream(f);ObjectOutputStream oos = new ObjectOutputStream(fos);
        FileInputStream fis = new FileInputStream(f);ObjectInputStream ois = new ObjectInputStream(fis);
    ){
        // 将学生对象序列化
        oos.writeObject(student01);
        // 将学生对象反序列化
        Student student02 = (Student)ois.readObject();
        System.out.println(student02);
    }catch(Exception e){
        System.out.println("IO流异常!");
    }
}

数据流

​ 数据流基于字节流实现,可以在存储和读取数据的时候,指定数据类型,数据输出流在输出数据时,会进行加密,只能用数据输入流进行读取文章来源地址https://www.toymoban.com/news/detail-461181.html

数据输入流(DataInputStream)

public static void testDataInputStream(){
    File f = new File("文件绝对路径");
    try(FileInputStream fis = new FileInputStream(f);DataInputStream dis = new DataInputStream(fis)){
        System.out.println(dis.readUTF());
        System.out.println(dis.readInt());
    }catch(Exception e){
        System.out.println("IO流异常!");
    }
}

数据输出流(DataOutPutStream)

public static void testDataOutPutStream(){
    File f = new File("文件绝对路径");
    try(FileOutputStream fos = new FileOutputStream(f);DataOutputStream dos = new DataOutputStream(fos)){
        dos.writeUTF("这是一个测试样例!");
        dos.writeInt(10086);
    }catch(Exception e){
        System.out.println("IO流异常!");
    }
}

(Demo)通过url实现Java文件下载以及文件批量下载

public static void testDownload(){
    // 提前定义变量,提升变量的作用域
    HttpURLConnection connection = null;
    InputStream is = null;
    FileOutputStream fos = null;
    try{
        String urlPath = "https://dldir1.qq.com/qqfile/qq/TIM3.4.7/TIM3.4.7.22084.exe";
        // 实例化url对象
        URL url = new URL(urlPath);
        // 基于url获取与目标服务器的连接
        connection = (HttpURLConnection) url.openConnection();
        // 根据连接对象获取用力啊接收下载数据的输入流
        is = connection.getInputStream();
        // 获取下载文件的文件名
        String downloadName = urlPath.substring(urlPath.lastIndexOf("/") + 1);
        // 创建对应的文件对象
        File f = new File("目的文件夹绝对路径 + \\" + downloadName);
        // 创建输出流对象
        fos = new FileOutputStream(f);
        // 这里不需要等待下载好,再输出,尝试边下载遍写入
        // 1. 准备一个字节数组作为一个缓存(1KB)
        byte[] buffer = new byte[1024];
        // 2. 通过输入流将数据读取到buffer这个作为缓存的字节数组中
        //    加入循环了n次,循环第1~(n-1)次时length=1024,循环第n次时,length<=1024
        //    当全部读完之后,length = -1 退出循环
        int length;
        while((length = is.read(buffer))!=-1){
            // buffer:输出数据的来源
            // off:表示从数组的哪一个下标开始读取
            // length:希望写入的字节数
            fos.write(buffer,0,length);
        }
        System.out.println("下载完成!");
    }catch(Exception e){
        e.printStackTrace();
    }finally {
        // 草率的关闭一下流以及连接
        try {
            is.close();
            connection.disconnect();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

到了这里,关于Java入门10(IO流)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux 服务器出现 Input/output error 处理

    今天突然出现 ls、ss 、 lsof 等命令报错 -bash: /bin/ss: Input/output error 其中有一个服务器上出现提示 *** System restart required *** Last login: Thu Sep 15 12:02:09 2022 from 192.168.0.135 .ssh/rc: 12: .ssh/rc: cannot create /var/log/zabbix-agent/ssh.log: Read-only file system reboot 之后,OK 另一个服务器上更严重 $ sudo

    2024年02月06日
    浏览(58)
  • verilog基础语法,wire,reg,input,output,inout

    概述: 输入输出是模块的端口,寄存器是数据存储介质,线用于把各个电路关联起来,形成一个数据流通通道,进行形成具有具体功能的电路模块。线是信息关联与传递的介质,也是可以称为信息流通的管道。在FPGA中的基本定义为wire,reg,input,output,inout。只有正确的认识到

    2024年04月24日
    浏览(44)
  • 零基础学习CANoe Panel(8)—— 开关/显示控件(Input/Output Box )

    🍅 我是 蚂蚁小兵 ,专注于车载诊断领域,尤其擅长于对CANoe工具的使用 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】 🍅 零基础学习CANoe Panel设计目录汇总,点击跳转👉 🍅 Input/Output Box 控件也是一个常用控件,用来作为 单行 输入和输

    2024年02月12日
    浏览(62)
  • Linux 磁盘坏块修复处理(错误:read error: Input/output error)

    当磁盘出现坏块时,你对所关联的文件进行读取时,一般会出现 read error: Input/output error 这样的错误。 反过来讲,当你看到 read error: Input/output error 这种错误时,很大可能就是磁盘出现了坏块问题。 解决步骤: 1、检测磁盘 我这个磁盘就出现了8个坏块,其中 /dev/sda 是你的磁

    2024年01月17日
    浏览(46)
  • 对set_input_delay和set_output_delay的理解

    前言 在FPGA设计中,端口约束分为两种,一种是管脚约束,及时把顶层模块的端口 port 与板卡上的物理引脚进行映射。另一种就是IO端口延时约束,目的是告诉时序分析工具信号在器件之外的延时,让它能够在一个完整的路径上进行分析,此外还要注意端口延时约束并不具有让

    2024年02月16日
    浏览(45)
  • nohup 命令之 nohup: ignoring input and appending output to ‘nohup.out’

    当我在linux中使用nohup 命令的时候,出现了这个错误: nohup  英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。 nohup  命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup

    2023年04月09日
    浏览(39)
  • SpringBoot整合Redis:java.io.IOException: 远程主机强迫关闭了一个现有的连接。或者控制台报连接超时异常

    场景: 项目启动过后 Redis 连接过一会就会断开,报如下问题: 问题1: 问题2: 问题3: 一、解决 1、设置连接空闲超过 N(秒或毫秒)后关闭,0为禁用:redis.timeout: 60s(这里设置和tcp-keepalive的值一致) 2、设置 redis 服务端的配置文件 redis.conf 中 tcp-keepalive 的时间为60(单位秒

    2024年02月13日
    浏览(41)
  • linux 中的 nohup 命令(设置后台进程): nohup: ignoring input and appending output to ‘nohup.out’

    Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 在程序结尾来让程序自动运行。 比如我们要运行weblogic在后台: ./startWebLogic.sh 但是加入我们很多程序并不象weblogic一样做成守护进程,可能我们的程序只是普通程序而已,一般这种程序使用 结尾。 但是如果终端关

    2024年02月04日
    浏览(46)
  • 【Java从入门到大牛】IO流下篇

    🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Java从入门到大牛 🌠 首发时间:2023年8月31日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 🌟 一以贯之的努力 不得懈怠的人生 FileReader(文件字符输入流) 作用:以内存为基准,可以把文件中的数据以字符的形式读入到

    2024年02月10日
    浏览(38)
  • java基础入门-19-【IO(字节流&字符流)】

    生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。 我们把这种数据的传输,可以看做

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包