JavaSE学习笔记(十)IO流_part2

1 缓冲流

  • 缓冲流也称为高效流、或者高级流;之前的字节流可以称为原始流
  • 作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能

IO流_缓冲流

1.2 字节缓冲流

字节缓冲流性能优化原理:

  • 字节缓冲输入流自带了8KB缓冲池,以后我们直接从缓冲池读取数据,所以性能较好
  • 字节缓冲输出流自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了
构造器说明
public BufferedInputStream​(InputStream is)可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道,从而提高字节输入流读数据的性能
public BufferedOutputStream​(OutputStream os)可以把低级的字节输出流包装成一个高级的缓冲字节输出流管道,从而提高写数据的性能

功能上并无很大变化,性能提升了

try (
    // 这里面只能放置资源对象,用完会自动关闭:自动调用资源对象的close方法关闭资源(即使出现异常也会做关闭操作)
    // 1、创建一个字节输入流管道与原视频接通
    InputStream is = new FileInputStream("D:\\resources\\newmeinv.jpeg");
    // a.把原始的字节输入流包装成高级的缓冲字节输入流
    InputStream bis = new BufferedInputStream(is);
    // 2、创建一个字节输出流管道与目标文件接通
    OutputStream os = new FileOutputStream("D:\\resources\\newmeinv222.jpeg");
    // b.把字节输出流管道包装成高级的缓冲字节输出流管道
    OutputStream bos = new BufferedOutputStream(os);
) {
    // 3、定义一个字节数组转移数据
    byte[] buffer = new byte[1024];
    int len; // 记录每次读取的字节数。
    while ((len = bis.read(buffer)) != -1){
        bos.write(buffer, 0 , len);
    }
    System.out.println("复制完成了!");

} catch (Exception e){
    e.printStackTrace();
}

1.3 字符缓冲流

  • 作用:提高字符输入流读取/写数据的性能,除此之外多了按照行读取数据的功能
构造器说明
public BufferedReader(Reader r)可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能
public BufferedWriter​(Writer w)可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能

字符缓冲输入流新增功能

方法说明
public String readLine()读取一行数据返回,如果读取没有完毕,无行可读返回null
public void newLine()换行操作
try (
      // 1、创建一个文件字符输入流与源文件接通。
      Reader fr = new FileReader("io-app2/src/data01.txt");
      // a、把低级的字符输入流包装成高级的缓冲字符输入流。
      BufferedReader br = new BufferedReader(fr);
      ){
//  2、用循环,每次读取一个字符数组的数据。  1024 + 1024 + 8
//   char[] buffer = new char[1024]; // 1K字符
//   int len;
//   while ((len = br.read(buffer)) != -1) {
//      String rs = new String(buffer, 0, len);
//      System.out.print(rs);
//   }

    String line;
    while ((line = br.readLine()) != null){
        System.out.println(line);
    }
} catch (IOException e) {
  e.printStackTrace();
}

字符缓冲流自带8K缓冲区
可以提高原始字符流读写数据的性能

2 转换流

IO流体系结构_转换流

  • 作用:防止用UTF-8编码方式代码读取GBK编码方式文件产生乱码

必须文件和代码编码一致才不会乱码

构造器说明
public InputStreamReader(InputStream is)可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,与默认的FileReader一样
public InputStreamReader(InputStream is ,String charset)可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点)

输入一定是字节流 InputStream

// 代码UTF-8   文件 GBK  "D:\\resources\\data.txt"
// 1、提取GBK文件的原始字节流。
InputStream is = new FileInputStream("D:\\resources\\data.txt");
// 2、把原始字节流转换成字符输入流
// Reader isr = new InputStreamReader(is); // 默认以UTF-8的方式转换成字符流。还是会乱码的,跟直接使用FileReader是一样的
Reader isr = new InputStreamReader(is , "GBK"); // 以指定的GBK编码转换成字符输入流,完美的解决了乱码问题

BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null){
    System.out.println(line);
}
  • 如果需要控制写出去的字符使用的编码,怎么办?
    • 可以把字符以指定编码获取字节后再使用字节输出流写出去:
      • java“方佬肆”.getBytes(编码)
    • 也可以使用字符输出转换流实现。
构造器说明
public OutputStreamWriter(OutputStream os)可以把原始的字节输出流按照代码默认编码转换成字符输出流。几乎不用
public OutputStreamWriter(OutputStream os,String charset)可以把原始的字节输出流按照指定编码转换成字符输出流(重点)
// 1、定义一个字节输出流
OutputStream os = new FileOutputStream("io-app2/src/out03.txt");

// 2、把原始的字节输出流转换成字符输出流
// Writer osw = new OutputStreamWriter(os); // 以默认的UTF-8写字符出去 跟直接写FileWriter一样
Writer osw = new OutputStreamWriter(os , "GBK"); // 指定GBK的方式写字符出去

// 3、把低级的字符输出流包装成高级的缓冲字符输出流。
BufferedWriter bw = new BufferedWriter(osw);

bw.write("方佬大");
bw.write("方佬贰");
bw.write("方佬叄");
bw.write("方佬肆");

bw.close();

3 序列化对象

IO流体系结构_对象序列化

3.1 对象序列化

  • 作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化
  • 使用到的流是对象字节输出流:ObjectOutputStream

序列化对象必须实现Serializable序列化接口

public class Student implements Serializable {
...
}
构造器说明
public ObjectOutputStream(OutputStream out)把低级字节输出流包装成高级的对象字节输出流
方法名称说明
public final void writeObject(Object obj)对象写出去到对象序列化流的文件中去
// 1、创建学生对象
Student s = newStudent("方佬肆", "fanglaosi", 21);

// 2、对象序列化:使用对象字节输出流包装字节输出流管道
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io-app2/src/obj.txt"));

// 3、直接调用序列化方法
oos.writeObject(s);

// 4、释放资源
oos.close();

3.2 对象反序列化

  • 作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化
  • 使用到的流是对象字节输入流:ObjectInputStream
构造器说明
public ObjectInputStream(InputStream out)把低级字节输入流包装成高级的对象字节输入流
方法名称说明
public Object readObject()把存储到磁盘文件中去的对象数据恢复成内存中的对象返回
// 1、创建对象字节输入流管道包装低级的字节输入流管道
ObjectInputStream is = new ObjectInputStream(new FileInputStream("io-app2/src/obj.txt"));

// 2、调用对象字节输入流的反序列化方法
Student s = (Student) is.readObject();

System.out.println(s);

4 打印流

  • 作用:打印流可以实现方便、高效的打印数据到文件中去。打印流一般是指:PrintStreamPrintWriter两个类
  • 可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印boolean的true,写出去就是true

PrintStream和PrintWriter的区别

  • 打印数据功能上是一模一样的,都是使用方便性能高效(核心优势)
  • PrintStream继承自字节输出流OutputStream,支持写字节数据的方法。
  • PrintWriter继承自字符输出流Writer,支持写字符数据出去。

PrintStream

构造器说明
public PrintStream(OutputStream os)打印流直接通向字节输出流管道
public PrintStream(File f)打印流直接通向文件对象
public PrintStream(String filepath)打印流直接通向文件路径
方法名称说明
public void print(Xxx xx)打印任意类型的数据出去

PrintWriter

构造器说明
public PrintWriter(OutputStream os)打印流直接通向字节输出流管道
public PrintWriter (Writer w)打印流直接通向字符输出流管道
public PrintWriter(File f)打印流直接通向文件对象
public PrintWriter(String filepath)打印流直接通向文件路径
方法名称说明
public void print(Xxx xx)打印任意类型的数据出去
PrintWriter ps = new PrintWriter("io-app2/src/ps.txt"); // 打印功能上与PrintStream的使用没有区别

ps.println(97);
ps.println('a');
ps.println(23.3);
ps.println(true);
ps.println("我是打印流输出的,我是啥就打印啥");

ps.close();

输出语句重定向

System.out.println("锦瑟无端五十弦");
System.out.println("一弦一柱思华年");

// 改变输出语句的位置(重定向)
PrintStream ps = new PrintStream("io-app2/src/log.txt");
System.setOut(ps); // 把系统打印流改成我们自己的打印流

System.out.println("庄生晓梦迷蝴蝶");
System.out.println("望帝春心托杜鹃");

5 Properties

  • Properties代表的是一个属性文件,可以把自己对象中的键值对信息存入到一个属性文件中去
  • 属性文件:后缀是.properties结尾的文件,里面的内容都是 key=value,后续做系统配置信息的

其实就是一个Map集合,但是我们一般不会当集合使用,因为HashMap更好用

方法名称说明
void load​(Reader reader)从输入字符流读取属性列表(键和元素对)
void store​(Writer writer, String comments)将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流
public Object setProperty(String key, String value)保存键值对(put)
public String getProperty(String key)使用此属性列表中指定的键搜索属性值 (get)
public Set stringPropertyNames()所有键的名称的集合 (keySet())

5.1 将键值对信息存到配置文件中

Properties properties = new Properties();
properties.setProperty("方佬大", "123456"); // 保存键值对(put())
properties.setProperty("方佬贰", "123456");
properties.setProperty("方佬叄", "456789");
properties.setProperty("方佬肆", "456789");
System.out.println(properties);

/**
   param1:保存管道,字符输出流管道
   param2:保存注释
 */
properties.store(new FileWriter("Javacode\\users.properties"), "this is users!!");

5.2 Properties读取属性文件中的键值对信息

Properties properties = new Properties();
System.out.println(properties);

// 加载属性文件中的键值对数据到属性对象properties中去
properties.load(new FileReader("Javacode\\users.properties"));

System.out.println(properties);
String rs = properties.getProperty("方佬大"); // 使用指定的键搜索属性值(set())
System.out.println(rs); //123456
String rs1 = properties.getProperty("方佬肆"); // 使用指定的键搜索属性值
System.out.println(rs1); //456789
String s = properties.stringPropertyNames(); // 所有键的名称的集合(keyset())

6 IO框架:commons-io

  • commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以提高IO功能开发的效率
  • commons-io工具包提供了很多有关io操作的类。有两个主要的类FileUtils, IOUtils

导入步骤:
Step1:在项目中创建一个文件夹:lib
Step2:将commons-io-2.6.jar文件复制到lib文件夹
Step3:在jar文件上点右键,选择 Add as Library -> 点击OK
Step4:在类中导包使用

方法名称说明
String readFileToString(File file, String encoding)读取文件中的数据, 返回字符串
void copyFileToDirectory(File srcFile, File destDir)复制文件
void copyDirectoryToDirectory(File srcDir, File destDir)复制文件夹
// 完成文件复制到某个文件夹下
FileUtils.copyFileToDirectory(new File("D:\\resources\\hushui.jpeg"), new File("D:/"));

// 完成文件夹复制到某个文件夹下
FileUtils.copyDirectoryToDirectory(new File("D:\\resources") , new File("D:\\new"));

// 删除某个文件夹
FileUtils.deleteDirectory(new File("D:\\new"));
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值