转换流作用:把字节流转化为字符流。
原因:在默认情况下,读取文件是按照utf-8编码,乱码的根本原因是没有指定读取文件的编码方式,而字节流是可以指定编码方式的。
转换流并没有创建新的流,用的是字节流,只是按照字符流的方式处理
InputStreamReader
该类是Reader的子类,它的构造器可以传入InputStream对象,而且可以指定处理的编码。
public class Translation_01 {
public static void main(String[] args) throws IOException {
//将字节流转化为字符流
String filename="D:\\file-study\\buffered.txt";
//把FileInputStream转化为InputStreamReader
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(filename), "gbk");
//把InputStreamReader转化为BufferedReader
BufferedReader bufferedRead = new BufferedReader(inputStreamReader);
String str;
while((str=bufferedRead.readLine())!=null){
System.out.println(str);
}
bufferedRead.close();
}
}
OutInputStreamReader
该类是Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流)
public class Translation_02 {
public static void main(String[] args) throws IOException {
//将字节流转化为字符流
String filename="D:\\file-study\\buffered.txt";
//把FileOutputStream转化为OutputStreamWriter
OutputStreamWriter outputStreamReader = new OutputStreamWriter(new FileOutputStream(filename), "gbk");
//把OutputStreamWriter转化为BufferedWriter
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamReader);
//写入数据
bufferedWriter.write("123我爱你");
bufferedWriter.close();
}
}
打印流
打印流只有输出流,没有输入流。
PrintStream
public class PrintS {
public static void main(String[] args) throws IOException {
PrintStream out=System.out;
//在默认情况下,PrintStream输出数据的位置是 标准输出,即显示器
out.println("hello");
/*
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
因为print底层调用的是write,所以我们可以直接调用write方法进行打印
* */
out.write("老师早上好".getBytes());
out.close();
//我们可以去修改打印流输出的位置/设备
//修改为打印到"D:\\file-study\\buffered.txt"文件中
System.setOut(new PrintStream("D:\\file-study\\buffered.txt"));
System.out.println("Hello");
}
}
PrintWriter
public class PrintW {
public static void main(String[] args) throws IOException {
PrintWriter printWriter = new PrintWriter(System.out);
printWriter.write("wokkkk");
printWriter.close();
PrintWriter printWriter1 = new PrintWriter(new FileWriter("D:\\file-study\\buffered.txt"));
printWriter1.write("wokkkk");
printWriter1.close();
}
}
Properties类
专门用于读取配置文件.properties的集合类,配置文件的格式:键=值
注意:键值对不需要有空格,值不需要用引号引起来,默认类型为String
Properties父类是HashTable,底层就是Hashtable的核心方法
Properties常见方法
方法名 | 作用 |
load | 加载配置文件的键值对到Properties对象中 |
list | 将数据显示到指定的设备 |
getProperty(key) | 根据键获取值 |
setProperties(key,value) | 设置键值对到Properties对象 |
store | 将Properties中的键值对存储到配置文件中,在idea中,如果信息中含有中文,会储存为unicode码。 |
public class Properties02 {
public static void main(String[] args) throws IOException {
//使用Properties类读取file.properties文件,得到ip,user,pwd
//1.创建Properties对象
Properties pro = new Properties();
//2.加载指定配置文件
pro.load(new FileReader("D:\\Java\\Idea-project\\IOStream\\IOStream-01\\src\\main\\resources\\file.properties"));
//3.把k-v显示到控制台
pro.list(System.out);
//4.根据key获取Value
String pwd=pro.getProperty("pwd");
System.out.println("密码是:"+pwd);
//使用Properties添加K-V到新文件file2.properties
//1.创建Properties对象
//如果该文件,没有key就是创建,有key就是修改
Properties pro1=new Properties();
//2.添加k-v
pro1.setProperty("charset","utf8");
pro1.setProperty("user","汤姆");//注意,保存时是unicode码值
pro1.setProperty("pwd","abc123");
//3.将k-v存储到文件中
String filepath="D:\\Java\\Idea-project\\IOStream\\IOStream-01\\src\\main\\resources\\file2.properties";
pro1.store(new BufferedWriter(new FileWriter(filepath)),"Hello");
}
}
综合案例
public class BufferedCopy {
public static void main(String[] args) {
String readpath="D:\\file-study\\buffered.txt";
String writepath="D:\\file-study\\buffered-copy.txt";
BufferedReader bufferedReader=null;
BufferedWriter bufferedWriter=null;
String line;
try {
bufferedReader=new BufferedReader(new FileReader(readpath));
bufferedWriter=new BufferedWriter(new FileWriter(writepath));
while((line=bufferedReader.readLine())!=null){
//每读入一行,写入一行
bufferedWriter.write(line);
//插入换行
bufferedWriter.newLine();
}
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
try {
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
public class HomeWork02 {
public static void main(String[] args) throws IOException {
String filepath="d:\\file-study\\story.txt";
//BufferedReader bufferedReader = new BufferedReader(new FileReader(filepath));
//若文件编码格式不是utf-8,而是gdk格式
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(filepath),"gbk");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
int i=0;
String str;
while((str=bufferedReader.readLine())!=null){
i++;
System.out.println(i+":"+str);
}
bufferedReader.close();
}
}
public class HomeWork03 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.创建Properties对象
Properties pro = new Properties();
//2.load文件
pro.load(new FileReader("D:\\Java\\Idea-project\\IOStream\\IOStream-01\\src\\main\\resources\\dog.properties"));
Dog dog = new Dog(pro.getProperty("name"), Integer.valueOf(pro.getProperty("age")), pro.getProperty("color"));
System.out.println(dog);
//将创建的对象序列化到文件
String filePath="d:\\file-study\\Object.dat";
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath));
objectOutputStream.writeObject(dog);
objectOutputStream.close();
//反序列化
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filePath));
Dog copyDog =(Dog)objectInputStream.readObject();
System.out.println(copyDog);
objectInputStream.close();
}
}