Java进阶——IO流(II)

news2024/11/19 3:44:21

文章目录

    • 三、节点流和处理流
      • 3.1、处理流BufferedReader和BufferedWriter
      • 3.2、处理流BufferedInputStream和BufferedOutputStream
      • 3.3、对象流ObjectInputStream和ObjectOutputStream
      • 3.4、标准输入输出流
      • 3.5、转换流InputStreamReader和OutputStreamWriter
      • 3.6、打印流**PrintStream** 和 PrintWriter
    • 四、Properties类

三、节点流和处理流

基本介绍:

image-20221114151045919

  • 节点流和处理流

image-20221114151238588

3.1、处理流BufferedReader和BufferedWriter

  • BufferedReader和BufferedWriter属于字符流,是按照字符来读取数据的关闭时,只需要关闭外层

BufferedReader代码演示:

import org.junit.jupiter.api.Test;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/16
 * @description 处理流
 */
public class BufferedReader_ {
    public static void main(String[] args) {

    }

    @Test
    public void read() throws Exception {
        String filePath = "F:\\file\\story.txt";
        // 创建BufferedReader对象
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
        // 读取
        String line;
        // 说明
        // 1.bufferedReader.readLine() 是按行读取文件
        // 2.当返回null 时,表示文件读取完毕
        while ((line = bufferedReader.readLine()) != null) {
            System.out.print(line);
        }

        // 关闭流 只需要关闭 BufferedReader, 因为底层会自动关闭 节点流
        bufferedReader.close();
    }
}

**BufferedWriter代码演示:**不能处理二进制文件[pdf/word/声音/图片等]

import org.junit.jupiter.api.Test;

import java.io.*;

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/16
 * @description 文件拷贝
 */
public class BufferedCopy_ {
    public static void main(String[] args) {

    }

    @Test
    public void test() {
        String filePath = "F:\\file\\ok.txt";
        String destFilePath = "F:\\file\\ok1.txt";
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        String line;
        try {
            bufferedReader = new BufferedReader(new FileReader(filePath));
            bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));
            // readLine() 读取一行内容,但是没有换行
            while ((line = bufferedReader.readLine()) != null) {
                // 每读取一行就写进去
                bufferedWriter.write(line);
                // 插入一个换行
                bufferedWriter.newLine();
            }
            System.out.println("拷贝完毕....");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    // 关闭流
                    bufferedReader.close();
                }
                if (bufferedWriter != null) {
                    // 关闭流
                    bufferedWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

3.2、处理流BufferedInputStream和BufferedOutputStream

  • 使用BufferedInputStream和BufferedOutputStream可以完成二进制文件的拷贝
import org.junit.jupiter.api.Test;

import java.io.*;

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/16
 * @description 文件拷贝
 */
public class BufferedCopy1 {
    public static void main(String[] args) {

    }

    @Test
    public void copy() {
        String srcPath = "F:\\file\\1.jpg";
        String destPath = "F:\\file\\2.jpg";
        // 创建BufferedInputStream和BufferedOutputStream
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(srcPath));
            bos = new BufferedOutputStream(new FileOutputStream(destPath));

            // 循环读取文件,并写入到 destPath
            byte[] bytes = new byte[1024];
            int readLine = 0;
            // 当返回 -1 时表示读取完毕
            while((readLine = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, readLine);
            }
            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();
            }

        }
    }
}

3.3、对象流ObjectInputStream和ObjectOutputStream

  • 序列化和反序列化
  1. 序列化就是在保存数据时,保存数据的值数据类型
  2. 反序列化就是在恢复数据时,恢复数据的值数据类型
  3. 需要让某个对象支持序列化,必须让其类是可序列化的,必须实现如下两个接口之一:Serializable(标记接口)和Externalizable

ObjectInputStream和ObjectOutputStream的类图:


image-20221116140250301

image-20221116140231862

使用ObjectOutputStream 序列化基本数据类行和一个Dog对象(name, age)并保存到data.dat文件里面

import java.io.*;

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/16
 * @description ObjectOutputStream的使用
 */
public class ObjectOutputStream_ {
    public static void main(String[] args) throws IOException {
        // 序列化后保存的文件格式,不是纯文本,而是按照它的格式保存的
        String filePath = "F:\\file\\data.dat";

        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(filePath));
        // 序列化数据
        os.write(100);
        // 自动装箱boolean ----> Boolean (实现了 Serializable)
        os.writeBoolean(true);
        // 自动装箱char ----> Character (实现了 Serializable)
        os.writeChar('a');
        os.writeUTF("java小豪");
        // 保存一个Dog对象
        os.writeObject(new Dog("旺财", 3));

        os.close();
        System.out.println("数据保存完毕(序列化形式)");

    }
}
// 如果需要序列化某个类的对象,实现Serializable
class Dog implements Serializable {
    private String name;
    private int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
  • 注意事项
    • 读写顺序要一致
    • 要求实现序列化或反序列化对象实现Serializable
    • 序列化对象时,默认将里面的所有属性都进行序列化,除了static或transient修饰的成员
    • 序列化对象时,要求里面的属性的类型也需要实现序列化接口
    • 序列化具备可继承性,也就是某类实现了序列化,他的所有子类也已经默认实现了序列化

3.4、标准输入输出流

  • System.in和System.out
/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/16
 * @description 标准输入和输出流
 */
public class InputAndOutput {
    public static void main(String[] args) {
        //System类里面的一个属性 public final static InputStream in = null;
        // 编译类型 为 InputStream 运行类型 BufferedInputStream
        System.out.println(System.in.getClass());

        // System.out 是 public final static PrintStream out = null;
        // 编译类型 为 PrintStream 运行类型 为PrintStream 标准输出(显示器)
        System.out.println(System.out.getClass());
    }
}

3.5、转换流InputStreamReader和OutputStreamWriter

  1. InputStreamReader: Reader的子类,可以将InputStream(字节流)包装成(转换)Reader(字符流)
  2. OutputStreamWriter: Writer的子类,可以实现将OutputStream(字节流)包装成Writer(字符流)
  3. 当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
  4. 可以在使用时指定编码格式(比如 utf-8, gbk, gb2312, ISO8855-1等)

InputStreamReader的类图:

image-20221128215734373


OutputStream的类图:

image-20221128220657123


**示例1:**字节流FileInputStream包装成(转换成)字符流InputStreamReader,对文件进行读取(按照UTF-8/GBK格式)进而包装成BufferedReader

import java.io.*;

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/28
 * @description 使用InputStreamReader解决中文乱码问题
 * <p>
 *     将字节流 FileInputStream 转换成 InputStreamReader, 指定编码gbk/utf-8
 * </p>
 */
public class InputStreamReader_ {
    public static void main(String[] args) throws IOException {

        String filePath = "F:\\file\\a.txt";
        // 1. new FileInputStream 转成 InputStreamReader 指定编码为GBK
        InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "GBK");
        // 2. 把 InputStreamReader 传入 BufferedReader
        BufferedReader br = new BufferedReader(isr);

        // 将 2 和 3 和在一起
        // BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "GBK"));
        // 3. 读取
        String s = br.readLine();
        System.out.println("读取文件的内容为:" + s);
        // 4. 关闭外层流
        br.close();
    }
}

**示例2:**将字节流FileOutputStream包装成(转换成)字符流OutputStreamWriter,对文件进行写入(按照GBK格式,可以指定其他:UTF-8)

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

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/28
 * @description 使用OutputStreamWriter将FileOutputStream字节流,转换成字符流 OutputStreamWriter
 */
public class OutputStreamWriter_ {
    public static void main(String[] args) throws IOException {

        String filePath = "F:\\file\\a.txt";
        String charSet = "UTF-8";
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), charSet);
        osw.write("hi, 孙悟空");
        osw.close();
        System.out.println("按照 " + charSet + "保存文件成功~");
    }
}

3.6、打印流PrintStream 和 PrintWriter

注意:打印流只有输出流,没有输入流
PrintStream的类图

image-20221128223541729

PrintWriter的类图

image-20221128223641038

PrintStream示例:

import java.io.IOException;
import java.io.PrintStream;

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/28
 * @description 演示PrintStream(字节打印流)、
 */
public class PrintStream_ {
    public static void main(String[] args) throws IOException {
        PrintStream ps = System.out;
        // 默认情况下,PrintStream 输出数据的位置是标准输出
        /*
        public void print(String s) {
            if (s == null) {
                s = "null";
            }
            write(s);
         }
         */
        ps.println("john Hello");
        // 因为print底层使用write,所以我们可以调用write进行打印/输出
        ps.write("孙悟空,你好".getBytes());
        ps.close();

        //我们可以修改打印输出流的位置,修改成到 "F:\\file\\f1.txt"
        System.setOut(new PrintStream("F:\\file\\f1.txt"));
        System.out.println("hello, 孙悟空");
    }
}

PrintWriter示例:

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/28
 * @description 演示PrintWriter的使用
 */
public class PrintWriter_ {
    public static void main(String[] args) throws IOException {

//        PrintWriter pw = new PrintWriter(System.out);
        PrintWriter pw = new PrintWriter(new FileWriter("F:\\file\\f2.txt"));
        pw.print("hello, 北京~");
        pw.close();
    }
}

四、Properties类

properties类可以轻松的处理*.properties文件

Properties类常见方法:

  • load:加载配置文件的键值对到Properties对象
  • list:将数据显示到指定位置
  • getProperty(key):根据键获取值
  • setProperty(key, value):设置键值对到Properties对象
  • store:将Properties中的键值对存储到配置文件,在idea中保存文件如果有中文,会存储为Unicode码

**示例1:**读取mysql.properties文件,并得到ip,user 和 pwd

  • 传统方法
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/28
 * @description 演示Properties类的使用
 */
public class Properties01 {
    public static void main(String[] args) throws IOException {

        // 读取mysql.properties文件并得到ip、user和pwd
        BufferedReader br = new BufferedReader(new FileReader("src\\mysql.properties"));
        String line = "";
        while((line = br.readLine()) != null ) {
            String[] split = line.split("=");
            System.out.println(split[0] + "值是:" + split[1]);
        }
        br.close();
    }
}
  • 使用Properties类进行读取
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/28
 * @description
 */
public class Properties02 {
    public static void main(String[] args) throws IOException {
        // 使用Properties 类来读取mysql.properties 文件

        // 1.创建Properties 对象
        Properties properties = new Properties();
        // 2.加载指定的配置文件
        properties.load(new FileReader("src/mysql.properties"));
        // 3.把k-v显示到控制台
        properties.list(System.out);
        // 4.根据键获取对应的值
        String user = properties.getProperty("username");
        String pwd = properties.getProperty("password");
        System.out.println("用户名=" + user);
        System.out.println("密码=" + pwd);
    }
}
  • 使用Properties修改配置文件
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

/**
 * @author java小豪
 * @version 1.0.0
 * @date 2022/11/29
 * @description
 */
public class Properties03 {
    public static void main(String[] args) throws IOException {
        // 使用Properties 类来创建 配置文件,修改配置文件内容
        Properties properties = new Properties();
        // 创建
        // 1.如果该文件没有key,就是创建
        // 2.如果该文件有key,就是修改
        properties.setProperty("charset", "utf-8");
        properties.setProperty("user", "孙悟空");
        properties.setProperty("pwd", "888888");

        // 将k-v 存储在文件中
        properties.store(new FileOutputStream("src\\mysql2.properties"), null);
        System.out.println("保存文件成功");
        
    }
}

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

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

相关文章

【多目标进化优化】MOPSO 原理与代码实现

&#x1f388;&#x1f49e;&#x1f49e; &#x1f607; 热烈欢迎您的到来 &#x1f607; &#x1f498;&#x1f498;&#x1f388;——青年有志 &#x1f3c6;初衷&#xff1a; 通俗的语言 dapei 核心的内容 &#x1f389; 博主相信&#xff1a; 有足够的积累&#xff0c…

一个简单的WEB网页制作作业——黑色的山河旅行社网站(5个页面)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

2022年各国程序员编程水平排行榜出炉,排名第一的国家没听说过

哪个地方的程序员编程水平最高&#xff1f;相信很多人对这个问题感兴趣&#xff0c;今天就来聊一聊这个话题。 Pentalog 是一个全球数字服务平台&#xff0c;主要帮助企业寻找世界上一流的IT人才&#xff0c;每年都会发布一份全球IT行业报告&#xff0c;今天文章的数据也是来自…

单片机控制马达驱动IC的应用

8位机最常见的应用单片机驱动马达IC工作&#xff0c;马达可支持无级调速&#xff08;PWM&#xff09;&#xff0c;正转&#xff0c;反转&#xff0c;刹车。该应用简单高效适应于各种应用&#xff0c;节约成本的不二选择。 今天就跟大家分享曾经做过的马达驱动IC的应用。 主电…

类的加载器

文章目录1. 概述1.1 大厂面试题1.2 类加载的分类1.3 类加载器的必要性1.4 命名空间1.5 类加载机制的基本特征2. 类的加载器分类2.1 引导类加载器2.2 扩展类加载器2.3 系统类加载器2.4 用户自定义类加载器3. 测试不同的类的加载器4. ClassLoader源码解析4.1 ClassLoader的主要方…

测量电源纹波-正确测量方法

测量纹波需要注意的点&#xff1a; 1、用弹簧探针&#xff1b; 2、测量位置在输出电容两端&#xff1b; 3、示波器选择‘20M’&#xff1b; 4、示波器选择‘交流耦合’&#xff1b; 5、示波器探头‘X1’&#xff0c;示波器设置‘X1’&#xff1b;(10:1的探头&#xff0c;实际上…

Stable Diffusion V2.1非标准分辨率图像高清渲染

Stable Diffusion V2.1非标准分辨率图像高清渲染 Stable Diffusion V2.1发布&#xff0c;支持非标准分辨率图像高清渲染。 SD2.1在线体验 在线体验地址:Stable Diffusion 模型包括&#xff1a; NovelAI&#xff0c;NovelAI的模型训练使用了数千个网站的数十亿张图片&#xf…

如何给图片加水印?分享怎么给图片加水印的方法

当我们在平台上发布自己精心拍摄的照片&#xff0c;或分享自己总结的知识点时&#xff0c;难免会遇到一些人盗用自己图片的情况。这时候&#xff0c;我们就会给图片添加上水印&#xff0c;从而来防止自己的图片被盗&#xff0c;那要怎么给图片加水印呢&#xff1f;别着急&#…

《自己动手写CPU》学习记录(3)——第4章/Part 1

目录 引言 致谢 平台 ori 指令 流水线结构建立 模型 简单的MIPS五级流水线结构 设计 宏定义 程序计数器 译码 通用寄存器 指令执行 内存访问 指令ROM 顶层文件 处理器顶层 SOPC顶层 功能仿真 TestBench 仿真结果 执行时间 时序细节 引言 本篇学习书本…

Java大型企业进销存系统源码带文字搭建教程

技术架构 技术框架&#xff1a;SpringBoot Spring Data Jpa SpringMvc Shiro安全认证 完整权限系统 easyui 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 本地搭建教程&#xff1a; 1.下载源码&#xff0c;小皮面板创建一个数据库&#xff0c;导入db_jxc2.…

nodejs模板引擎的使用

前后端不分离的情况(数据都来源于后端,前后端不可以分离使用) npm i express art-template express-art-template --S 先下载模板引擎,模板渲染,还有experss服务器的包 js代码 //导入express服务器第三方的包 const express require("express") //导入模板引擎 con…

Spring Cloud(十六):微服务分布式唯一ID

分布式唯一ID 特点方案 雪花算法 特点开源实现优缺点 替代方案 UUIDMongdbSeata数据库生成Redis 基于美团的 Leaf分布式 ID 微服务 Leaf-segment 数据库方案 双 buffer 优化 — TP999 数据波动大 Leaf 高可用容灾 — DB 可用性Leaf-snowflake 雪花方案 弱依赖 ZooKeeper 解决时…

加减大师-第10届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第98讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

Vue学习笔记--第一章(尚硅谷学习视频总结)

目录 一、第一章 Vue核心 1.1. Vue简介 1.1.1. 官网 1.1.2. 介绍与描述 1.1.3. Vue 的特点 1.1.4. 与其它 JS 框架的关联 1.1.5. Vue 周边库 1.2.初识Vue 1.3. 模板语法 1.4. 数据绑定 1.5 el与data的两种写法 1.6 MVVM模型 1.7 Vue中的数据代理 1.8.事件处理 1.…

从零学习 InfiniBand-network架构(九) —— IB协议中子网本地地址

从零学习 InfiniBand-network架构&#xff08;九&#xff09; —— IB协议中子网本地地址 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;未经作者允许&#xff0c;禁止转载 &#x1f6a9;本专题部分内容源于《InfiniBand-n…

鸿蒙3.0应用开发若干问题及上架总结

1.如何去掉默认标题栏&#xff0c;实现全屏显示&#xff1f; 在config.json中的ability配置信息中添加属性&#xff1a; "abilities": [ {..."metaData": {"customizeData": [{"name": "hwc-theme","value": &q…

Buildroot系列开发(五)bootloader简述

参考&#xff1a;百问网 文章目录1.什么是Boot-loader?2.有哪些bootloader?哪些支持linux&#xff1f;3.Bootloader支持的Flash设备4.Bootloader支持的文件系统类型4.Bootloader支持的CPU架构5.Bootloader总结1.什么是Boot-loader? 2.有哪些bootloader?哪些支持linux&#…

广州蓝景分享——前端学习5 种在 JavaScript 中获取字符串第一个字符的方法

在本文中&#xff0c;我们将研究多种方法来轻松获取 JavaScript 中字符串的第一个字符。 1.charAt() 方法 要获取字符串的第一个字符&#xff0c;我们可以在字符串上调用 charAt() &#xff0c;将 0 作为参数传递。例如&#xff0c;str.charAt(0) 返回 str 的第一个字符。 c…

AT1106S(PHS/EN输入接口通道0.8A低压H桥直流刷式电机驱动IC)

描述 泛海微AT1106S为摄像机、消费类产品、玩具和其它低电压或者电池供电的运动控制类应用提供了一个集成的电机驱动器解决方案。泛海微AT1106S能够驱动一个直流电机或其他诸 如螺线管的器件。输出驱动模块由N MOS功率管构成的H桥组成&#xff0c;以驱动电机绕组。泛海微AT110…

车企接连押注「重感知」 ,高精地图真会被弃用?

实现高阶智能驾驶&#xff0c;“重感知”是否为大势所趋&#xff1f; 答案正日益明晰。 2022年&#xff0c;以特斯拉为代表的“重感知”阵营&#xff0c;押注者正日趋增多。以在2022年尝试落地城市NOA的三家厂商为例&#xff1a;毫末智行一早便属“重感知”阵营&#xff1b;小…