- 基础I0流的框架
- 抽象基类:
- Reader (读)
- Writer(写)
- InputStream
- OutputStream
- 4个节点流(也称为文件流)
- FileReader
- FileWriter(字符)
- FileInputStream
- File0utputStream(字节)
- 4个缓冲流(处理流的一种)
- BufferedReader
- BufferedWriter
- BufferedInputStream
- Buffered0utputStream
- 抽象基类:
- 缓冲流的作用:提升文件读写的效率。
- 4个缓冲流
- 使用的方法
- 处理非文本文件的字节流:
- BufferedInputStream read(byte[] b)
- Buffered0utputStream write(byte[] b,0,len)
- 构造器:
- public BufferedInputStream(InputStream in) :创建一个 新的字节型的缓冲输入流。
- public BufferedOutputStream(OutputStream out): 创建一个新的字节型的缓冲输出流。
- 处理文本文件的字符流:
- BufferedReader I d(char[] c)/ readLine()
- BufferedWriter write(char[] c,0,len)
- 字符缓冲流特有方法
- BufferedReader:public String readLine(): 读一行文字。
- BufferedWriter:public void newLine(): 写一行行分隔符,由系统属性定义符号。
- 代码补充:
/* * 为表达清楚,本代码使用throws抛出异常 */ File f1=new File("D:\\io\\io1\\Test1.txt"); File f2=new File("D:\\io\\io1\\Test2.txt"); FileReader r = null; FileWriter w=null; r=new FileReader(f1); w=new FileWriter(f2); BufferedReader bRead=null; BufferedWriter bWrite=null; bRead = new BufferedReader(r); bWrite = new BufferedWriter(w); String str; while((str=bRead.readLine())!=null) {//此方法写完返回null,不写换行 bWrite.write(str); bWrite.newLine();//键入换行 bWrite.flush(); } System.out.println("复制成功"); bRead.close(); bWrite.close();//只需关闭外部资源,内部资源便会自动关闭
- 处理非文本文件的字节流:
- 使用的方法
- 步骤
- 1.创建File的对象、流的象(包括文件流、缓冲流)
- 2.使用缓冲流实现 读取数据 或 写出数据的过程
- 读取:int read(char[] c/byte[] b):每次将数据读入到c/b数组中,并返回读入到数组中
- 写出:void write(String str)/write(char[] c):将str或c写出到文件中void write(byte[] b)将byte[]写出到文件中
- 3.关闭资源
- 涉及到嵌套的多个流时,如果都显式关闭的话,需要先关闭外层的流,再关闭内层的流。
- 实际开发中,只需要关闭最外层的流即可,因为在关闭外层流(缓冲流)时,内层的流(字节流,字符流)也会被关闭。
- 代码补充:
public static void BufferedTest (String str1,String str2){ // TODO Auto-generated method stub FileInputStream r=null; FileOutputStream w=null; BufferedInputStream bRead=null; BufferedOutputStream bWrite=null; File f1 = new File(str1); File f2 = new File(str2); try { r = new FileInputStream(f1); w = new FileOutputStream(f2); bRead = new BufferedInputStream(r); bWrite = new BufferedOutputStream(w);//创建File的对象、流的象(包括文件流、缓冲流) byte[] b = new byte[1024]; int len; while ((len = bRead.read(b)) != -1) { bWrite.write(b, 0, len); } //使用缓冲流实现 读取数据 或 写出数据的过程 System.out.println("复制成功"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally {//关闭资源 try { if(bWrite!=null) { bWrite.close(); } if(bRead!=null) { bRead.close();//先关外部再关内部 }//但此种情况关BufferedInputStream,BufferedOutputStream即可 } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
- 补充:
- 因为内置缓冲区的原因,如果FileWriter不关闭输出流,就无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush() 方法了。
- flush():刷新缓冲区,流对象可以继续使用。
- close():先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
- 注意:即便使用flush()方法写出了数据,操作的最后还是要调用close方法,释放系统资源。