IO流——字符流

本文详细介绍了Java中的Writer类和FileWriter类,包括它们的基本功能、常用方法及构造器。通过示例展示了如何使用FileWriter进行文件写入,包括数据刷新和文件续写。接着,介绍了Reader类和FileReader类,讲解了读取文件的方法,并提供了读取文件的示例代码。最后,给出了字符流实现文件拷贝的完整案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【key】Writer系统 

0788a6940cee460bb4e90ac7dbd3e0d3.png

 

一、Writer类

Writer写入字符流的抽象类,操作数据的最小单位为1个字符。操作的数据都是字符,定义了写入字符流的基本共性功能方法。

常见方法:

04e97077743a4facacf60117ed314562.jpeg

 二、FileWriter

FileWriter类从OutputStreamWriter类继承而来,FileWriter类用于存储文件,用来读取字符文件的便捷类。

7ff85ca6d9c54c11a83949f91fec77b9.png

 构造方法:

3a37e20262e6448f97ea9d47a0d5c66c.jpeg

 写入数据到文件

【示例】写入数据到文件

public class FileWriteDemo {

   public static void main(String[] args) {

      Writer fw = null;

      try {

         // 创建字符输出流,明确需要操作的文件

         fw = new FileWriter("demo.txt");

         // 写入字符文件

         fw.write("hello world!");

         // 强制刷新保存数据

         fw.flush();

      } catch (IOException e) {

         e.printStackTrace();

      } finally {

         if(fw != null) {

            try {

               // 关闭流,刷新数据+关闭流

               fw.close();

            } catch (IOException e) {

               e.printStackTrace();

            } 

         }

      }

   }

}

flush和close的区别

flush(): 将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。

close(): 关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。关闭流之后就不能再做write()或flush()操作,否则抛出异常。

 7dfa6afee3834dc18ab503f528c0aae3.jpeg

文件的续写

发现在 FileWriter 的构造函数中,可以接受一个 boolean类型的值,如果值 true,就会在文件末位继续添加。

【示例】将数据写到文件中

public class FileWriteDemo01 {

   public static void main(String[] args) {

      Writer fw = null;

      try {

         // 创建字符输出流,明确需要操作的文件

         fw = new FileWriter("demo.txt", true);

         // 写入字符文件

         fw.write("hello world!");

         // 强制刷新保存数据

         fw.flush();

      } catch (IOException e) {

         e.printStackTrace();

      } finally {

         if(fw != null) {

            try {

               // 关闭流,刷新数据+关闭流

               fw.close();

            } catch (IOException e) {

               e.printStackTrace();

            } 

         }

      }

   }

}

三、Reader类

Reader用于读取字符流的抽象类,数据单位为字符。操作的数据都是字符,定义了输出字符流的基本共性功能方法。

Reader类中常见的方法:

4506c04290ad4bb1bc7de364cf5540ea.jpeg 

read(): 读取单个字符并返回,字符的值作为int类型返回(0-65535之间的一个值,Unicode值)。如果未读出字符则返回-1。

 

read(char[]): 将数据读取到数组中,并返回读取的个数。如果未读出字符则返回-1。

四、FileReader类

FileReader类从InputStreamReader类继承而来,FileReader类用于读取文件,用来读取字符文件的便捷类。

abce08d7396449fbbe5c539b28870926.png

 构造方法

ad22ff41df9a4204ba57c6443312fa3c.jpeg

 读取数据read()方法

在读取文件中的数据时,调用 read 方法一次读一个字符,从而实现从文件中读取数据。

【示例】读取去数据read()方法

public class FileReaderDemo01 {

   public static void main(String[] args) {

      FileReader fr = null;

      try {

         // 创建一个读取流对象,一定要明确读取的文件,并且保证文件路径正确

         fr = new FileReader("demo.txt");

         StringBuffer sb = new StringBuffer();

         int len = 0;

         // 一次读取一个字符,当返回值为-1,则数据读取完毕

         while ((len = fr.read()) != -1) {

            sb.append((char) len);

         }

         System.out.println("string: " + sb);

      } catch (FileNotFoundException e) {

         e.printStackTrace();

      } catch (IOException e) {

         e.printStackTrace();

      } finally {

         if (fr != null) {

            try {

               fr.close();

            } catch (IOException e) {

               e.printStackTrace();

            }

         }

      }

   }

}

读取数据read(char[])方法

在读取文件中的数据时,调用 read ()方法,每次只能读取一个字符,太麻烦了,于是我们可以定义数组作为临时的存储容器,这时可以调用重载的 read 方法,一次可以读取多个字符。

【示例】读取数据reaad(char[])方法

public class FileReaderDemo {

   public static void main(String[] args) {

      FileReader fr = null;

      try {

         // 创建一个读取流对象,一定要明确读取的文件,并且保证文件路径正确

         fr = new FileReader("demo.txt");

         StringBuffer sb = new StringBuffer();

         int len = 0;

         char[] buf = new char[1024];

         // 一次性读取多个字符,当返回值为-1,则数据读取完毕

         while ((len = fr.read(buf)) != -1) {

            sb.append(new String(buf, 0, len));

         }

         System.out.println(sb);

      } catch (FileNotFoundException e) {

         e.printStackTrace();

      } catch (IOException e) {

         e.printStackTrace();

      } finally {

         if (fr != null) {

            try {

               fr.close();

            } catch (IOException e) {

               e.printStackTrace();

            }

         }

      }

   }

}

字符流文件拷贝案例

原理:读取一个已有的数据,并将这些读到的数据写入到另一个文件中。

【示例】字符流文件的拷贝案例

public class FileWriteReaderDemo {

   public static void main(String[] args) throws IOException {

      // 创建文件读取流

      FileReader fr = new FileReader("E://demo.txt");

      // 创建文件写入流

      FileWriter fw = new FileWriter("F://demo.txt");

      // 读取数据

      int len = 0;

      char[] buf = new char[1024];

      // 读取文件中的数据

      while ((len = fr.read(buf)) != -1) {

         // 保存读取的数据

         fw.write(buf, 0, len);

      }

      // 关闭流

      fr.close();

      fw.close();

   }

}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深山老林.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值