1、IO流的基本概念
IO即输入输出的简写,也是这个含义。
IO流就是指读写数据时想水流一样从一端到另一端,因此得“流”这个名字。
2、基本分类
其中对输入输出流的理解可以参考下边的图所示:【文件在硬盘上,程序在内存中】
输入流:指从文件(硬盘)中读取数据内容到程序(内存中) ,读文件。
输出流:指将程序中数据内容输出到文件中,写文件。
3、体系结构
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileoutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问管道 | PipeInputStream | PipeOutPutStream | PipedReader | PipeWriter |
访问字符串 | ---- | ---- | StringReader | StringWriter |
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | --- | --- | InputStreamReader | OutputStreamWriter |
对象流 | ObjectInputStream | ObjectOutputStream | --- | --- |
FilterInputStream | FileOutputStream | FilterReader | FilterWriter | |
打印流 | --- | PrintStream | --- | PrintWriter |
推回输出流 | PushbackInputStream | --- | PushbackReader | --- |
特殊流 | DataInputStream | DataOutputStream | --- | --- |
常用 IO流结构:
4、FileWriter类的概念和基本使用
4.1、FileWriter类
4.1.1、基本概念
Java.io.FileWriter类最主要用将文本内容写入到文本文件。
4.1.2、常用方法
方法声明 | 功能介绍 |
FileWriter(String fileName) | 根据参数指定的文件名构造对象 |
FileWriter(Sreing fileName,boolean append) | 以追加的方式根据参数指定的文件名来构造对象 |
void writer(int c) | 写入单个字符 |
void writer(char[ ]cbuf,int off,int len) | 将指定字符数组中从偏移量off开始的len个字符写入次文件输出流 |
void writer(char[ ]cbuf) | 将cubf.length个字符从指定字符数组写入此文件输出流 |
void flush() | 刷新流 |
void close() | 关闭流对象并释放有关的资源 |
4.1.3、FileWriter代码
FileWriter fw = null; try { // 1、构造FileWriter类型的对象与d:/a.txt文件关联 // 若文件不存在,则会自动创建一个新的文件 // 若文件存在,该流会清空文件中的原有内容 fw = new FileWriter("d:/a.txt"); //fw=new FileWriter("d:/a.txt",true); // 2、通过流对象写入数据内容 fw.write('a'); System.out.println("写入数据成功!"); } catch (Exception e) { e.printStackTrace(); } finally { // 3、关闭流对象并释放有关资源 if (null != fw) { try { fw.close(); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } }
一开始d盘下并没有a.txt文件,则运行代码之后,则会自动创建一个a.txt文件,并在其中写入‘a’
但是当连续运行时,并不会在a.txt文件中连续的添加字符‘a’;但是当把这行代码在后面添加True这项之后就可以连续在a.txt文件中添加‘a’这个字符了~
上边的常用方法的表格中还涉及到写入一段长度的字符数组和写入整个字符数组,代码如下:
FileWriter fw = null; try { // 1、构造FileWriter类型的对象与d:/a.txt文件关联 // 若文件不存在,则会自动创建一个新的文件 // 若文件存在,该流会清空文件中的原有内容 fw = new FileWriter("d:/a.txt"); // fw=new FileWriter("d:/a.txt",true); // 2、通过流对象写入数据内容,每当写入一个字符后则文件中的读写位置向后移动一位 fw.write('a'); //准备一个字符数组 char[] cArr=new char[] {'h','e','l','l','o'}; //将字符数组中的一部分写进去 fw.write(cArr,1,3);//ell //将整个字符数组写进去 fw.write(cArr); fw.flush(); System.out.println("写入数据成功!"); } catch (Exception e) { e.printStackTrace(); } finally { // 3、关闭流对象并释放有关资源 if (null != fw) { try { fw.close(); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } }
运行结果:
这里会注意到它并没有因为后续的写入将原有的内容进行覆盖,我们分析一下代码的执行流程就明白了;代码的执行是从上到下的顺序进行执行,因此a.txt文件并没有一次又一次进行创建,因此在写入字符‘a’之后。它的“光标”是一步一步往后移动的,因此并不会进行内容的覆盖,它相当于关联文件之后的代码是一个整体,除发生异常之外,要么都执行,要么都不执行,因此最终的运行效果就是上图啦~~~