IO(FileWriter/FileReader)字符流:文件的写入、续写、读
字符流基类:Writer、Reader
字节流基类:InputStream、OutputStream
IO流中后缀名为父类名,前缀名为该类的功能描述。
字符流其实一样走的字节,他需要把读好的字节临时存起来,然后查找编码表,字符流底层用的也是字节流缓冲区,字符流底层用数组将数据临时存储,所以需要刷新动作
创建FileWriter流对象的示例:
需求:在硬盘上,创建一个文件并写入一些文字数据。 找到一个专门用于操作文件的Writer子类对象。FileWriter。 后缀名是父类名。 前缀名是该流对象的功能。 */ import java.io.*; class FileWriterDemo { public static void main(String[] args) throws IOException { //创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件(参数为被操作的文件名)。 //而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。 //其实该步就是在明确数据要存放的目的地。 FileWriter fw = new FileWriter("demo.txt");//参数可指定路径如:"D:\\demo.txt"(将demo.txt指定到D盘(windows系统下)) //调用write方法,将字符串写入到流中。 fw.write("abcde"); //刷新流对象中的缓冲中的数据。 //将数据刷到目的地中。 //fw.flush(); //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。 //将数据刷到目的地中。 //和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。 fw.close(); } }
IO异常处理方式演示:
/* IO异常的处理方式。 */ import java.io.*; class FileWriterDemo2 { public static void main(String[] args) { //在外部创建变量,在后面进行赋值,避免了变量作用域的局限性。 FileWriter fw = null; try { fw = new FileWriter("demo.txt"); fw.write("abcdefg"); } catch (IOException e) { System.out.println("catch:"+e.toString()); } finally { try { if(fw!=null)//若不为空则证明创建流对象的操作成功了并未发生异常 fw.close(); } catch (IOException e) { System.out.println(e.toString()); } } } }
演示对已有文件的数据续写:
/* 演示对已有文件的数据续写。 */ import java.io.*; class FileWriterDemo3 { public static void main(String[] args) throws IOException { //传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。 //若该文件不存在则创建一个文件。 FileWriter fw = new FileWriter("demo.txt",true); fw.write("nihao\r\nxiexie");//反斜杠r加反斜杠n(\r\n)为windows系统txt编辑器中的换行。 fw.close(); } }
演示对已有文件的读取方式:
reade(char[] cbuf):该方法返回的是读取字符的个数,该方法将字符读入参数数组中。
import java.io.*; class FileReaderDemo { public static void main(String[] args) { FileReader fr = null; //定义一个字符数组,用于存储读到的数据。 //该数组长度一般定义为1024的整数倍。 char [] array = new char[1024]; int num = 0; try { //创建一个文件读取流对象,和指定名称的文件相关联。 //需保证文件存在,否则会报FileNotFoundException(文件不存在异常) fr = new FileReader("E:\\GUOZHICHAO.txt"); //循环读取并输出, while ((num=fr.read(array))!=-1) { System.out.println(new String(array,0,num)); } } catch (IOException e) { System.out.println(e.toString()); } finally { try { if (fr!=null) { fr.close(); } } catch (IOException e) { System.out.println(e.toString()); } } } }
文件的复制过程:
//将C盘一个文本文件复制到D盘。 /* 复制的原理: 其实就是将C盘下的文件数据存储到D盘的一个文件中。 步骤: 1,在D盘创建一个文件。用于存储C盘文件中的数据。 2,定义读取流和C盘文件关联。 3,通过不断的读写完成数据存储。 4,关闭资源。 */ import java.io.*; class CopyText { public static void main(String[] args) throws IOException { copy_2(); } public static void copy_2() { FileWriter fw = null; FileReader fr = null; try { fw = new FileWriter("SystemDemo_copy.txt"); fr = new FileReader("SystemDemo.java"); char[] buf = new char[1024]; int len = 0; while((len=fr.read(buf))!=-1) { fw.write(buf,0,len); } } catch (IOException e) { //因为读写都失败了处理不了,可以将流关掉并删除文件。 throw new RuntimeException("读写失败");//此处为简单异常处理 } finally { if(fr!=null) try { fr.close(); } catch (IOException e) { } if(fw!=null) try { fw.close(); } catch (IOException e) { } } } //从C盘读一个字符,就往D盘写一个字符。 public static void copy_1()throws IOException { //创建目的地。 FileWriter fw = new FileWriter("RuntimeDemo_copy.txt"); //与已有文件关联。 FileReader fr = new FileReader("RuntimeDemo.java"); int ch = 0; while((ch=fr.read())!=-1) { fw.write(ch); } fw.close(); fr.close(); } }
英语时间:
File:
- n. 文件;档案;文件夹;锉刀
- vt. 提出;锉;琢磨;把…归档
- vi. 列队行进;用锉刀锉
- n. (File)人名;(匈、塞)菲莱
Process:
- vt. 处理;加工
- n. 过程,进行;方法,步骤;作用;程序;推移
- vi. 列队前进
- adj. 经过特殊加工(或处理)的
mode:
- n. 模式;方式;风格;时尚
- n. (Mode)人名;(德、英、法、乍、瑞典)莫德
Writer:
- n. 作家;作者
copy:
- vi. 复制;复印;抄袭
- vt. 复制;复印;抄袭
- n. 副本;一册;摹仿