BufferedOutputStream,BufferedInputStream是字节流,对象处理流,序列化,输入输出流,转换流

news2024/12/29 10:11:28
  1. BufferedInputStream字节输入流
    1. 意思就是InputStream类及其子类都能以参数的形式放到BufferedInputStream构造器的参数
    2. package com.hspedu.outputstream_;
      
      import java.io.*;
      
      /**
       * @author 韩顺平
       * @version 1.0
       * 演示使用BufferedOutputStream 和 BufferedInputStream使用
       * 使用他们,可以完成二进制文件拷贝.
       * 思考:字节流可以操作二进制文件,可以操作文本文件吗?当然可以
       */
      public class BufferedCopy02 {
          public static void main(String[] args) {
      
      //        String srcFilePath = "e:\\Koala.jpg";
      //        String destFilePath = "e:\\hsp.jpg";
      //        String srcFilePath = "e:\\0245_韩顺平零基础学Java_引出this.avi";
      //        String destFilePath = "e:\\hsp.avi";
              String srcFilePath = "e:\\a.java";
              String destFilePath = "e:\\a3.java";
      
              //创建BufferedOutputStream对象BufferedInputStream对象
              BufferedInputStream bis = null;
              BufferedOutputStream bos = null;
      
              try {
                  //因为 FileInputStream  是 InputStream 子类
                  bis = new BufferedInputStream(new FileInputStream(srcFilePath));
                  bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
      
                  //循环的读取文件,并写入到 destFilePath
                  byte[] buff = new byte[1024];
                  int readLen = 0;
                  //当返回 -1 时,就表示文件读取完毕
                  while ((readLen = bis.read(buff)) != -1) {
                      bos.write(buff, 0, readLen);
                  }
      
                  System.out.println("文件拷贝完毕~~~");
      
              } catch (IOException e) {
                  e.printStackTrace();
              } finally {
      
                  //关闭流 , 关闭外层的处理流即可,底层会去关闭节点流
                  try {
                      if(bis != null) {
                          bis.close();
                      }
                      if(bos != null) {
                          bos.close();
                      }
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
      
              }
      
      
          }
      }
      

      文件拷贝图片

  2. BufferedOutputStream字节输出流

     

    1. 同上
  3. 对象处理流ObjectInputStream,ObjectOutputStream提供了对基本类型或对象类型的序列化和反序列化的方法
  4. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现接口。
  5. ObjectInputStream

     提供反序列化功能,文件--->程序

    1. package com.hspedu.inputstream_;
      
      
      
      import com.hspedu.outputstream_.Dog;
      
      import java.io.*;
      
      /**
       * @author 韩顺平
       * @version 1.0
       */
      public class ObjectInputStream_ {
          public static void main(String[] args) throws IOException, ClassNotFoundException {
      
              //指定反序列化的文件
              String filePath = "e:\\data.dat";
      
              ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
      
              //读取
              //老师解读
              //1. 读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致
              //2. 否则会出现异常
      
              System.out.println(ois.readInt());
              System.out.println(ois.readBoolean());
      
              System.out.println(ois.readChar());
              System.out.println(ois.readDouble());
              System.out.println(ois.readUTF());
      
      
              //dog 的编译类型是 Object , dog 的运行类型是 Dog
              Object dog = ois.readObject();
              System.out.println("运行类型=" + dog.getClass());
              System.out.println("dog信息=" + dog);//底层 Object -> Dog
      
              //这里是特别重要的细节:
      
              //1. 如果我们希望调用Dog的方法, 需要向下转型
              //2. 需要我们将Dog类的定义,放在到可以引用的位置
              Dog dog2 = (Dog)dog;
              System.out.println(dog2.getName()); //旺财..
      
              //关闭流, 关闭外层流即可,底层会关闭 FileInputStream 流
              ois.close();
      
      
          }
      }
      
      

      需要将Dog类的定义,放在可以引用的位置,public

  6. ObjectOutputStream:提供序列化功能,程序--->文件
    1. package com.hspedu.outputstream_;
      
      import java.io.FileOutputStream;
      import java.io.ObjectOutputStream;
      import java.io.Serializable;
      
      /**
       * @author 韩顺平
       * @version 1.0
       * 演示ObjectOutputStream的使用, 完成数据的序列化
       */
      public class ObjectOutStream_ {
          public static void main(String[] args) throws Exception {
              //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
              String filePath = "e:\\data.dat";
      
              ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
      
              //序列化数据到 e:\data.dat
              oos.writeInt(100);// int -> Integer (实现了 Serializable)
              oos.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)
              oos.writeChar('a');// char -> Character (实现了 Serializable)
              oos.writeDouble(9.5);// double -> Double (实现了 Serializable)
              oos.writeUTF("韩顺平教育");//String
              //保存一个dog对象
              oos.writeObject(new Dog("旺财", 10, "日本", "白色"));
              //Dog类必须实现接口才能序列化
              oos.close();
              System.out.println("数据保存完毕(序列化形式)");
      
      
          }
      }
      
      

      Dog类需要实现Serializeable接口

  7. 序列化反序列化注意事项【int,String...都已经实现序列化了】

    1. 读写顺序要一致

    2. 要求序列化或反序列化对象,需要实现Serializable

    3. 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性

    4. 序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员

    5. 序列化对象时,要求里面属性的类型也需要实现序列化接口

    6. 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化

  8. 输入和输出流

    1. package com.hspedu.standard;
      
      import java.io.InputStreamReader;
      import java.io.OutputStreamWriter;
      import java.util.Scanner;
      
      /**
       * @author 韩顺平
       * @version 1.0
       */
      public class InputAndOutput {
          public static void main(String[] args) {
              //System 类 的 public final static InputStream in = null;
              // System.in 编译类型   InputStream
              // System.in 运行类型   BufferedInputStream
              // 表示的是标准输入 键盘
              System.out.println(System.in.getClass());
      
              //老韩解读
              //1. System.out public final static PrintStream out = null;
              //2. 编译类型 PrintStream
              //3. 运行类型 PrintStream
              //4. 表示标准输出 显示器
              System.out.println(System.out.getClass());
      
              System.out.println("hello, 韩顺平教育~");
      
              Scanner scanner = new Scanner(System.in);
              System.out.println("输入内容");
              String next = scanner.next();
              System.out.println("next=" + next);
      
              
          }
      }
      
  9. 转换流InputStreamReader,字节输入流转成字符输入流,见名知意。

    1. InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成(转换)Reader(字符流)

    2. package com.hspedu.transformation;
      
      import java.io.*;
      
      /**
       * @author 韩顺平
       * @version 1.0
       * 演示使用 InputStreamReader 转换流解决中文乱码问题
       * 将字节流 FileInputStream 转成字符流  InputStreamReader, 指定编码 gbk/utf-8
       */
      public class InputStreamReader_ {
          public static void main(String[] args) throws IOException {
      
              String filePath = "e:\\a.txt";
              //解读
              //1. 把 FileInputStream 转成 InputStreamReader
              //2. 指定编码 gbk
              //InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");
              //3. 把 InputStreamReader 传入 BufferedReader
              //BufferedReader br = new BufferedReader(isr);
      
              //将2 和 3 合在一起
              BufferedReader br = new BufferedReader(new InputStreamReader(
                                                          new FileInputStream(filePath), "gbk"));
      
              //4. 读取
              String s = br.readLine();
              System.out.println("读取内容=" + s);
              //5. 关闭外层流
              br.close();
      
          }
      
      
      }
      

  10. OutputStreamWriter:Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流)

    1. package com.hspedu.transformation;
      
      import java.io.*;
      
      /**
       * @author 韩顺平
       * @version 1.0
       * 演示 OutputStreamWriter 使用
       * 把FileOutputStream 字节流,转成字符流 OutputStreamWriter
       * 指定处理的编码 gbk/utf-8/utf8
       */
      public class OutputStreamWriter_ {
          public static void main(String[] args) throws IOException {
              String filePath = "e:\\hsp.txt";
              String charSet = "utf-8";
              OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), charSet);
              osw.write("hi, 韩顺平教育");
              osw.close();
              System.out.println("按照 " + charSet + " 保存文件成功~");
      
      
          }
      }
      

  11. 当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流

  12. 可以在使用时指定编码格式(utf-8,gbk,gb2312,ISO8859-1)

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

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

相关文章

数据挖掘:心脏病预测(测评指标;EDA)

目录 一、前期准备 二、实战演练 2.1分类指标评价计算示例 2.2数据探索性分析(EDA) 2.2.1 导入函数工具箱 2.2.2 查看数据信息等相关数据 判断数据缺失和异常 数字特征相互之间的关系可视化 类别特征分析(箱图,小提琴图&am…

ios客户端学习笔记(五):学习Swift的关键字和容易弄混的符号

1. 关键字 下面是Swift语言中的常见关键字及其说明和代码应用实例: class:定义一个类,用于封装一组相关的属性和方法。 示例代码: class Person {var name: String ""var age: Int 0 }struct:定义一个…

网络安全与攻防-常见网络安全攻防

目录 攻击手段&防御策略 阻断服务攻击(DoS) 地址解析欺骗(ARP攻击)(Address Resolution Protocol spoofing) 跨站脚本攻击(XSS) SQL注入 跨站请求伪造(csrf&am…

AlgoC++第二课:线性回归

目录 线性回归前言1. 定义2. 房价预测案例2.1 定义问题:2.2 MSE是如何被定义的?(如何推导的?)2.3 总结 3. 代码3.1 C实现3.1.1 数据读取和处理3.1.2 线性回归模型3.1.3 参数输出和预测3.1.4 完整示例代码3.1.5 C知识点 3.2 python实现3.2.1 房…

【移动端网页布局】移动端网页布局基础概念 ① ( 移动端浏览器 | 移动端屏幕分辨率 | 移动端网页调试方法 )

文章目录 一、移动端浏览器二、移动端屏幕分辨率三、移动端网页调试方法 一、移动端浏览器 移动端浏览器 比 PC 端浏览器发展要晚 , 使用的技术比较新 , 对 HTML5 CSS3 支持较好 , 常见的浏览器如下 : UC / QQ / Opera / Chrom / 360 / 百度 / 搜狗 / 猎豹 国内的浏览器 基本…

算法套路十一 ——回溯法之组合型回溯

算法套路十一 ——回溯法之组合型回溯 该节是在上一节回溯法之子集型回溯的基础上进行描写,组合型回溯会在子集型回溯的基础上判断所选子集是否符合组合要求, 故请首先阅读上一节算法套路十——回溯法之子集型回溯 算法示例:LeetCode77. 组合…

【C++ 十八】C++ map/ multimap容器

C map/ multimap 容器 文章目录 C map/ multimap 容器前言1 map 基本概念2 map 构造和赋值3 map 大小和交换4 map 插入和删除5 map 查找和统计6 map 容器排序 总结 前言 本文包含map基本概念、map构造和赋值、map大小和交换、map插入和删除、map查找和统计、map容器排序。 1 m…

使用Glib中测试框架对C代码进行单元测试

C项目的测试框架比较常见的是Google的gtest(前文CMake项目使用ctestgtest进行单元测试有使用实例介绍gtest,感兴趣的读者可以去看看),也有一些其它框架,比如Boost中的测试框架。这些框架虽然也可以测试C代码&#xff0…

Vue 消息订阅与发布

消息订阅与发布,也可以实现任意组件之间的通信。 订阅者:就相当于是我们,用于接收数据。 发布者:就相当于是媒体,用于传递数据。 安装消息订阅与发布插件: 在原生 JS 中 不太容易实现消息订阅与发布&…

Unity-ML-Agents-代码解读-RollerBall

使用版本:https://github.com/Unity-Technologies/ml-agents/releases/tag/release_19 文件路径:ml-agents-release_19/docs/Learning-Environment-Create-New.md 20和19的在rollerBall上一样:https://github.com/Unity-Technologies/ml-ag…

CSDN博客编写教程

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

osg widget 试用 方法

按钮 一个常见的 osg::Widget 就是按钮。下面的代码展示了如何使用 osg::Switch 和 osgText 创建一个简单的按钮&#xff1a; osg::ref_ptr<osg::Switch> buttonSwitch new osg::Switch(); osg::ref_ptr<osgText::Text> buttonText new osgText::Text(); buttonT…

浏览器不好用?插件来帮忙

一、目的 浏览器本身具备的功能并不完善&#xff0c;不同的用户可以为自己浏览器增加想要功能&#xff0c;使得浏览器更能符合自己的需求&#xff0c;提高浏览器使用的舒适度 二、推荐插件 AdblockPlus LastPass&#xff08;密码记录&#xff0c;全平台通用&#xff09; Dar…

JSON的用法和说明

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。 JSON建构于两种结构&#xff1a; "名称/值"对的集合。理解为对象 值的有序列表。理解为数组 JSON具有以下这些形式&#xff1a; 对象是一个无序的“ ’名称/值‘ 对”集合。一个…

阿里 Arthas (阿尔萨斯)工具的使用

目录 使用 一、安装与启动命令行控制台使用 使用 这款工具可以监控线上、测试或者其他环境的java运行中程序的情况&#xff0c;用于定位线上、测试等环境的问题。 一、安装与启动 通过termius远程登录测试或者线上环境&#xff0c;cd到指定目录下&#xff0c;输入命令&#…

高效部署Redis Sentinel模式(哨兵模式),手把手教学

Redis Sentinel模式部署 前言一、服务器部署同版本的redis1、换软件源在yum拉取包的时候启用remi源 二、修改配置文件1.修改/etc/redis.conf2.配置/etc/redis/sentinel.conf 三、启动redis服务1、启动服务2、连接redis3、检查redis 前言 这里就不过多的解释高可用的好处了&…

设计模式:行为型模式 - 迭代器模式

文章目录 1.概述2.结构3.案例实现4.优缺点5.使用场景6.JDK源码解析 1.概述 定义&#xff1a; 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 2.结构 迭代器模式主要包含以下角色&#xff1a; 抽象聚合&#xff08;Aggregate&…

Learn OpenCV by Examples - with Python

目录 关于OpenCV 新增内容 Content 1.锐化 2.阈值&#xff0c;二值化和自适应阈值 本文是自己在kaggle上学习OpenCV的学习笔记&#xff0c;如果对你有所帮助再好不过了。这是原文链接Learn OpenCV by Examples - with Python | Kaggle里面不仅有代码还有图片等。如果你还没…

网络安全-CDN绕过寻找真实IP

网络安全-CDN绕过寻找真实IP CDN就是CDN加速&#xff0c;就是根据你的目标让你访问的更快 CDN CDN&#xff0c;即内容分发网络&#xff0c;主要解决因传输距离和不同运营商节点造成的网络速度性能低下的问题。说得简单点&#xff0c;就是一组在不同运营商之间的对接节点上的…

Docker AIGC等大模型深度学习环境搭建(完整详细版)

本文是《Python从零开始进行AIGC大模型训练与推理》&#xff08;https://blog.csdn.net/suiyingy/article/details/130169592&#xff09;专栏的一部分&#xff0c;所述方法和步骤基本上是通用的&#xff0c;不局限于AIGC大模型深度学习环境。 Docker AIGC等大模型深度学习环境…