JavaEE_day_20_IO 概述、文件流、缓冲流、转换流、打印流

目录

  1. 概述
  2. 文件流
  3. 输入流
  4. 输出流
  5. 缓冲流
  6. 转换流
  7. 打印流

注意

字符流复制文件时不能MP3,MP4,压缩包等文件, 必须用字节流复制
因为字符流会重新组合压缩包以压缩好的内容,形成新的内容,打开后文件会损坏

1.概述

  • 简单来说 就是设备之间的数据传递称为流

  • 流的本质
    就是数据的传输,根据不同的数据传输特性,抽象出各种类,方便我们直接操作数据

  • InputStream
    在这里插入图片描述*
    OutputStream
    在这里插入图片描述

2.文件流

  • 1 FileInputStream 字节输入

  • 2 FileOutputStream 字节输出

  • 3 FileReader 字符输入

  • 4 FileWriter 字符输出

3.输入流

特别注意:

// 将输入流提出原因:内部作用域够不到finally的作用域.
// 赋值为null的原因:try中的代码可能不被执行,若不执行,则f为空指针,close调用时则出现空指针异常
// 需要被try围起来的原因是,路径可能会找不到

以下代码为输入流(字节)和文件输入流(字符)

  // 将输入流提出原因:内部作用域够不到finally的作用域.
  // 赋值为null的原因:try中的代码可能不被执行,若不执行,则f为空指针,close调用时则出现空指针异常
  // 需要被try围起来的原因是,路径可能会找不到
  FileInputStream f = null;
  FileReader fr = null;
  
  //写进try里可以自动关闭
  try(FileInputStream f1 =new FileInputStream("src/day_19.rar");) {
   
   // 标准输入流
   f = new FileInputStream("src/day_19.rar");
   // 文件输入流
   fr = new FileReader("src/test");
   // 读取一个字节,返回下一个字节的值
   int i = 0;
   // 字节输入流(read()只能传字节数组/单个字节)
   byte[] b = new byte[1];
   while ((i = f.read(b)) != -1) {
    System.out.print(new String(b, 0, i));
   }


// 文件输入流(read()只能传字符/单个字符)
   char[] c = new char[1000];
   if (fr.read(c) != -1) {
    System.out.print(new String(c, 0, i));
   }
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } finally {
   f.close();
   fr.close();
  }

4.输出流

以下代码为输出流(字节)和文件输出流(字符)

使用文件输出时记得用flush()清除缓存

try {
   FileOutputStream fo = new FileOutputStream("src/test",true);
   
   FileWriter fw = new FileWriter("src/test",true);
   //写整型转为文件内显示char
//   fo.write(1);
   String str ="123";
   //将字符串转换为字节流
   byte [] b =str.getBytes();
   //用字节流存入,字符输出
   fo.write(b);
   //文件流输出字符串
//   fw.write(str);
   //文件流输出必须加缓存输出
   fw.flush();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

5.缓冲区

以下是输入缓冲区代码

public static void main(String[] args) {
  try (FileReader fw = new FileReader("src/test");
  //将输出对象传入缓冲区
  BufferedReader fb = new BufferedReader(fw);) {
   String str = null;
   //新方法::调用缓冲区的按行输入方法
   while ((str = fb.readLine()) != null) {
    System.out.println(str);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

以下是输出缓冲区代码

public static void main(String[] args) {
  try (FileWriter fw = new FileWriter("src/test");
    BufferedWriter bw = new BufferedWriter(fw);) {
   String str = "123";
   //新加方法可以输出一个换行
   bw.newLine();
   bw.write(str);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

在这里插入图片描述

6.转换流

将字节流转换为字符流
也就是把FileInputStream转换为FileReader

// 创建一个字节输入流对象
    FileInputStream fis = new FileInputStream("src/test");
    // 创建转换流对象 并把字节输入流传入,转换为字符流
    InputStreamReader isr = new InputStreamReader(fis);
    // 创建字符输入缓冲流,把转换流传入
    BufferedReader br = new BufferedReader(isr);
    ){
   String tmp = br.readLine();
   System.out.println(tmp);

7.打印流

可以将标准输出更改输出地址

FileOutputStream fos = new FileOutputStream("D:/log.txt");
  // 创建打印流,并传入输出流
  PrintStream ps = new PrintStream(fos);
  // 调用打印方法,打印到指定文件,输入打印内容
  ps.println("日志系统");
  // 可以设置System中的out(将打印的东西打印到哪里去)
  System.setOut(ps);
  // 设置到system中后,再使用打印语句 会打印到指定地方
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
  System.out.println(sdf.format(new Date()));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值