Java学习路线-27:IO操作深入与IO操作类继承体系

简介: Java学习路线-27:IO操作深入与IO操作类继承体系

第17 章 : IO操作深入

80 字符编码

常用的编码

1、GBK/GB2312 国标编码, GB2312简体中文,GBK包含简体和繁体

2、ISO8859-1 国际通用编码,描述所有字母

3、UNICODE 16进制存储,描述所有问题

4、UTF 象形文字部分使用16进制,普通字母采用ISO8859-1,主要使用UTF-8


列出本机属性

System.getProperties().list(System.out);

项目中出现乱码问题就是编码和解码标准不统一


81 内存操作流

文件操作流 以文件为操作终端,InputStream、OutputStream


内存操作流

1、字节内存操作流 ByteArrayOutputStream ByteArrayInputStream

2、字符内存操作流 CharArrayWriter CharArrayReader


继承关系


OutputStream
    -FileOutputStream
    -ByteArrayOutputStream
InputStream
    -FileInputStream
    -ByteArrayInputStream 
Writer
    -OutputStreamWriter
        -FileWriter
    -CharArrayWriter
Reader
    -InputStreamReader
        -FileReader
    -CharArrayReader

示例:利用内存流小写转大写操作


import java.io.*;
class Demo{
    public static void main(String[] args) throws IOException {
        String message = "hello java";
        // 将数据保存到内存流中
        InputStream input = new ByteArrayInputStream(message.getBytes());
        OutputStream output = new ByteArrayOutputStream();
        int data = 0;
        // 每次读取一个数据
        while ((data = input.read())!=-1){
            output.write(Character.toUpperCase(data));
        }
        System.out.println(output);
        // HELLO JAVA
        output.close();
        input.close();
    }
}

82 管道流

发送信息 <- 管道 -> 接收信息

字节管道流 PipedInputStream, PipedOutputStream

字符管道流 PipedReader, PipedWriter


继承关系

InputStream
    -PipedInputStream
OutputStream
    -PipedOutputStream
Reader
    -PipedReader
Writer
    -PipedWriter

管道发送接收数据


import java.io.*;
class Sender implements Runnable {
    private PipedOutputStream output;
    public Sender() {
        this.output = new PipedOutputStream();
    }
    @Override
    public void run() {
        try {
            this.output.write("你好".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            this.output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public PipedOutputStream getOutput() {
        return this.output;
    }
}
class Receiver implements Runnable {
    private PipedInputStream input;
    public Receiver() {
        this.input = new PipedInputStream();
    }
    @Override
    public void run() {
        try {
            byte[] data = new byte[1024];
            int len = this.input.read(data);
            System.out.println(new String(data, 0, len));
            // 你好
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            this.input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public PipedInputStream getInput() {
        return this.input;
    }
}
class Demo {
    public static void main(String[] args) throws IOException {
        Sender sender = new Sender();
        Receiver receiver = new Receiver();
        // 管道连接
        sender.getOutput().connect(receiver.getInput());
        new Thread(sender).start();
        new Thread(receiver).start();
    }
}

83 RandomAccessFile

随机读取类,可以移动文件指针


public RandomAccessFile(String name, String mode)
import java.io.*;
class Demo {
    public static void main(String[] args) throws IOException {
        // 写入
        RandomAccessFile writer = new RandomAccessFile("demo.txt", "rw");
        writer.write("你好世界".getBytes());
        writer.close();
        // 读取
        RandomAccessFile reader = new RandomAccessFile("demo.txt", "rw");
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        writer.close();
    }
}

第18 章 : 输入与输出支持

84 打印流

设计思想:装饰设计模式

为OutputStream 类实现一层包装

PrintStream

PrintWriter


继承关系


OutputStream
    -FilterOutputStream
        -PrintStream
Writer
    -PrintWriter
import java.io.*;
class Demo {
    public static void main(String[] args) throws IOException {
        PrintWriter writer = new PrintWriter(new FileWriter("demo.txt"));
        // 换行输出
        writer.println("你好");
        // 格式化输出
        writer.printf("姓名 %s, 年龄: %s", "小强", 23);
        writer.close();
    }
}

只要是文件内容输出时都使用打印流


85 System类对IO的支持

System是系统类

1、标准输出(显示器)

2、错误输出

3、标准输入(键盘)


public final class System {
    public final static InputStream in = null;
    public final static PrintStream out = null; // 黑色字体
    public final static PrintStream err = null; // 红色字体
}

修改输出位置


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
class Demo {
    public static void main(String[] args) throws IOException {
        System.setErr(new PrintStream(new FileOutputStream(new File("demo.txt"))));
        System.err.println("你好");
    }
}

接收键盘输入(一般不用此方法)


import java.io.IOException;
import java.io.InputStream;
class Demo {
    public static void main(String[] args) throws IOException {
        InputStream input = System.in;
        System.out.println("请输入姓名:");
        byte[] data = new byte[1024];
        int len = input.read(data);
        System.err.println(new String(data, 0, len));
    }
}

86 BufferedReader缓冲输入流

JDK < 1.5


缓冲字符输入流

继承关系


Reader
    -BufferedReader

代码示例


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Demo {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入:");
        String msg = reader.readLine();
        System.out.println(msg);
    }
}

87 Scanner扫描流

JDK > 1.5

替代BufferedReader


构造函数

判断是否有数据 public boolean hasNext()

读取数据 public String next()

设置分隔符


import java.io.IOException;
import java.util.Scanner;
class Demo {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入年龄:");
        if(scanner.hasNextInt()){
            int age = scanner.nextInt();
            System.out.println("您输入的年龄是:" + age);
        } else{
            System.out.println("输入不正确");
        }
        scanner.close();
    }
}

可以结合正则进行判断验证


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Scanner;
class Demo {
    public static void main(String[] args) throws ParseException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入生日:");
        if (scanner.hasNext("\\d{4}-\\d{2}-\\d{2}")) {
            String msg = scanner.next("\\d{4}-\\d{2}-\\d{2}");
            System.out.println("您输入的年龄是:" + new SimpleDateFormat("yyyy-MM-dd").parse(msg));
        } else {
            System.out.println("输入不正确");
        }
        scanner.close();
    }
}

读取文件


import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
class Demo {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner scanner = new Scanner(new File("demo.txt"));
        // 设置换行分隔符
        // scanner.useDelimiter("\n");
        while (scanner.hasNext()) {
            System.out.println(scanner.next());
        }
        scanner.close();
    }
}

开发中:

输出使用PrintWriter打印流

输入使用Scanner扫描流


第19 章 : 对象序列化

88 对象序列化基本概念

对象序列化:

将内存中保存的对象以二进制数据的形式处理,

实现对象的保存或者网络传输


保存到文件
堆内存 - 二进制转换 ->  保存到数据库
                     发送到服务器

要序列化的对象必须实现java.io.Serializable 接口

没有任何方法,只是描述一种能力


示例

import java.io.Serializable;
class Person implements Serializable {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

89 序列化与反序列化处理

继承关系


InputStream(ObjectInput, ObjectStreamConstants)
    -ObjectInputStream
OutputStream(ObjectOutput, ObjectStreamConstants)
    -ObjectOutputStream

代码示例


import java.io.*;
class Person implements Serializable {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
class Demo {
    private static final File  SAVE_FILE = new File("demo.person");
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person person = new Person("Tom", 23);
        // saveObject(person);
        System.out.println(loadObject());
        // Person@15aeb7ab
    }
    // 序列化
    public static void saveObject(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
        oos.writeObject(obj);
        oos.close();
    }
    // 反序列化
    public static Object loadObject() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SAVE_FILE));
        Object obj = ois.readObject();
        ois.close();
        return obj;
    }
}

实际开发中不直接操作ObjectInputStream、ObjectOutputStream


90 transient关键字

表示进行序列化处理时,不处理被transient关键字修饰的字段

不常用,知道即可


IO继承体系整合


// 字节流:
OutputStream(Closeable, Flushable)
    -FileOutputStream
    -ByteArrayOutputStream
    -PipedOutputStream
    -FilterOutputStream
        -PrintStream
    -ObjectOutputStream
InputStream(Closeable)
    -FileInputStream
    -ByteArrayInputStream
    -PipedInputStream
    -ObjectInputStream
// 字符流:
Writer(Appendable, Closeable, Flushable)
    -OutputStreamWriter
        -FileWriter      
    -CharArrayWriter
    -PipedReader
    -PrintWriter
    -BufferedWriter
Reader(Readable, Closeable)
    -InputStreamReader
        -FileReader
    -CharArrayReader
    -PipedWriter
    -BufferedReader
相关文章
|
26天前
|
存储 分布式计算 Oracle
Java初级学习路线
本文为Java初学者提供了一条清晰、系统的学习路线,从环境搭建到实战练习,涵盖了Java基础语法、面向对象编程、常用API、异常处理及项目实践,助你从零开始掌握Java编程,打下坚实基础。
|
2月前
|
Java 编译器 API
Java 密封类:精细化控制继承关系
Java 密封类:精细化控制继承关系
265 83
|
20天前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
172 3
|
3月前
|
IDE Java 数据挖掘
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
176 35
|
3月前
|
前端开发 JavaScript Java
Java 学习路线规划及项目案例中的技术栈应用解析
内容包括:**Java 17核心特性**(如sealed class、record)与模块化开发;Spring Boot 3 + Spring Cloud微服务架构,涉及响应式编程(WebFlux)、多数据库持久化(JPA、R2DBC、MongoDB);云原生技术**如Docker、Kubernetes及CI/CD流程;性能优化(GraalVM Native Image、JVM调优);以及前后端分离开发(Vue 3、Spring Boot集成)。通过全栈电商平台项目实战,掌握从后端服务(用户、商品、订单)到前端应用(Vue 3、React Native)的全流程开发。
149 9
|
3月前
|
消息中间件 Java 微服务
2025 版 Java 学习路线实战指南从入门到精通
《Java学习路线实战指南(2025版)》是一份全面的Java开发学习手册,涵盖基础环境搭建、核心语法与新特性、数据结构与算法、微服务架构、云原生技术栈、AI融合及项目实战。内容包括JDK安装配置、IntelliJ IDEA设置、Records类与模式匹配增强、LeetCode题解、Spring Cloud微服务开发、Kubernetes部署、OpenAI API调用等。结合在线商城系统案例,采用Vue 3、Spring Boot 3.5、MySQL、Elasticsearch等技术,提供从理论到实践的完整路径,助力开发者掌握2025年最新趋势与最佳实践。
309 4
|
21天前
|
Java 数据库连接 微服务
零基础自学 Java 全栈必备最全学习路线及知识清单方向指引
本文为零基础学习者提供完整的Java全栈学习路线,涵盖Java基础、进阶、框架、项目实战及拓展方向,助你系统掌握全栈开发技能,快速成长为优秀Java工程师。
150 6
|
20天前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
114 0
|
23天前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
68 0