高级流:都需要底层流支持,在其基础上增强功能
转换流:桥转换流:内存和硬盘间,进行字节和字符间互相转换的流
- 字符编码:编码与解码格式不一时,乱码
- UTF-8万国码,一个汉字三个字节
package com.li.changGe.ioStream.functionStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class InputStreamReadAndOutputStreamWriterDemo01 {
public static void main(String[] args) throws Exception {
/**
* 构建对象时注明编码格式
*
* 读取时将文件中的数据变成utf-8的编码,
* 写出时变成gbk的编码
*/
InputStreamReader input = new InputStreamReader(new FileInputStream("C:\\Users\\林木\\Desktop/test.txt"),"utf-8");
//windows上的文件保存时,ANSI编码就是gbk编码
OutputStreamWriter output = new OutputStreamWriter(new FileOutputStream("C:\\Users\\林木\\Desktop/test1.txt"),"gbk");
int count;
while ((count = input.read()) != -1){
//O ever youthful,永远热泪盈眶!
System.out.print((char)count);
//O ever youthful,永远热泪盈眶!
output.write((char)count);
output.flush();
}
}
}
打印流:主要用来将数据打印到文件中
-
PrintStream中还含有部分操作字节的方法
-
当操作二进制文件时用它更好一些
-
PrintWriter就没有了操作字节的方法
-
主要操作文本文件
package com.li.changGe.ioStream.functionStream;
import java.io.*;
public class PrintStreamWriterDemo01 {
public static void main(String[] args) throws Exception{
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\林木\\Desktop/UID.jpg");
/**
* 可以直接用字符串来构建流
*/
PrintStream printStream = new PrintStream(new FileOutputStream("C:\\Users\\林木\\Desktop/1.jpg"), true);
PrintWriter printWriter = new PrintWriter(new FileWriter("C:\\Users\\林木\\Desktop/test1.txt"),true);
//--------------------------------------------------------------------------------------------------
byte[] bytes = new byte[1024];
int count;
/**
* PrintStream中还含有部分操作字节的方法
* 当操作二进制文件时用它更好一些
*/
while ((count = fileInputStream.read(bytes)) != -1){
printStream.write(bytes,0,count);
}
//-----------------------------------------------------------------
/**
* PrintWriter就没有了操作字节的方法
* 主要操作文本文件
*/
//原样打印到文件中去:97
printWriter.println(97);
//写需要刷新,而且会自己int转换char
printWriter.write((int)97);//a
printWriter.flush();
}
}
配置文件流:只存字符串的流,键值对模式.
-
一般用来存储配置信息
-
一般将配置文件设为后缀名.properties
-
这种文件中一般不能有中文:各种程序间的编码不同可能因为乱码而报错
-
如连接数据库时的属性配置
package com.li.changGe.ioStream.functionStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
public class PropertiesDemo01 {
public static void main(String[] args) throws Exception{
Properties properties = new Properties();
properties.setProperty("name","长歌");
properties.setProperty("age","18");
properties.setProperty("sex","女");
//--------------------------------------------------
//获取所有字符串形式的键
Set<String> set = properties.stringPropertyNames();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String next = iterator.next();
/**
* 18
* 长歌
* 女
*/
System.out.println(properties.get(next));
}
//------------------------------------------------
PrintWriter printWriter = new PrintWriter("C:\\Users\\林木\\Desktop/a.txt");
/**
* 将流中的数据传到输出流中
*
* -- listing properties --
* age=18
* name=长歌
* sex=女
*/
properties.list(printWriter);
printWriter.flush();
//----------------------------------------------
FileWriter fileWriter = new FileWriter("C:\\Users\\林木\\Desktop/a.txt", true);
/**
* 写出到文件,可以加注释
*
* #fileOutput
* #Tue Mar 15 19:49:07 CST 2022
* age=18
* name=长歌
* sex=女
*/
properties.store(fileWriter,"fileOutput");
//---------------------------------------------------------
FileReader fileReader = new FileReader("C:/Users/林木/Desktop/a.txt");
/**
* 从流中加载数据
* 被注释的数据获取不到
*/
properties.load(fileReader);
//Vector式获取元素
Enumeration<?> enumeration = properties.propertyNames();
System.out.println("加载数据:");
while (enumeration.hasMoreElements()){
Object o = enumeration.nextElement();
/**
* 加载数据:
* listing properties --
* 18
* 长歌
* 女
*/
System.out.println(properties.getProperty(String.valueOf(o)));
}
}//main
}