转换流:
什么是转换流?
转换流,顾名思义,就是将字节流转换成字符流。通常用于处理中文乱码问题。
先写一个乱码问题,用于引出转换转换流。
CodeQuestion.java:
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。
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中。
这样再来运行:
成功。
OutputStreamWriter:
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+"编码方式保存文件成功");
}
}
Propertise:
定义:
1)专门用于读写配置文件的集合类:
配置文件的格式: 键=值 键=值
2)注意:键值对不需要有空格,值不需要用引号一起来。 默认类型是String
常见方法:
load:加载配置文件的键值对到Properties对象
list:将数据显示到指定设备
getProperty(key):根据键获取值
SetProperty(key,value):设置键值对到Properties对象
store:将Properties中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码
看代码:
传统方法Buffered读配置文件:
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的值,较为复杂。
Properties读配置文件:
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);
}
}
运行结果:
Properties创建和修改配置文件 :
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
创建出来的配置文件如图: