Java开发从入门到精通(二十):Java的面向对象编程OOP:IO流中的转换流、打印流、数据流、序列流、IO框架

news2024/11/27 16:38:38

Java大数据开发和安全开发

  • (一)Java的IO流文件读写
    • 1.1 转换流
      • 1.1.1 InputStreamReader字符输入转换流
      • 1.1.1 OutputStreamWriter字符输出转换流
    • 1.2 打印流
      • 1.2.1 PrintStream打印流
      • 1.2.2 PrintWriter打印流
      • 1.2.3 PrintStream和PrintWriter的区别
      • 1.2.4 打印流的应用
    • 1.3 数据流
      • 1.3.1 DataOutputstream数据输出流
      • 1.3.2 Datalnputstream数据输入流
    • 1.4 序列流
      • 1.4.1 ObjectOutputstream对象字节输出流
      • 1.4.2 Objectlnputstream对象字节输入流
    • 1.5 IO框架
      • 1.5.1 commons-io导入
      • 1.5.1 Commons-IO框架

(一)Java的IO流文件读写

1.1 转换流

InputStreamReader和OutputStreamWriter
在这里插入图片描述

1.1.1 InputStreamReader字符输入转换流

InputStreamReader(字符输入转换流)

  • 解决不同编码时,字符流读取文本内容乱码的问题。

解决思路:

  • 先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了

在这里插入图片描述

import java.io.*;

public class ZhuanhuangLei {
    public static void main(String[] args) {
        try (
                // 1、得到文件的原始字节流(6BK的字节流形式)
                InputStream is = new FileInputStream("lianxi\\src\\com\\qianxin\\file\\1.txt");
                // 2、把原始的字节输入流按照指定的字符集编码转换成字符输入流
                Reader isr = new InputStreamReader(is, "utf-8");
                // 3、把字符输入流包装成缓冲字符输入流
                BufferedReader br = new BufferedReader(isr);
        ) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.1.1 OutputStreamWriter字符输出转换流

字符输出转换流是控制写出去的字符使用什么字符集进行编码

方法1、调用String提供的getBytes方法解决
在这里插入图片描述
方法2、OutputStreamWriter使用字符输出转换流实现

解决思路:

  • 获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了
    在这里插入图片描述
import java.io.*;

public class ZhuanhuangLei {
    public static void main(String[] args) {
        try(
                // 1、创建一个文件字节输出流
                OutputStream os = new FileOutputStream("lianxi\\src\\com\\qianxin\\file\\1.txt");
                //2、把原始的字节输出流,按照指定的字符集编码转换成字符输出转换流。
                Writer osw = new OutputStreamWriter(os,"GBK");
                //13、把字符输出流包装成缓冲字符输出流
                BufferedWriter bw = new BufferedWriter(osw);
        ) {
            bw.write("我是中国人abc");
            bw.write("我爱你中国123");

        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}
我是中国人abc我爱你中国123

1.2 打印流

PrintStream/PrintWriter(打印流)

  • 作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去

在这里插入图片描述

1.2.1 PrintStream打印流

  • PrintStream提供的打印数据的方案

在这里插入图片描述
在这里插入图片描述

import java.io.*;
import java.nio.charset.Charset;

public class ZhuanhuangLei {
    public static void main(String[] args) {
        try (
                // 1、创建一个打印流管道
                PrintStream ps =
                        new PrintStream("lianxi\\src\\com\\qianxin\\file\\1.txt", Charset.forName("GBK"));

        ) {
            ps.println(97);
            ps.println('a');
            ps.println("我爱你中国abc");
            ps.println(true);
            ps.println(99.5);
            ps.write( 97);//'a'
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.2.2 PrintWriter打印流

PrintWriter提供的打印数据的方案
在这里插入图片描述

import java.io.*;
import java.nio.charset.Charset;

public class ZhuanhuangLei {
    public static void main(String[] args) {
        try (
                // 1、创建一个打印流管道
                PrintWriter ps =
                        new PrintWriter("lianxi\\src\\com\\qianxin\\file\\1.txt");
        ) {
            ps.println(97);
            ps.println('a');
            ps.println("我爱你中国abc");
            ps.println(true);
            ps.println(99.5);
            ps.write( 97);//'a'
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

低级流才可以追加内容

    try (
                // 1、创建一个打印流管道
                PrintWriter ps =
                        new PrintWriter(new FileOutputStream("lianxi\\src\\com\\qianxin\\file\\1.txt"),true);//低级流才可以追加内容
        ) {
        }

1.2.3 PrintStream和PrintWriter的区别

  • 打印数据的功能上是一模一样的:都是使用方便,性能高效(核心优势)
  • PrintStream继承自字节输出流OutputStream,因此支持写字节数据的方法
  • PrintWriter继承自字符输出流Writer,因此支持写字符数据出去,

1.2.4 打印流的应用

  • 输出语句的重定向
    在这里插入图片描述

System.out.println out其实就是打印流的对象

import java.io.*;
import java.nio.charset.Charset;

public class ZhuanhuangLei {
    public static void main(String[] args) {
        System.out.println("老骥伏枥");
        System.out.println("志在千里");
        try (
                PrintStream ps= new PrintStream("lianxi\\src\\com\\qianxin\\file\\1.txt");
        ){
            // 把系统默认的打印流对象改成自己设置的打印流
            System.setOut(ps);
            System.out.println("烈士暮年");
            System.out.println("壮心不已");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

在这里插入图片描述

1.3 数据流

  • 分为DataOutputstream数据输出流和Datalnputstream数据输入流

在这里插入图片描述

1.3.1 DataOutputstream数据输出流

  • 允许把数据和其类型一并写出去

在这里插入图片描述

import java.io.*;
import java.nio.charset.Charset;

public class ZhuanhuangLei {
    public static void main(String[] args) {
        try (DataOutputStream dos =
                     new DataOutputStream(new FileOutputStream("lianxi\\src\\com\\qianxin\\file\\1.txt"));
        ){

            dos.writeInt(97);
            dos.writeDouble(99.5);
            dos.writeBoolean(true);
            dos.writeUTF( "黑马程序员666!");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

写进去的的数据不是乱码,写进去的数据不是用来看的,要想读使用下面的Datalnputstream来反向读取

   a@X�      榛戦┈绋嬪簭鍛�666!

1.3.2 Datalnputstream数据输入流

Datalnputstream(数据输入流)

  • 用于读取数据输出流写出去的数据。

在这里插入图片描述

public class ZhuanhuangLei {
    public static void main(String[] args) {
        try (DataInputStream dos =
                     new DataInputStream(new FileInputStream("lianxi\\src\\com\\qianxin\\file\\1.txt"));
        ){

            int i = dos.readInt();
            System.out.println(i);

            double d = dos.readDouble();
            System.out.println(d);

            boolean b = dos.readBoolean();
            System.out.println(b);

            String rs = dos.readUTF();
            System.out.println(rs);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}
97
99.5
true
黑马程序员666!

1.4 序列流

需要将java对象写出去到文件中存起来,然后再读出来

  • 对象序列化:把Java对象写入到文件中去
  • 对象反序列化:把文件里的Java对象读出来
    在这里插入图片描述

1.4.1 ObjectOutputstream对象字节输出流

  • 可以把Java对象进行序列化:把Java对象存入到文件中去

在这里插入图片描述

要把对象写进文件中去就先创建一个对象

在这里插入图片描述

package com.qianxin.file;

public class Student implements Serializable{
    private String name;
    private String LoginName;
    private int age;
    private String passwd;

    public Student() {
        
    }

    public Student(String name, String loginName, int age, String passwd) {
        this.name = name;
        LoginName = loginName;
        this.age = age;
        this.passwd = passwd;
    }

    public String getName() {
        return name;
    }

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

    public String getLoginName() {
        return LoginName;
    }

    public void setLoginName(String loginName) {
        LoginName = loginName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", LoginName='" + LoginName + '\'' +
                ", age=" + age +
                ", passwd='" + passwd + '\'' +
                '}';
    }
}

序列化对象

import java.io.*;

public class ZhuanhuangLei {
    public static void main(String[] args) {
        try(
                // 2、创建一个对象字节输出流包装原始的字节 输出流。
                ObjectOutputStream oos =
                    new ObjectOutputStream(new FileOutputStream("lianxi\\src\\com\\qianxin\\file\\3.txt"));
        ){
            Student student = new Student("admin","lisi",23,"123456");
            // 2、创建一个对象字节输出流包装原始的字节 输出流。
            oos.writeObject(student);
            System.out.println("序列化对象成功!!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
序列化对象成功!!

1.4.2 Objectlnputstream对象字节输入流

  • 可以把Java对象进行反序列化:把存储在文件中的Java对象读入到内存中来
    在这里插入图片描述
    如果不想将密码写进序列化文件中可以使用参数 transient 这个成员变量将不参与列化
// transient 这个成员变量将不参与列化
private transient String passWord;]
import java.io.*;

public class ZhuanhuangLei {
    public static void main(String[] args) {
        try(
                // 1、创建一个对象字节输入流管道,包装 低级的字节输入流与源文件接通
                ObjectInputStream ois
                        =new ObjectInputStream(new FileInputStream("lianxi\\src\\com\\qianxin\\file\\3.txt"));
        ){

            // 2、创建一个对象接收字节输入流包装原始的字节 输出流。
            Student u=(Student) ois.readObject();
            System.out.println(u);
            System.out.println("反序列化对象成功!!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Student{name='admin', LoginName='lisi', age=23, passwd='123456'}
反序列化对象成功!!

如果要一次序列化多个对象

  • 用一个ArrayList集合存储多个对象,然后直接对集合进行序列化即可注意:ArrayList集合已经实现了序列化接口

1.5 IO框架

什么是框架?

  • 解决某类问题,编写的一套类、接口等,可以理解成一个半成品,大多框架都是第三方研发的。
  • 好处:在框架的基础上开发,可以得到优秀的软件架构,并能提高开发效率
  • 框架的形式:一般是把类、接口等编译成class形式,再压缩成一个jar结尾的文件发行出去

什么是IO框架?
封装了Java提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。

1.5.1 commons-io导入

下载
https://commons.apache.org/io/download_io.cgi
在这里插入图片描述
选择核心文件导入项目
在这里插入图片描述

导入commons-io-2.11.0.jar框架到项目中去。

  1. 在项目中创建一个文件夹:lib
  2. 将commons-io-2.6.jar文件复制到lib文件夹
  3. 在jar文件上点右键,选择 Add as Library ->点击OK
  4. 在类中导包使用
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.5.1 Commons-IO框架

Commons-io是apache开源基金组织提供的一组有关10操作的小框架,目的是提高I0流的开发效率。
在这里插入图片描述

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;

public class FileTest4 {
    public static void main(String[] args) throws Exception {
            FileUtils.copyFile(new File("lianxi\\src\\com\\qianxin\\file\\4.txt"),newFile("lianxi\\src\\com\\qianxin\\file\\5.txt"));
            FileUtils.copyDirectory(new File("lianxi\\src\\com\\qianxin\\file"),new File("lianxi\\src\\com\\qianxin\\file1"));
            FileUtils.deleteDirectory(new File("lianxi\\src\\com\\qianxin\\file1"));

            // Java提供的原生的一行代码搞定很多事情
            //Files.copy(Path.of("io-app2\\src|litheima01.txt"), Path.of("io-app2\\srcllb.txt"));
            System.out.println(Files.readString(Path.of("io-app2\\src\\litheima01.txt")));

    }
}

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

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

相关文章

FactoryMethod工厂方法模式详解

目录 模式定义实现方式简单工厂工厂方法主要优点 应用场景源码中的应用 模式定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method 使得一个类的实例化延迟到子类。 实现方式 简单工厂 以下示例非设计模式,仅为编码的一种规…

住宅IP代理和机房IP代理之间的区别?

一、什么是数据中心/机房IP代理? 数据中心/机房IP代理是使用数据中心拥有并进行分配和管理的IP的代理,俗称机房IP代理。 二、数据中心/机房IP代理的特点 与住宅代理通过使用ISP拥有和分配的IP地址的设备路由请求的情况不同,数据中心代理利…

Jenkins上面使用pnpm打包

问题 前端也想用Jenkins的CI/CD工作流。 步骤 Jenkins安装NodeJS插件 安装完成,记得重启Jenkins。 全局配置nodejs Jenksinfile pipeline {agent anytools {nodejs "18.15.0"}stages {stage(Check tool version) {steps {sh node -vnpm -vnpm config…

Linux知识点(3)

文章目录 11. 进程间通信11.1 管道11.1.0 |11.1.1 匿名管道11.1.2 命名管道11.1.3 用匿名管道形成进程池 11.2 system V共享内存11.2.1 system V函数11.2.2 system 命令 11.3 system V消息队列11.4 system V 信号量 12. 进程信号12.1 前台进程和后台进程12.1.1 jobs12.1.2 fg &…

【鸿蒙开发】饿了么页面练习

0. 整体结构 整体划分3部分。店铺部分,购物车部分,金额统计部分。使用 Stack 把3部分堆叠 0.1 整体页面 Index.ets 修改 Index.ets ,使用堆叠布局,并居底部对齐 import { ElShop } from ../components/ElShop import { ElShopp…

数据结构学习之路--深入探索栈的核心要点(附C源码)

哈喽~大家!今天我们来学习栈的特别节目,精彩马上开始~ 目录 前言 一、栈 1 栈的概念 2 栈的结构 3 栈的实现 3.1 栈的定义 3.2 栈的初始化 3.3 入栈 3.4 出栈 3.5 取栈顶元素 3.6 判断栈是否为空 3.7 栈的大小 3.8 栈的销毁 二、源代…

MES系统功能有什么?对企业有什么价值?

制造业为什么上MES: MES最核心的东西是对生产进行管控,实现生产工厂的透明化、实时化、可控化、可追溯化。 上MES的目的: 最为根本的目的是可以对生产当中的质量进行管控,对交期进行管理,对成本进行控制,…

Java SDK 使用示例

我们使用同样的 Maven 模板去创建 use-test-sdk 项目,不同的是,我们需要在 use-tset-sdk 下创建一个 lib 文件夹,用来存放 test-sdk.jar 文件。 我们将 test-sdk.jar 拖放到 use-test-sdk/lib 下,然后我们就可以编写代码了&#…

47.HarmonyOS鸿蒙系统 App(ArkUI)创建轮播效果

创建轮播效果,共3页切换 Entry Component struct Index {State message: string Hello Worldprivate swiperController: SwiperController new SwiperController()build() {Swiper(this.swiperController) {Text("第一页").width(90%).height(100%).bac…

Appium Desktop + Appium Inspector + 模拟器连接

一、环境预备 1.你需要安装好配置好adb,确保可以在命令行直接运行adb指令 2.安装Appium Desktop、Appium Inspector 、 模拟器 二、启动appium 服务 启动后,画面如下: 三、启动模拟器 此时,启动模拟器,打开电脑cmd窗口&#x…

记第一次踩坑Gradle

今天有个项目只能使用Gradle编译,没办法了,尝试吧。 先去下载了最新版本的Gradle,然后配置好了环境变量,可以在命令行使用gradle命令了。 然后打开项目开始操作一番,但是上来就傻眼了。 我白下载了,又重新下…

【中间件】ElasticSearch简介和基本操作

一、简介 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,支持各种数据类型,包括文本、数字、地理、结构化、非结构化 ,可以让你存储所有类型的数据,能够解决不断涌现出的各种用例。其构成如下: 说明&#xff1…

AI赋能校园管理,打造平安智慧校园解决方案

背景: 2020年教育部办公厅印发《教育系统安全专项整治三年行动实施方案》,文中要求,学校在所辖范围内组织开展安全专项整治三年行动,健全完善安全责任体系,建立风险管控和隐患治理的安全防控体系,开展消防等…

【Qt 学习笔记】QWidget的windowOpacity属性 | cursor属性 | font属性

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ QWidget的windowOpacity属性 | cursor属性 | font属性 文章编号&#…

模板初阶的学习

目录: 一:泛型模板 二:函数模板 三:类模板 1:泛型模板 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。 以交换函数为列进行讲解: void Swap(…

RUST腐蚀服务器添加 TAGS标签教程

RUST腐蚀服务器添加 TAGS标签教程 大家好我是艾西,一个做服务器租用的网络架构师。我们自己搭建架设的服务器在steam展示面板看到跟别人的不一样是咋回事? 这个其实就是服务器的一个标签,那么主要的作用就是让大家在选择服务器时更快更直接的…

DePIN打猎之旅:AI算力作饵,道阻且长

出品|OKG Research 作者|Hedy Bi 香港Web3嘉年华已告一段落,然而Web3自由的脉搏还在跳动,并不断向其他行业渗透。和上一轮周期相比,本轮牛市开启的逻辑是由“原生创新叙事”转变成“主流认可,资金驱动”的…

深度学习基础——计算量、参数量和推理时间

深度学习基础——计算量、参数量和推理时间 在深度学习中,计算量、参数量和推理时间是评估模型性能和效率的重要指标。本文将介绍这三个指标的定义、计算方法以及如何使用Python进行实现和可视化展示,以帮助读者更好地理解和评估深度学习模型。 1. 定义…

C++之linux系统开发调试(包括开发插件的安装)

背景:写这篇文章确实是折腾了很久,而且仍然没有搞利索。但是可以进行命令提示 一、安装步骤 1. 使用普通用户进行安装 sudo apt install build-essential cmake vim-nox python3-dev mono-complete golang nodejs default-jdk npm2. 安装vundle git c…

嵌入式学习——C语言基础——day2

1. gcc的编译过程 1.1 预处理 处理和 " # " 相关的代码 gcc -E filename.c -o filename.i 1. 头文件 2. 宏定义 3. 条件编译 1.2 编译 将c语言代码编译成汇编代码 gcc -S filename.c -o filename.s 1.3 汇编 将汇编代码编译成二进制代码 gcc -c filename.c -o f…