【key】Writer系统
一、Writer类
Writer写入字符流的抽象类,操作数据的最小单位为1个字符。操作的数据都是字符,定义了写入字符流的基本共性功能方法。
常见方法:
二、FileWriter
FileWriter类从OutputStreamWriter类继承而来,FileWriter类用于存储文件,用来读取字符文件的便捷类。
构造方法:
写入数据到文件
【示例】写入数据到文件
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()操作,否则抛出异常。
文件的续写
发现在 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类中常见的方法:
read(): 读取单个字符并返回,字符的值作为int类型返回(0-65535之间的一个值,Unicode值)。如果未读出字符则返回-1。
read(char[]): 将数据读取到数组中,并返回读取的个数。如果未读出字符则返回-1。
四、FileReader类
FileReader类从InputStreamReader类继承而来,FileReader类用于读取文件,用来读取字符文件的便捷类。
构造方法
读取数据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(); } } |