安安静静学JAVA(十二)

标准的异常处理

jdk1.6及以前

    1. 让流尽量能关闭, 所以将关流的代码放到finally中
    1. 变量作用域的问题 -> 把流的声明, 写在try的外面, try里面做赋值
    1. 局部变量没有默认值, 使用前必须赋值 -> 定义流时, 给初始值为null
    1. close方法也有编译时异常 -> 分开进行try-catch
    1. 在关闭流之前, 做非空判断 -> inn => enter
    1. 为了保证流尽量能关一个就关一个 -> 关流的时候, 加上finally

jdk1.7后

    1. 把创建流的代码, 放到小括号中
    1. 把读写的代码, 放到大括号中
    1. 把关流的代码, 删掉
  • 多个了流关闭
    在这里插入图片描述

    • 实例代码
      在这里插入图片描述

属性集:Properties

概念:java.util.Properties 继承于Hashtable ,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其对应值都是一个字符串。该类也被许多Java类使用,比如获取系统属性时,System.getProperties 方法就是返回一个Properties对象。

构造方法:public Properties() :创建一个空的属性列表。

Properties作为双列集合的使用

  • setProperty(String key, String value):保存一对属性
  • getProperty(String key):使用此属性列表中指定的键搜索属性值。
  • public Set stringPropertyNames() :所有键的名称的集合。

Properties作为配置文件的使用((操作的配置文件一般以.properties结尾))

  • load(InputStream):从字节输入流中读取键值对。
  • load(Reader)
  • store(输出流, String 注释)

缓冲流

概述

  • 缓冲流, 相当于给FileInputStream/FileOutputStream … 进行了包装, 让他们拥有了更强大的功能.
  • 缓冲(缓冲区) : 数组
  • 缓冲流的内部, 自带数组.
  • 使用数组的方式缓冲流是最快的

字节流

  • BufferedInputStream:缓冲字节输入流, 带缓冲区的字节输入流, 高效字节输入流
  • BufferedOutputStream 高效字节输入流
    在这里插入图片描述自带长度为8192的字节数

字符流

  • BufferedReader

    • readLine00():读取一行文本, 读取到换行符, 代表一行结束, 读取到的内容是不包含换行符
  • BufferedWriter

    • newLine():写出跨平台的换行符

转换流(字符流)

概述:

计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本f符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。

字符编码于字符集

  • 字符编码Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则

  • 字符集 Charset:也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。

    • 拓展:

      • ASCII字符集在这里插入图片描述

      • GBxxx字符集在这里插入图片描述

      • Unicode字符集在这里插入图片描述在这里插入图片描述

InputStreamReader

  • 字节流通向字符流的桥梁
  • 通过指定的字符集, 将字节转换成字符
  • 方法:
    InputStreamReader(InputStream in, String charsetName)`: 创建一个指定字符集的字符流。

OutputStreamWriter

  • 字符流通向字节流的桥梁
  • 通过指定的字符集, 将字符转换成字节
  • 方法:
    OutputStreamWriter(OutputStream in, String charsetName)`: 创建一个指定字符集的字符流。

通过转换流读取GBK的文件, 写出到UTF-8中, 或者反过来

序列化

序列化, 对象输出流(将内存中的对象, 写到硬盘 -> 输出流)

  • ObjectOutputStream(OutputStream out):创建一个指定OutputStream的ObjectOutputStream。
  • writeObject(Object obj):将指定的对象写出。

反序列化, 对象输入流(反序列化: 将硬盘中的对象, 读取到内存 -> 输入流)

  • ObjectInputStream(InputStream in):创建一个指定InputStream的ObjectInputStream。
  • readObject():读取一个对象。

注意事项:

    1. 先输出, 再输入。否则会出现 StreamCorruptedException: invalid stream header:
      原因: 没有序列化, 就直接反序列化序列化之后对文件进行修改
    1. 被序列化的对象, 对应的类必须实现Serializable接口在这里插入图片描述
    1. 序列化反序列化的过程中, 不能改变序列化的类(保证class文件相同),h会抛出抛出一个InvalidClassException异常在这里插入图片描述

打印流

PrintStream

  • System.out

    • 标准的输出流, 默认指向控制台

InputStream

  • System.in

    • 标准的输入流, 默认指向控制台

Commons-IO

导包

IOUtils

  • copy(输入流, 输出流)

FileUtils

  • copyFileToDirectory(File src, File dest):把文件复制到指定文件夹中
  • copyDirectoryToDirectory(File src, File dest):把文件夹复制到指定文件夹中

装饰设计模式

解决的问题

  • 在不改变原有类的基础上, 对对象的功能进行增强
public interface Man {
    void eat();
    void sleep();
    void fight();
}

public class NormalMan implements Man {
    @Override
    public void eat() {
        System.out.println("一天吃3顿饭");
    }

    @Override
    public void sleep() {
        System.out.println("一天睡7小时");
    }

    @Override
    public void fight() {
        System.out.println("战五渣...");
    }
}

public class IronMan implements Man {

    // 将被装饰类作为装饰类中的成员变量
    private NormalMan normalMan;

    // 通过构造方法赋值
    public IronMan(NormalMan normalMan) {
        this.normalMan = normalMan;
    }

    @Override
    public void eat() {
        // 不需要增强的方法, 直接调用
        normalMan.eat();
    }

    @Override
    public void sleep() {
        normalMan.sleep();
    }

    @Override
    public void fight() {
        System.out.println("战五渣进化--- 战秒全!!!");
    }
}
public class Demo01 {
    public static void main(String[] args) {
        // BufferedInputStream bis = new BufferedInputStream(new FileInputStream())
        IronMan ironMan = new IronMan(new NormalMan());
        ironMan.eat();
        ironMan.sleep();
        ironMan.fight();

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值