转换流,顾名思义,就是将字节流转换成字符流。通常用于处理中文乱码问题。
先写一个乱码问题,用于引出转换转换流。
- package com.io.transformation;
-
- import java.io.BufferedInputStream;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
-
- public class CodeQuestion {
- public static void main(String[] args) throws IOException {
- String filePath = "e:\\a.txt";
- BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
- String s = bufferedReader.readLine();
- System.out.println("读取到的内容为:"+s);
- bufferedReader.close();
- }
- }
这是一个简单的使用Buffered处理流读取文本文件。
运行结果:
这么写没啥问题,但是,如果将文本文件的编码改成ANSI国标码,就会出现乱码。
这时候再看运行结果:
出现乱码了。
这个时候,就需要我们使用转换流InputStreamReader。
1. InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成字符流(Reader)
2.当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题, 所以建议将字节流转换成字符流
3.可以在使用时指定编码格式(比如utf-8, gbk , gb2312, IS08859-1等)
看代码:
- package com.io.transformation;
-
- import java.io.*;
-
- public class InputStreamReader_ {
- public static void main(String[] args) throws Exception {
- String filePath = "e:\\a.txt";
- InputStreamReader gbk = new InputStreamReader(new FileInputStream(filePath), "gbk");
- BufferedReader br = new BufferedReader(gbk);
- String s = br.readLine();
- System.out.println("读取到的内容为:"+s);
- br.close();
- }
- }
先使用转换流指定编码方式,在放入到BufferedReader中。
这样再来运行:
成功。
- package com.io.transformation;
-
- import java.io.*;
-
- public class OutputStreamWriter_ {
- public static void main(String[] args) throws IOException {
- String filePath = "e:\\zhong.txt";
- String charset = "gbk";
- OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), charset);
- osw.write("hi,华子");
- osw.close();
- System.out.println("按照"+charset+"编码方式保存文件成功");
- }
- }
1)专门用于读写配置文件的集合类:
配置文件的格式: 键=值 键=值
2)注意:键值对不需要有空格,值不需要用引号一起来。 默认类型是String
load:加载配置文件的键值对到Properties对象
list:将数据显示到指定设备
getProperty(key):根据键获取值
SetProperty(key,value):设置键值对到Properties对象
store:将Properties中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码
看代码:
- package com.io.properties;
-
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
-
- /**
- * @author 华子
- *
- */
- public class Properties01 {
- public static void main(String[] args) throws IOException {
- String line ="";
- // 读取配置文件 mysql.properties
- BufferedReader br = new BufferedReader(new FileReader("F:\\IdeaProjects\\JavaSE\\Java基础语法\\src\\mysql.properties"));
- while((line = br.readLine())!=null){
- String[] split = line.split(":");
- // 如果要求值读ip的值
- if("ip".equals(split[0])){
- System.out.println(split[0]+"的值是:"+split[1]);
- }
- }
- br.close();
- }
- }
配置文件信息:
运行结果:
如果要求只读IP的值,较为复杂。
- package com.io.properties;
-
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.IOException;
- import java.util.Properties;
-
- /**
- * Properties 读文件
- */
- public class Properties02 {
- public static void main(String[] args) throws IOException {
- // 1.创建一个Properties对象
- Properties properties = new Properties();
- // 2.加载指定配置文件
- properties.load(new FileReader("F:\\IdeaProjects\\JavaSE\\Java基础语法\\src\\mysql.properties"));
- // 3.把键值对打在控制台
- properties.list(System.out);
- System.out.println("--------------------");
- // 4.通过键获取值
- String user = properties.getProperty("user");
- String pwd = properties.getProperty("pwd");
- System.out.println("用户名="+user);
- System.out.println("密码="+pwd);
- }
- }
运行结果:
- package com.io.properties;
-
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Properties;
-
- /**
- * 通过Properties 创建配置文件,修改配置文件内容
- */
- public class Properties03 {
- public static void main(String[] args) throws IOException {
- Properties properties = new Properties();
- // 创建
- properties.setProperty("charset","utf-8");
- properties.setProperty("user","汤姆");
- properties.setProperty("pwd","abc111");//注意保存文件时,是中文的Unicode编码
- properties.store(new FileOutputStream("F:\\IdeaProjects\\JavaSE\\Java基础语法\\src\\mysql02.properties"),"这是配置文件的注释");
- System.out.println("保存配置文件成功");
- properties.clear();
- }
- }
使用stroe可以指定注释内容,也可以写null
创建出来的配置文件如图: