Java研学-IO流(三)

news2024/12/23 14:22:39

六 字节流 – 字节输出流系列 OutPutStream体系

1 OutPutStream系列 – 字节输出流

// 表示字节输出流所有类的超类,输出流接受输出字节并将其发送到某个接收器
public abstract class OutputStream

FileOutputStream/BufferedOutputStream

2 FileOutputStream类设计

// 用于写入如图像数据的原始字节流,可实例化OutPutStream对象
public class FileOutputStream

// 当前路径下创建指定名字的文件
public FileOutputStream(String name)

// 例子
public class Test {
    public static void main(String[] args) {
        FileOutputStream fo=null;
        try {
            fo=new FileOutputStream("play2.txt");
            // public void write(byte[] bs)  写入字节数组
            // public void write(int b)  写入一个字节
            // public void write(byte[] bs,int start,int len)  写入字节数组,自指定位置始写指定长度
            fo.write(97);  // a
            fo.write("\r\n".getBytes());  // 换行
            fo.write("这里是一段文字通过字符串转换".getBytes(),0,12);
            // 这里是一 2字节1汉字
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fo!=null){
                try {
                    fo.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

  由于计算机中底层操作的都是字节数据,而OutputStream正好也是字节流,因此可以直接将数据写入到指定文件中,不需flush

3 BufferedOutputStream类设计 需flush

// 该类实现缓冲输出流,可直接向底层输入流写入字节
public class BufferedOutputStream

// 通过传递OutputStream实现类对象完成对文件的操作
public BufferedOutputStream(OutputStream out)

// 例子
public class Test {
    public static void main(String[] args) {
        BufferedOutputStream bo=null;
        try {
            bo=new BufferedOutputStream(new FileOutputStream("play.txt"));
            bo.write(66);
            bo.write("\r\n".getBytes());
            bo.write("烤鸡翅膀我最爱吃".getBytes(),0,12);
            // 烤鸡翅膀  1汉字2字节
            bo.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(bo!=null){
                try {
                    bo.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

  BufferedOutputStream不能直接将数据写入到指定文件中,因为其操作的是缓存区,需要将数据刷新到指定的文件中:,建议使用BufferedOutputStream操作字节流可降低内存资源的消耗

七 字节流 – 字节输入流系列 InputStream体系

1 InputStream系列 – 字节输入流

// InputStream 类设计
Class InputStream

FileInputStream/BufferedInputStream

2 FileInputStream类设计

// 用于读取图像等数据的原始字节流
public class FileInputStream

// 打开与实际文件的链接创建FileInputStream文件,由name命名读取文件中的数据,可实例化 InputStream类对象
public FileInputStream(String name)

// 例子
public class Test {
    public static void main(String[] args) {
        FileInputStream fi=null;
        try {
            fi=new FileInputStream("play.txt");
            int data=0;
            byte[] bs=new byte[1024*5];
            while ((data=fi.read(bs))!=-1){
                System.out.println(new String(bs,0,data));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fi.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

  一个汉字(包括数字)在UTF-8编码下占用3个字节,在GBK编码下占用2个字节。因此,如果4个汉字存储需要12个字节,那么可以推断出这些汉字是在UTF-8编码下存储的。具体存储方式是将每个汉字转换为UTF-8编码下的3个字节,共计12个字节存储。

3 BufferedInputStream类设计

// 直接操作缓存区降低内存消耗
public class BufferedInputStream

// 读取InputStream 参数实现类指定的文件,创建一个BufferedInputStream并保存其参数,内部缓冲区数组创建并存在buf
public BufferedInputStream(InputStream in)

// 例子
public class Test {
    public static void main(String[] args) {
        BufferedInputStream bi=null;
        try {
            bi=new BufferedInputStream(new FileInputStream("play.txt"));
            int data=0;
            byte[] bs=new byte[1024*5];
            while ((data=bi.read(bs))!=-1){
                System.out.println(new String(bs,0,data));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(bi!=null){
                    bi.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

字节流小结

  字节流高效流(带有Buffered缓存技术的流),没有像字符流那样提供高效的方法(newLine()和readLine());定义字节高效流的原因,就是操作缓存区代替直接操作系统底层,降低系统资源消耗;

八 例子

将指定盘符下的指定文件,复制粘贴到指定的盘符

public class FC {
    // 实现盘符下文件的读写操作,startName原文件名,endName目标文件名
    public void copy(String startName,String endName){
        // 分别定义两个字符高效流对象
        BufferedReader start=null;
        BufferedWriter end=null;
        try {
            // 分别实例化对象
            start=new BufferedReader(new FileReader(startName));
            end=new BufferedWriter(new FileWriter(endName));
            String data=null;
            while ((data=start.readLine())!=null){
                // 读一行写一行
                end.write(data);
                end.newLine();
                end.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 防止start.close();出现异常导致end.close();无法关闭
            // 关闭多个异常时需要分别关,关闭资源操作是没有顺序的
            if (start!=null){
                try {
                    start.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (end!=null){
                try {
                    end.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

九 序列化

1 流转换

在这里插入图片描述
开发中可使用更高效的替代品

InputStreamReader – System.in — Scanner

OutPutStreamWriter – System.out.print()

2 序列化与反序列化

① 序列化:指使用指定的技术(OutputStream流,ObjectOutputStream类),将对象中的数据(通过对象调用方法获取的结果),存储到指定的文件中(也就是写的过程),或通过网络上传的过程

② 反序列化:将指定文件中或网络上的对象中的数据获取到(也就是读操作InputStream流,ObjectInputStream类)

// 创建序列化对象
public class Dog implements Serializable {
	// 将序列化号固定为常量
    private static final long serialVersionUID=1L;
    // Serializable接口是一个声明接口,他没有任何抽象方法,但想实现序列化反序列化操作必须实现它
    private String name;
    private int kg;
    public  Dog(){
        super();
    }

    public Dog(String name, int kg) {
        super();
        this.name = name;
        this.kg = kg;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getKg() {
        return kg;
    }

    public void setKg(int kg) {
        this.kg = kg;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", kg='" + kg + '\'' +
                '}';
    }
}

// 序列化
public class DXTest {
    public static void main(String[] args) {
        // 声明序列化操作流对象
        ObjectOutputStream oo=null;
        try {
            oo=new ObjectOutputStream(new FileOutputStream("play.txt"));
            // 实例化需序列化的对象
            Dog yellow = new Dog("大黄",24);
            // public void writeObject(Object obj) 将序列化对象写入流中(需要flush)
            oo.writeObject(yellow);
            oo.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(oo!=null){
                try {
                    oo.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("成功上传");
        }
    }
}

// 反序列化
public class DFTest {
    public static void main(String[] args) {
        // 声明反序列化对象
        ObjectInputStream oi=null;
        try {
            oi=new ObjectInputStream(new FileInputStream("play.txt"));
            // public Object readObject() 将文件中的对象读出来 序列化对象接收是Object因此需要强转
            Dog yellow= (Dog) oi.readObject();
            System.out.println(yellow.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if(oi!=null){
                try {
                    oi.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

  上传数据(序列化),是将数据以字节码的形式存储到指定的文件中,打开文件之后,无法直接阅读,需要下载(反序列化)后才能阅读
  在类的序列化过程中,如果添加新的属性,需要再次进行序列化和反序列化,这样同步操作才能不报错,如果一个没做,就会出现类无效异常 java.io.InvalidClassException

// 其中 stream classdesc serialVersionUID = 4216129340136042751 是本地读取类的序列化号
// local class serialVersionUID = 8800134341386811038 是本次已经存在的序列化号
java.io.InvalidClassException: com.Test.Dog; local class incompatible: stream classdesc serialVersionUID = 4216129340136042751, local class serialVersionUID = 8800134341386811038

  读取就是反序列化操作;而已存在就是序列化操作,两个版本号不同就会出现异常
  为了避免异常的出现,序列化后版本号进行固定;一般在实现序列化接口后,在类中(Dog类)将序列化号直接定义为常量

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统-文件管理

文件的属性 文件名:由创建文件的用户决定文件名,主要说为了方便用户找到文件,同一个目录下不允许有重名文件。 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分…

Linux删除了大文件为什么磁盘空间没有释放?

某天,收到监控系统的告警信息,说磁盘空间占用过高,登上服务器,使用 df -h 一看,发现磁盘占用率已经 96%了: 通过查看 /usr/local/nginx/conf/vhost/xxx.conf 找到 access_log 和 error_log 的路径&#x…

【每日一题】找出叠涂元素

文章目录 Tag题目来源题目解读解题思路方法一:哈希表 写在最后 Tag 【哈希表】【数组】【2023-12-01】 题目来源 2661. 找出叠涂元素 题目解读 从左往右遍历 arr 给矩阵 mat 上色,在上色的过程中矩阵的某一行或者某一列的全部被上色了,返回…

Java中实现HTTPS连接的最佳实践

引言 大家好!我是小黑。今天咱们来聊聊一个既热门又实用的话题:在Java中如何实现HTTPS连接。现在的网络世界,安全性是大家都非常关注的问题,特别是对于咱们这些程序员来说,更是如此。想想看,如果你的网站或…

AI创作ChatGPT源码+AI绘画(Midjourney绘画)+DALL-E3文生图+思维导图生成

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

Java实战案例————ATM

需求分析 首先ATM银行系统包括两个基础大功能:开户和登陆账户(当然在系统中没有一个账户时不能登录,需要先开户)。 一名用户有6项基本信息描述:姓名、性别、银行卡号、银行卡密码、账户余额、取款限额。 在登录账户…

独家揭秘:卢松松拍摄视频背后的创作过程

我是卢松松,点点上面的头像,欢迎关注我哦! 一条视频刚刚发几分钟,有个粉丝就过来评论说: 抛开广告性,越来越有感觉了。 于是今天的这篇文章就来了,也顺便给大家分享下近期我拍视频、编辑视频的…

css实现最简单的3d透视效果,通过旋转可以直观感受到

css的3d效果还是非常复杂的,我今天简单学习了一下入门,实现了一个超级简单的效果,帮助我自己理解这个3d的过程,实现的效果动画如下:可以通过调整父元素旋转的角度,更加直观的感受这个3d效果: 实…

解决Wireshark分析RTMP抓包时Unknown问题

使用Wireshark抓包时,经常出现很多Unknown包,但实际上的字节流实际是正常的。 其实,RTMPT设置里有一个最大包大小的设置,默认是32768,而且默认RTMPT协议配置了从多个TCP流中重组RTMPT的功能(应当是考虑基于HTTP的传输…

基于java+swing+mysql五子棋小游戏(含实训报告)

基于javaswingmysql五子棋小游戏(含实训报告) 一、系统介绍二、功能展示四、其它1.其他系统实现五.获取源码 一、系统介绍 一、实验目的 1、熟练掌握基本网络编程技术。 2、掌握Swing图形用户界面编程。 3、掌握多线程编程的基本原理,能使用…

【并发编程】什么是死锁?死锁如何解决?线上发生死锁应该怎么办?

📫作者简介:小明Java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

Simple_SSTI_1-WEB-bugku-解题步骤

——CTF解题专栏—— 声明:文章由作者weoptions学习或练习过程中的步骤及思路,非正式答案,仅供学习和参考。 题目信息: 题目:Simple_SSTI_1 作者:valecalida 提示:无 场景: 解题…

面试数据库八股文十问十答第一期

面试数据库八股文十问十答第一期 作者:程序员小白条,个人博客 1.MySQL常见索引、 MySQL常见索引有: 主键索引、唯一索引、普通索引、全文索引、组合索引(最左前缀)主键索引特点:唯一性,非空,自增(如果使用…

Azure Machine Learning - 使用 REST API 创建 Azure AI 搜索索引

本文介绍如何使用 Azure AI 搜索 REST AP和用于发送和接收请求的 REST 客户端以交互方式构建请求。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员&…

Python zip函数及用法与lambda表达式及用法

Python zip函数及用法 zip() 函数可以把两个列表“压缩”成一个 zip 对象(可迭代对象),这样就可以使用一个循环并行遍历两个列表。为了测试 zip() 函数的功能,我们可以先在交互式解释器中“试验”一下该函数的功能。 >>&g…

自定义类型-结构体,联合体和枚举-C语言

引言 能看到结构体,说明C语言想必学习的时间也不少了,在之前肯定也学习过基本数据类型,包括整型int,浮点型float等等。可是在日常生活中,想要描述一个事物并没有那么简单。比如,你要描述一本书&#xff0c…

简单搭建Python开发环境

Python环境安装 Python官网: Welcome to Python.org 1. 选择Python3.x版本下载,建议使用稳定版3.9.13(Stable Releases),绝大数库对3.9版本Python已良好支持,但对3.10及以上支持不完全: https://www.…

【【FPGA 之 MicroBlaze 自定义IP核 之 呼吸灯实验】】

FPGA 之 MicroBlaze 自定义IP核 之 呼吸灯实验 通过创建和封装 IP 向导的方式来自定义 IP 核,支持将当前工程、工程中的模块或者指定文件目录封装成 IP 核,当然也可以创建一个带有 AXI4 接口的 IP 核,用于 MicroBlaze 软核处理器和可编程逻辑…

误用STM32串口发送标志位 “USART_FLAG_TXE” “USART_FLAG_TC”造成的BUG

当你使用串口发送数据时是否出现过这样的情况: 1.发送时第一个字节丢失。 2.发送时出现莫名的字节丢失。 3.各种情况字节丢失。 1.先了解一下串口发送的流程图(手动描绘): 可以假想USART_FLAG_TXE是用于检测"弹仓"&…

8、内部FLASH模拟EEPROM实验(STM32F407)

STM32编程方式 在线编程(ICP,In-Circuit Programming): 通过JTAG/SWD协议或者系统加载程序(Bootloader)下载用户应用程序到微控制器中。 在程序中编程(IAP,In Application Programming):通过任何一种通信接口(如IO端口,USB,CAN,UART,I2C,SPI等)下载程…