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: 最大的一张码表包含了所有的字符标准

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

相关推荐
饕餮争锋5 小时前
Spring AOP原理简析
java·spring
okseekw5 小时前
Maven从入门到实战:核心概念+配置详解+避坑指南
java·后端
tryxr5 小时前
ReentrantLock 与 synchronized 的区别
java··reentrantlock
Java爱好狂.5 小时前
Java面试Redis核心知识点整理!
java·数据库·redis·分布式锁·java面试·后端开发·java八股文
sheji34166 小时前
【开题答辩全过程】以 基于Java的应急安全学习平台的设计与实现为例,包含答辩的问题和答案
java·开发语言·学习
程序员小假6 小时前
我们来说一下消息的可靠性投递
java·后端
席之郎小果冻6 小时前
【04】【创建型】【聊一聊,建造者模式】
java·前端·建造者模式
原来是好奇心6 小时前
深入Spring Boot源码(四):Starter机制与依赖管理深度解析
java·源码·springboot·starter
阿杆6 小时前
如何在 Spring Boot 中接入 Amazon ElastiCache
java·数据库·redis