1.缓冲流的概述
- 缓冲流也称为高效流,或者高级流.之前学习的字节流可以称为原始流;
- 作用:缓冲流自带缓冲区,可以提高原始字节流,字节流读写数据的性能;
2.字符文件输入流
//目标:学会字符文件输入流提高字符输入流的性能,新增了按照行读取的方法
public static void main(String[] args) {
try (
//1.定义一个原始的字符输入流读取文字
Reader fr = new FileReader("src/date01.txt");
//a.把低级的字符输入流包装成缓冲字符输入流
BufferedReader bfr = new BufferedReader(fr);
) {
//3.缓冲字符输入流多了按照行读取数据的功能
String line;
while ((line= bfr.readLine())!=null){
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
3. 字符文件输出流
//1.创建一个字符输出流管道与目标文件接通
BufferedWriter bfw=new BufferedWriter(new FileWriter("src/date.txt",true));
//a.写一个字符
bfw.write(97);
bfw.write('男');
bfw.write("徐");
bfw.write("\r\n");//换行
//b.写一个字符串出去
bfw.write("黑马程序员");
bfw.newLine();
// bfw.write("\t\n");
//c.写一个字符数组出去
char[] buffer="我爱中国aaaa".toCharArray();
bfw.write(buffer);
bfw.newLine();
//bfw.write("\r\n");//换行
//d.写一部分字符串出去
bfw.write(buffer,0,2);
bfw.newLine();
//bfw.write("\r\n");//换行
//e.写一部分字符串出去
bfw.write(buffer,2,2);
bfw.newLine();
//bfw.write("\r\n");//换行
bfw.close();
3.不同编码之间读取乱码问题
- 使用字符输入转换流
- 可以提取文件(GBK)的原始字节流,原始字节不会存在问题
- 然后把字节流以指定编码转换成字符输入流,这样字符输入流 中的字符就不会乱码了
4.字节输入转换流:InputStreamReader
- 可以解决字符流读取不同编码乱码的问题
- public InputStreamReader(InputStream is,String charset):可以指定编码把原始字节流转换成字符流,如此字符流中的字符不会乱码.
try(
//会乱码,编码语言不一样,编码UTF-8,文件编码GBK
//1.提取原始文件的字节流(GBK字节流)
InputStream is=new FileInputStream("C:\\ZM下载的内容\\11111.txt");
//2.把字节输入流转换成字符输入流:使用字符输入流转换
Reader isr=new InputStreamReader(is,"GBK");
//3.把低级的字符输入流转换为缓冲字符流
BufferedReader br=new BufferedReader(isr);
){
String line;
while ((line=br.readLine())!=null){
System.out.print(line);
}
}catch (Exception e){
e.printStackTrace();
}
5.字节输出转换流:OutputStreamReader
- public OutputStreamReader(OutputStream os,String charset)可以指定编码把字节输出流转换成字符输出流,从而可以指定写出去的字符编码;
try {
//1.指定写出去的字符是:GBK
OutputStream os=new FileOutputStream("src/date6.txt");
//2.自己指定字节写出去
//os.write("我爱中国".getBytes("GBK"));
//3.新方案:把字符输出流指定编码转换成字符输出转换流
OutputStreamWriter osw=new OutputStreamWriter(os,"GBK");
BufferedWriter bw=new BufferedWriter(osw);
bw.write("aaa哈哈哈");
System.out.print("写入成功~~");
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
6.对象序列化
- 以内存为基准,把内存中的对象存储到磁盘文件中去
- 使用到的流是对象字节输出流:ObjectOutputStream
7.对象序列化:
把对象数据存入到文件中去,使用 对象字节输出流:ObjectOutputStream
序列化对象的要求是:对象必须实现序列化接口.
//创建一个学生对象
Student st=new Student("张三","zhangsan",12345);
//使用对象字节输出流
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("src/date01.txt"));
oos.writeObject(st);
oos.close();
8.对象反序列化
- 对象字节输出流:ObjectOutputStream
- 以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象;
//创建一个对象字节输入流管道与源文件接通
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("src\\date01.txt"));
Student st =(Student) ois.readObject();
System.out.print(st);
ois.close();
- 注意:密码一般不进行序列化,这是应该对象中添加修饰符transient
- 如果需要序列化多个对象,则使用List集合,List集合继承了Serializable
//使用transient修饰的变量将不再参与序列化!
private transient int passWord;
9.打印流
- 打印流可以实现方便,高效的打印数据到文件中去.打印流一般指的是PrintStream,PrintWriter两个类
- 可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印Boolean的true,写出去就是true
PrintStream,PrintWriter的区别
- 打印数据功能上是一摸一样的,都是使用方便,性能高效(核心优势)
- PrintStream继承字节输出流OutputStream,支持字节数据的方法
- PrintWriter结成字符输出流Writer,支持写字符数据出去
//用来打印字节
PrintStream ps=new PrintStream("src/date02.txt");
//用来打印字符
PrintWriter pw=new PrintWriter("src/date02.txt");
//两者使用上没什么区别
pw.print("我是张三");
pw.print(97);
pw.print('a');
pw.print(90.3);
pw.close();
9.打印流的重定向
改变系统的打印流成为自己的打印流,打印到指定文件中去
//改变系统的打印流成为自己的打印流
PrintStream ps=new PrintStream("src/date02.txt");
System.setOut(ps);
System.out.print(2222);
10.Properties属性集对象
其实就是一个Map集合,但是我们一般不会当集合使用,因为HashMap更好用
Properties的核心作用是
- Properties代表的是一个属性文件,可以把自己对象中的键值对信息存入到一个属性文件中去.
- 属性文件:后缀是.properties结尾的文件,里面的内容都是key=value,后续做系统配置信息的
存入属性文件中键值对信息
Properties pp=new Properties();
pp.setProperty("admin","123456");
pp.setProperty("张三","zhangsan01");
System.out.print(pp);
//存入到文件中去
pp.store(new FileWriter("src/date02.properties"),"aaaaa");
从属性文件中读取键值对信息
//需求:从属性文件中读取键值对信息
Properties properties=new Properties();
System.out.print(properties);
//加载属性文件中的键值对信息到properties中
properties.load(new FileReader("src/date02.properties"));
System.out.println(properties.getProperty("admin"));
//取所有键的值
Set<String> keys=properties.stringPropertyNames();
System.out.println(keys);
11.Properties的应用
Properties properties=new Properties();
//加载属性文件
properties.load(new FileReader("src/date.txt"));
//修改名字为秋雅的年龄为18岁
if(properties.containsKey("秋雅")){
properties.setProperty("秋雅","18");
}
//存入到文件中去
properties.store(new FileWriter("src/date.txt"),"");
12.Commons-IO框架
导入commons-io-2.6.jar做开发
需求:使用commons-io简化io流读写
- 分析:
- ①在项目中创建一个文件夹:lib
- ②将commons-io-2.6.jar文件复制到lib文件夹
- ③在jar文件上右键,选择add-as-Library->点击OK
- ④在类中导包使用
//1.完成文件复制
IOUtils.copy(new FileInputStream("src/date01.txt"),
new FileOutputStream("src/date011.txt"));
//2.完成复制到文件夹下
FileUtils.copyFileToDirectory(new File("C:\\ZM下载的内容\\积分告警需求.xlsx"),
new File("C:\\YPP练习"));
System.out.print("复制成功");
//3.完成复制文件夹到文件夹
FileUtils.copyDirectoryToDirectory(new File("C:\\YPP练习"),
new File("C:\\YPP练习1"));
FileUtils.deleteDirectory(new File("C:\\YPP练习1"));
//4.JDK1.7开始 自己也做了一些一行代码就可以完成复制的操作:New IO的技术
Files.copy(Path.of("C:\\YPP练习"),Path.of("C:\\YPP练习1"));