Java_22 字符流与字节流(IO流)③Properties集合、编码表

一、 Properties

Properties介绍

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

1、Hashtable的子类,map集合中的方法都可以用。
2、该集合没有泛型。键值都是字符串。
3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。
4、有和io流技术相结合的方法。

在这里插入图片描述

利用Properties存储键值对

import java.util.Map;
import java.util.Properties;
import java.util.Set;

/*
 * Properties:表示了一个持久的属性集,属性列表中每个键及其对应值都是一个字符串
 * 
 * 构造方法:
 * 		Properties() 
 */
public class PropertiesDemo2 {
	public static void main(String[] args) {
		//创建属性列表对象
		Properties prop = new Properties();
		//添加映射关系(使用Map的put方法)
		prop.put("CZBK001", "zhangsan");
		prop.put("CZBK002", "lisi");
		prop.put("CZBK003", "wangwu");
		
		//遍历属性列表
		//获取所有的key,通过key获取value
		Set<Object> keys = prop.keySet();
		for (Object key : keys) {
			Object value = prop.get(key);
			System.out.println(key + "=" + value);
		}
		System.out.println("------------------");
		//获取所有的结婚证对象
		Set<Map.Entry<Object,Object>> entrys = prop.entrySet();
		for (Map.Entry<Object, Object> entry : entrys) {
			Object key = entry.getKey();
			Object value = entry.getValue();
			System.out.println(key + "=" + value);
		}
	
	}
}

Properties与IO流结合使用

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;

/*
 * Properties和IO流结合的功能: 
			void load(Reader reader) 
			输出流:
			void list(PrintWriter out)只能接受打印流
			void store(Writer writer, String comments) 可以接受任意的流
 		
 *
 */
public class PropertiesDemo2 {
	public static void main(String[] args) throws IOException{
		//method();
		
		//method2();
		
		//创建属性列表对象
		Properties prop = new Properties();
		//添加映射关系,properties的添加映射:setProperty()
		prop.setProperty("CZBK001", "zhangsan");
		prop.setProperty("CZBK002", "lisi");
		prop.setProperty("CZBK003", "wangwu");
		//创建输出流对象
		FileWriter fw = new FileWriter("e.txt");
		
		//void store(Writer writer, String comments) 
		//String comments是对文件的描述,可置为null
		prop.store(fw, "hello world");
		
		
		//释放资源
		fw.close();
		
	
	}

	private static void method2() throws FileNotFoundException, IOException {
		//创建属性列表对象
		Properties prop = new Properties();
		//创建一个输入流对象
		FileReader fr = new FileReader("d.txt");
		
		//void load(Reader reader) 
		prop.load(fr);
		
		//释放资源
		fr.close();
		//读取结果存放在内存中,若想在命令行看到输出结果,需执行以下语句
		System.out.println(prop);
	}

	private static void method() throws FileNotFoundException {
		//创建属性列表对象
		Properties prop = new Properties();
		//添加映射关系
		prop.setProperty("CZBK001", "zhangsan");
		prop.setProperty("CZBK002", "lisi");
		prop.setProperty("CZBK003", "wangwu");
		
		//创建打印流对象
		PrintWriter out = new PrintWriter("d.txt");
		//void list(PrintWriter out)  
		prop.list(out);
		
		//释放资源
		out.close();
	}
}

二、编码表

编码表:把计算机底层的二进制数据转换成我们能看到的字符

	ASCII
	GB2312	---	GBK
	Unicode	所有的字符都占2个字节
	UTF-8	长度可变的码表

ANSI:本地编码表 gbk
Java中的字符串默认使用的ANSI(gbk)

乱码:编码保持前后一致即可解决

1、Java中字符串的编码

常用方法
构造方法(字节数组转字符串):

String():初始化一个新创建的 String 对象,使其表示一个空字符序列
String(byte[] bytes) 使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
String(byte[] bytes, Charset charset) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String

成员方法(字符串转字节数组)

getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
getBytes(Charset charset) 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

public class EncoderDemo {
	public static void main(String[] args) throws IOException   {
		//method();
		
		FileInputStream fis = new FileInputStream("a.txt");
		byte[] bys = new byte[1024];
		int len = fis.read(bys);
		//此时在命令行中输出结果为乱码,这是因为在文件a.txt中,存储的内容是UTF-8,而,读取时使用的是:Java中的字符串默认使用的ANSI(gbk),前后编码方式不一致导致乱码
		//System.out.println(new String(bys,0,len));
		//使用String指定解码方式
		System.out.println(new String(bys,0,len,"UTF-8"));
	}

	private static void method() throws UnsupportedEncodingException, FileNotFoundException, IOException {
		String s = "高薪就业";
		//byte[] bys = s.getBytes();//通过默认编码转换成数组
		byte[] bys = s.getBytes("UTF-8");
		
		FileOutputStream fos = new FileOutputStream("a.txt");
		fos.write(bys);
		fos.close();
	}

}

2、字符流中的编码

常见对象
InputStreamReader(InputStream in, CharsetDecoder dec) 创建使用给定字符集解码器的 InputStreamReader

OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使用给定字符集编码器的 OutputStreamWriter

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

/*
 * 字符流中的编码
 * 
 * 字符流 = 字节流 + 编码
 * 
 */
public class EncoderDemo2 {
	public static void main(String[] args) throws IOException {
		//method();
		//此时b.txt文件的编码方式为UTF-8
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8");
		//OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));此时在文件中会看到写进的数据为乱码状态,这是因为文件的编码方式改成了UTF-8,而字符串编码方式默认为GBK,所以会出现乱码状态,因此需要自定义声明编码方式
		String s = "二羊开泰";
		osw.write(s);
		
		osw.close();
		
	}

	private static void method() throws IOException, UnsupportedEncodingException {
	//此时b.txt文件的编码方式为UTF-8
		FileWriter fw = new FileWriter("b.txt");
		
		String s = "一帆风顺";
		//将字符串s的字符串数据转为字节数据,存储至bys字节数组中
		byte[] bys = s.getBytes("UTF-8");
		
		//fw.write(s);
		//将字节数组bys转换为String字符串数据,写进文件中
		fw.write(new String(bys));
		fw.close();
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_43801116/article/details/107650649