文件字符流FileReader,FileWriter
四个步骤:创建File实例,指明文件路径,创建FileReader或FileWriter的实例,进行读入或者写出操作,read,write方法,最后关闭流.
1 public class ReaderWriterStream { 2 /** 3 * Io流原理及流的分类: 4 * 一:流的分类 5 * 按照数据单位不同分为:字节流,字符流 6 * 根据流向不同分为:输入,输出流 7 * 根据流的角色不同分为:节点流,处理流 8 * 二:流的体系结构 9 * 抽象基类: 节点流(文件流): 缓冲流(处理流的一种) 10 * inputStream FileInputStream BufferInputStream 11 * outputStream FileOutputStream BufferOutputStream 12 * Reader FileReader BufferReader 13 * Writer FileWriter BufferWriter 14 *说明: 15 * 1:read()方法:返回读入的一个字符,如果是空的返回-1 16 * 2:异常的处理:为了保证流一定执行关闭操作,必须使用try-catch-finally处理 17 * 3:读入的文件一定要存在,否则出现FileNotFoundException 18 *流使用的步骤: 19 * 1:File类的实例化,创建文件目录 20 * 2:FileReader流的实例化,将File实例放进去 21 * 3:进行读入操作 22 * 4:流的关闭 23 * 24 * 25 */ 26 @Test 27 public void test() { 28 //将此文件内容读入程序中,通过控制台打印出来 29 FileReader fileReader= null; 30 try { 31 File file=new File("hello.txt");//相对路径 32 fileReader = new FileReader(file); 33 int date;//read();返回读入的一个字符,如果达到文件末尾,返回-1;如果是空文件返回-1; 34 while ((date=fileReader.read())!=-1){ 35 System.out.println((char) date);//返回的Ascii码值,所以要强转一下 36 //read底层自带迭代,//通过FileReader流进行读入 37 } 38 } catch (IOException e) { 39 e.printStackTrace(); 40 } finally { 41 try { 42 if (fileReader!=null)//判断fileReader对象是否实例化,防止空指针 43 fileReader.close();//流的关闭,一定要加上 44 } catch (IOException e) { 45 e.printStackTrace(); 46 } 47 } 48 //对于IO流,socket等物理连接 JVM虚拟机不会进行内存回收,不关闭会造成内存泄露 49 System.out.println("文件已到末尾"); 50 } 51 //对read方法的一个升级;使用read的重载方法 52 @Test 53 public void test2(){ 54 FileReader fileReader=null; 55 try { 56 // 1:File类的实例化,创建文件目录 57 File file = new File("hello.txt"); 58 // * 2:FileReader流的实例化,将File实例放进去 59 fileReader = new FileReader(file); 60 // * 3:进行读入操作 61 char[] chars = new char[5]; 62 int len; 63 while ((len=fileReader.read(chars))!= -1) { 64 for (int i = 0; i < len; i++) { 65 System.out.println(chars[i]); 66 } 67 } 68 } 69 catch (IOException e){ 70 e.printStackTrace(); 71 }finally { 72 if (fileReader!=null) 73 try { 74 // * 4:流的关闭 75 fileReader.close(); 76 } catch (IOException e) { 77 e.printStackTrace(); 78 } 79 } 80 } 81 /** 82 * 83 *从内存中写出数据到硬盘的文件里 84 *File对应的文件如果不存在,会自动创建文件 85 *File对应文件如果存在,如果使用的构造器是FileWriter(file,false)/FileWriter(file):就会对原有文件进行覆盖 86 *如果使用的构造器是FileWriter(file,true)不会进行覆盖,而是在原有基础上进行添加 87 * 88 * 89 */ 90 @Test 91 public void test3()throws IOException{ 92 //提供File类的对象,指明写出的文件 93 File file=new File("hello.txt"); 94 //提供FileWriter的对象,写出数据 95 FileWriter fileWriter=new FileWriter(file,false); 96 //写出的操作 97 fileWriter.write("你好世界!"); 98 fileWriter.write("吃完饭了"); 99 //流的关闭 100 fileWriter.close(); 101 } 102 103 104 105 @Test 106 public void test4(){ 107 FileReader fileReader = null;//创建读入对象 108 FileWriter fileWriter=null; 109 try { 110 File file = new File("hello.txt");//创建文件 111 File file2 = new File("hello1.txt");//创建文件 112 fileReader = new FileReader(file); 113 fileWriter = new FileWriter(file2); 114 char[] chars = new char[5]; 115 int num; 116 while ((num = fileReader.read(chars)) != -1) { 117 fileWriter.write(chars, 0, num);//每次读出去几个就写进去几个 118 } 119 } catch (IOException e) { 120 e.printStackTrace(); 121 } finally { 122 try { 123 fileReader.close(); 124 } catch (IOException e) { 125 e.printStackTrace(); 126 } 127 try { 128 fileWriter.close(); 129 } catch (IOException e) { 130 e.printStackTrace(); 131 } 132 } 133 134 } 135 }