节点流:FileReader和FileWriter
FileReader
读取指定文件的内容,显示到控制台上
-
方式一
@Test public void test8() throws IOException{ File file = new File("D:\\IDEA project\\OppTest\\ClassExpTest\\src\\FileAndIo\\hello.txt"); FileReader fileReader = new FileReader(file); int data; while((data = fileReader.read()) != -1){ System.out.println((char) data); } fileReader.close(); }
-
方式二:在方式一的基础上,进行改进,使用try-catch-finally处理异常,保证流是可以关闭的
@Test public void test9(){ FileReader fileReader = null; try { File file = new File("D:\\IDEA project\\OppTest\\ClassExpTest\\src\\FileAndIo\\hello.txt"); fileReader = new FileReader(file); int data; while((data = fileReader.read()) != -1){ System.out.println(data); } } catch (FileNotFoundException e) { throw new RuntimeException(e); }finally { try { if (fileReader != null) { fileReader.close(); } } catch (IOException e) { e.printStackTrace(); } } }
-
方式三:调用read(char[] cbuf),每次从文件中读取多个字符
public void test10(){ //一次性读取多个字符 FileReader fileReader = null; try{ File file = new File("D:\\IDEA project\\OppTest\\ClassExpTest\\src\\FileAndIo\\hello.txt"); fileReader = new FileReader(file); char []cbuffer = new char[5]; int len; while ((len = fileReader.read(cbuffer)) != -1){ for (int i = 0; i < len; i++) { System.out.println(cbuffer[i]); } } }catch (IOException e){ e.printStackTrace(); }finally { try { if(fileReader != null){ fileReader.close(); } } catch (IOException e) { throw new RuntimeException(e); } } }
FileWrtier
方法 :
write(String str) / write(char []cdata )
输入流,输入文件一定要存在
输出流,输出文件可以不存在,会自动创建此文件
-
方式一
@Test public void test11() { //创建File类的对象,指明要写出的文件名称 File file = new File("info.txt"); if(!file.exists()){ file.createNewFile(); } //创建输出流 FileWriter fileWriter = null; try { fileWriter = new FileWriter(file); } catch (IOException e) { throw new RuntimeException(e); } //写出的过程 try { fileWriter.write("123"); } catch (IOException e) { throw new RuntimeException(e); } //关闭输出流 try { fileWriter.close(); } catch (IOException e) { throw new RuntimeException(e); } } //重新写入信息,是否会将文件覆盖,取决于构造器的使用 //new FileWriter(file,false/true) //默认为false,覆盖文件进行写入
FileReader/FileWriter的使用
使用步骤
- 创建读取或写出的File类对象
- 创建输入流或输出流
- 具体的读入或写出操作
- 读入 read(char [] cbuffer)
- 写出 write(String str) / write(char [] cbuffer,0,len)
- 关闭流资源,避免内存泄露
注意点
- 因为涉及到流资源的关闭,所以出现异常的话,需要用try-catch-finally的方式来处理异常
- 对于输入流来讲,要求File类的对象对应的物理磁盘上的文件必须存在,否则,会报错
FileNotFoundException
- 对于输出流来讲,File类对象对应的物理磁盘上的文件可以不存在
- 若文件不存在,在输出的过程中,会自动创建文件,并写出数据到此文件中
- 若文件存在,则会进行写入信息或覆盖文件
- 使用FileWriter(File file) 或FileWriter(File file,false) 构造器创建,则会对同名文件进行覆盖操作
- 使用FileWriter(File file,true) 输出的过程中,会在现有的文件的末尾追加写出的内容
练习
-
练习1
复制一份info.txt文件,命名为info_copy.txt
@Test public void test12() throws IOException{ //创建File类对象 File srcFile = new File("info.txt"); File destFile = new File("info_copy.txt"); //创建输入流,输出流 FileReader fileReader = new FileReader(srcFile); FileWriter fileWriter = new FileWriter(destFile); //数据的读入和写出的过程 char []cBuffer = new char[5]; int len; while((len = fileReader.read(cBuffer)) != -1){ fileWriter.write(cBuffer,0,len); } //关闭流资源 fileReader.close(); fileWriter.close(); }