Java_IO——属性集与转换流

系列文章目录

Java_IO——概述
Java_IO——字节流
Java_IO——字符流
Java_IO——缓冲流
Java_IO——属性集与转换流
Java_IO——序列化与反序列化、打印流
Java_IO——IO异常的处理



属性集

java.util.Properties类继承了Hashtable,表示了一个持久的属性集,它可以保存在流中或从流中加载,属性列表中每一个键及其对应值都是一个字符串

  • Properties类是一个双列集合,key和value都是字符串
  • Properties类代表了一个持久的属性集,是唯一一个与IO流相结合的集合

方法

store,将集合中的临时数据,持久化写入到硬盘中

  • void store(Writer writer, String comments)
  • void store(OutputStream out, String comments)
    参数:
    • OutputStream out:字节输出流,不能写中文
    • Writer writer:字符输出流,能写中文
    • String comments:注释,用来解释保存的文件是干嘛的(不能写中文,会产生乱码,因为其默认编码是unicode,一般写“”空字符串)

使用:

  1. 创建Properties集合对象,添加数据
  2. 创建字节输出流/字符输出流对象,构造方法中要绑定输出的目的地
  3. 使用方法store,将集合中的临时数据,持久化写入到硬盘中
  4. 释放资源
private static void show02() throws IOException {
    //1.创建Properties集合对象,添加数据
    Properties prop = new Properties();
    prop.setProperty("赵丽颖","168");
    prop.setProperty("迪丽热巴","165");
    prop.setProperty("古力娜扎","160");
//   2.创建字节输出流/字符输出流对象,构造方法中要绑定输出的目的地
//   FileWriter fw = new FileWriter("D:\\***\\prop.txt");
//   3.使用方法store,将集合中的临时数据,持久化写入到硬盘中
//   prop.store(fw,"save Date");
//   4.释放资源
//   fw.close();
    prop.store(new FileOutputStream("D:\\***\\prop2.txt"),"save Date");
}

load,把硬盘中的文件(键值对),读取到集合中

  • void load(Reader reader)
  • void load(InputStream inStream)
    参数:
    • InputStream inStream:字节输入流,不能写中文
    • Reader reader:字符输入流,能写中文

使用:

  1. 创建Properties集合对象
  2. 使用方法load,把硬盘中的文件(键值对),读取到集合中
  3. 遍历Properties集合
private static void show03() throws IOException {
     //1.创建Properties集合对象
     Properties prop = new Properties();
     //2.使用方法load,把硬盘中的文件(键值对),读取到集合中
     prop.load(new FileReader("D:\\***\\prop.txt"));
     //3.遍历Properties集合
     Set<String> set = prop.stringPropertyNames();
     for (String K : set) {
         String V = prop.getProperty(K);
         System.out.println(K + "=" + V);
     }
 }

注意:

  1. 存储键值对的文件中,键与值默认的连接符号一般使用=(等号)或空格
  2. 存储键值对的文件中,可以使用#进行注释,被注释的键值对不会被读取
  3. 存储键值对的文件中,键与值默认都是字符串,不用再加引号

操作字符串的特有方法:

  • Object setProperty(String key, String value)
    调用 Hashtable方法 put 。
  • String getProperty(String key)
    使用此属性列表中指定的键(key)搜索属性,相当于get(key)。
  • Set stringPropertyNames()
    返回此属性列表中的一组键,其中键及其对应的值为字符串,相当于keySet方法

使用

  1. 创建Properties对象
  2. 使用setProperty添加数据
  3. 使用stringPropertyNames取出键,并存到Set集合中
  4. 遍历Set集合
private static void show01() {
    //创建Properties对象
    Properties prop = new Properties();
    //使用setProperty添加数据
    prop.setProperty("赵丽颖","168");
    prop.setProperty("迪丽热巴","165");
    prop.setProperty("古力娜扎","160");
    //使用stringPropertyNames取出键,并存到Set集合中
    Set<String> set = prop.stringPropertyNames();
    //遍历Set集合
    for (String K : set) {
        String V = prop.getProperty(K);
        System.out.println(K + "=" + V);
    }
}

转换流

字符编码和字符集

字符编码

  • 按照某种规则,将字符存储到计算机中,称为编码;
  • 反之,将存储在计算机中的二进制数按某种规则解析显示出来,成为解码

字符编码:就是一套自然语言的字符与二进制之间的对应规则
编码表:生活中文字和计算机中二进制的对应规则

字符集

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

  • 常见的字符集:
    [图片]

当编码确定了,对应的字符集就确定了

转换流的作用

使用FileReader读取GBK编码的文件就会出现乱码,此时就需要转换流

原理图解

[图片]

OutputStreamWriter类

java.io.OutputStreamWriter是字符流通向字节流的桥梁,它使用指定的charset(编码表)将写入流中的字符编码为字节,此类继承了Writer类

  • 构造方法:
    • OutputStreamWriter(OutputStream out)
      创建使用默认字符编码(UTF-8)的OutputStreamWriter
    • OutputStreamWriter(OutputStream out,String charsetName)
      创建使用指定字符编码的OutputStreamWriter
    • 参数:
      • OutputStream out:字节输出流
      • String charsetName:编码表名称(不区分大小写)

使用:

  1. 创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的字符集
  2. 使用Writer方法,将字节存储到缓冲区中
  3. 使用flush方法,将缓冲区中的字节刷新到文件中
  4. 释放资源
package DemoReverseStream;

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

public class Demo02OutputStreamWriter {
    public static void main(String[] args) throws IOException {
        write_utf_8();
        write_gbk();
    }

    private static void write_gbk() throws IOException {
        //1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的字符集
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\***\\gbk.txt"),"gbk");
        //2.使用Writer方法,将字节存储到缓冲区中
        osw.write("***");
        //3.使用flush方法,将缓冲区中的字节刷新到文件中
        osw.flush();
        //4.释放资源
        osw.close();
    }

    private static void write_utf_8() throws IOException {
        //1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的字符集
//        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\***\\utf-8.txt"),"utf-8");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\***\\utf-8.txt"));
        //2.使用Writer方法,将字节存储到缓冲区中
        osw.write("彭于晏");
        //3.使用flush方法,将缓冲区中的字节刷新到文件中
        osw.flush();
        //4.释放资源
        osw.close();
    }
}

InputStreamReader类

java.io.InputStreamReader类是字节流通向字符流的桥梁,它使用指定的charset(编码表)读取字节并将其解码为字符,此类继承了Reader类

  • 构造方法:
    • InputStreamReader(InputStream in)
      创建使用默认字符编码(UTF-8)的InputStreamReader
    • InputStreamReader(InputStream in,String charsetName)
      创建使用指定字符编码的InputStreamReader
    • 参数:
      • InputStream in:字节输入流
      • String charsetName:编码表名称(不区分大小写)

使用:

  1. 创建InputStreamReader对象,构造方法中传递字节输出流和指定的字符集
  2. 使用Reader方法读取文件
  3. 释放资源

注意:构造方法中的编码表要与文件的编码相同,否则会有乱码

package DemoReverseStream;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Demo03InputStreamReader {
    public static void main(String[] args) throws IOException {
        read_utf_8();
        read_gbk();
    }

    private static void read_gbk() throws IOException {
        //1.创建InputStreamReader对象,构造方法中传递字节输出流和指定的字符集
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\***\\gbk.txt"),"GBK");
        //2.使用Reader方法读取文件
        int len = 0;
        while ((len = isr.read()) != -1) {
            System.out.println((char) len);
        }
        //3.释放资源
        isr.close();
    }

    private static void read_utf_8() throws IOException {
        //1.创建InputStreamReader对象,构造方法中传递字节输出流和指定的字符集
//        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\***\\utf-8.txt"),"utf-8");
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\***\\utf-8.txt"));
        //2.使用Reader方法读取文件
        int len = 0;
        while ((len = isr.read()) != -1) {
            System.out.println((char) len);
        }
        //3.释放资源
        isr.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值