一、 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();
}
}