SpringMVC——IO笔记

1. IO概述

IO(Input/Output):输入和输出,指的是某个设备或环境进行数据的输入或者输出。

例如:键盘的输入,再比如显示器就是输出设备,输出图像。

对于java来说输入输出问题,java将它抽象成流对象来解决。

2. 流的分类

IO流在java中从输入输出角度分类:输入流、输出流

IO流在java中从数据的角度来分类:

**字符流:**文本,我们能读的懂的都可以认为是字符流。比如:文章,java文件等等

**字节流:**二进制的数据,这种数据一般用文本打开我们读不懂。比如,图片文件,mp3文件,等等。

3. 字符流

字符流的类的命名的规则:

如果是输出流就以Writer结尾

如果是输入流就以Reader结尾

4. 案例

使用字符流向一个文件输入helloworld。

步骤:

  1. 创建文件

  2. 创建输出流对象

  3. 把流指向指定的文件

  4. 释放资源

java 复制代码
public class IOTest {

    public static void main(String[] args) {

        //创建一个文件
        File file = new File("test.txt");
        Writer writer = null;

        try {
            //IO流是需要关闭的,如果不这样设计就会不能关闭资源
            writer = new FileWriter(file);
            writer.write("HelloWorld");


        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //判断writer不是空防止空指针异常
            if(writer != null) {
                try {
                    //关闭流
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

文件的追加

java 复制代码
public class IOTest4 {

    public static void main(String[] args) {


        Writer writer = null;

        try {
            //IO流是需要关闭的,如果不这样设计就会不能关闭资源
            //writer = new FileWriter("test1.txt", true);
            writer = new FileWriter(new File("test1.txt"), true);
            writer.write("liangliang");

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //判断writer不是空防止空指针异常
            if(writer != null) {
                try {
                    //在关闭前会做flush的事情
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

换行:

输出换行

把文本写入文件中\n代表换行

问题是不同的环境下换行的方式也不一样

Windows: \r\n

Linux:\n

Mac:\r

java 复制代码
public class IOTest5 {

    public static void main(String[] args) {

        //创建一个文件
        File file = new File("test.txt");
        Writer writer = null;
        try 
            //IO流是需要关闭的,如果不这样设计就会不能关闭资源
            writer = new FileWriter(file);
            for (int i = 0; i < 100; i++) {
                writer.write("HelloWorld\r\n");
                //每次写入10个helloworld的时候做一次flush
                if(i % 10 == 0){
                    writer.flush();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //判断writer不是空防止空指针异常
            if(writer != null) {
                try {
                    //在关闭前会做flush的事情
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Writer的五种写入的方法

java 复制代码
public class IOTest6 {
    public static void main(String[] args) {
        //创建一个文件
        File file = new File("test.txt");
        Writer writer = null;
        try {
            writer = new FileWriter(file);
            //定义一个数组
            char[] c = {'a','b','p','b','p'};
            /*writer.write(c);

            //把数组中的一部分写入文件
            writer.write(c, 2, 2);

            writer.write(97);
            */

            writer.write("helloworld", 2, 2);

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

5. 字符流转向字节流的桥梁

Ascii中GBK码表

UTF-8码表

java 复制代码
public class ConverterDemo {

    public static void main(String[] args) {
        //创建字符流转换字节流的桥梁的对象
        OutputStreamWriter ow = null;

        try {
            //ow = new OutputStreamWriter(new FileOutputStream("b.txt"));
        	//字符流通向字节流的桥梁可以指定存储的编码
            ow = new OutputStreamWriter(new FileOutputStream("b.txt"),"GBK");
            ow.write("中");
            ow.flush();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(ow != null){
                    ow.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

6. Properties

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

特点:

1.继承于Hashtable,是线程安全的键值对存储结构

  1. Properties 可保存在流中或从流中加载

  2. 只能保存字符串的键值对。

实战应用

java 复制代码
public class PropTest6 {
    public static void main(String[] args) {
        //创建一个Properties对象
        Properties prop = new Properties();
        InputStream in = null;
        try {
            //in = new FileReader("src/names.properties");                  in=PropTest6.class.getClassLoader().getResourceAsStream("names.properties");
             //从字节流中来加载数据到属性对象中
            prop.load(in);
            System.out.println(prop);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(in != null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

7. 序列化流

序列化流:

对象输出流:ObjectOutputStream 将 Java 对象写入 OutputStream。

对象输入流:ObjectInputStream 对以前使用 ObjectOutputStream 写入的对象进行反序列化。

序列化的对象需要实现序列化接口,实现public class Person implements Serializable {}

如果要是对多个对象来做序列化,一定要放在集合中。

8. 字符编码

存储:在计算机中存储字符都是存储的字符所对应的数值以二进制的形式表示。

展示:去相关的编码表中去查找该值(存储的值)所对应的字符。

GBK :用于存储中文的码表

UTF-8: 最大的一张码表包含了所有的字符标准

注意:用什么编码,就要用什么解码

相关推荐
lcu1112 小时前
Java 学习40:继承
java
p***q782 小时前
【保姆级教程】apache-tomcat的安装配置教程
java·tomcat·apache
2501_941148612 小时前
C++实时数据处理实战:多线程与异步IO结合高性能代码解析
java·后端·struts
u***u6852 小时前
C++在系统中的异常处理
java·开发语言·c++
空空kkk2 小时前
SpringMVC——拦截器
java·数据库·spring·拦截器
文涛是个小白呀2 小时前
Java集合大调研
java·学习·链表·面试
我也爱吃馄饨3 小时前
写的webpack插件如何适配CommonJs项目和EsModule项目
java·前端·webpack
Seven973 小时前
剑指offer-43、左旋转字符串
java
梵得儿SHI3 小时前
(第七篇)Spring AI 基础入门总结:四层技术栈全景图 + 三大坑根治方案 + RAG 进阶预告
java·人工智能·spring·springai的四大核心能力·向量维度·prompt模板化·向量存储检索