IO流概述

来源:互联网 发布:北京网络诈骗举报电话 编辑:程序博客网 时间:2024/06/01 09:22

 

为什么需要IO技术?

在我们日常使用的几乎所有的程序在完成特定的任务都需要与数据存储设备进行数据交换,最常见的数据存储设备主要有磁盘和网络,IO技术就是指应用程序对这些数据存储设备的数据输入和输出。

IO技术是什么?

简单来说,IO技术就是应用程序对存储设备内数据的操作,该操作分为读取和写入。

比如说,打开一个txt文件,这就是个IO技术,应用程序读取硬盘中的数据

 

IO技术好处是什么?

IO技术的存在,实现了应用程序和存储设备之间数据的交换 ,也可以理解为应用程序可以根据人为发出的指令动态的处理数据存储设备中的数据,实现人机信息的交换。

IO技术操作存储设备内的数据是通过什么来实现的呢?

IO技术操作存储设备内的数据是通过流来实现的,流是一个抽象的概念,代表一串数据的集合,当java程序需要从数据源读取数据时, 就需要开启一个到数据源的流,同样,当程序需要输出数据到目的的时,也需要开启一个流,流的创建是为了更方便的处理数据的输入和输出。

怎么样理解流?

可以把数据流比喻成现实生活中的水流,每户人家都需要自来水,就需要在家喝自来水厂之间建一根水管,这样水厂的水才能通过水管流到家中;

自来水厂就是数据源(数据存数设备),家就是应用程序,水管就是读取方法,水流就是流,数据就是水。

应用程序要读取数据源中的数据,存储设备中的数据通过水流沿着水管就流到了应用程序中了。

 

流的结构:

字节流

字符流

输入流

InputStream

Reader

输出流

OutputStream

Writer

文件流:

字节流

字符流

输入流

FIleInputStream

FileReader

输出流

FileOutputStream

FileWriter

专门用于操作数据源中文件的流

缓冲区:

缓冲区的作用:

缓冲区的出现是为了提高流的操作效率而出现的,所以在创建缓冲区之前,必须要先有流对象。

 

 

缓冲区的分类:

字节流

字符流

输入流

BufferedInputStream

BufferedReader

输出流

BufferedOutputStream

BufferedWriter

BufferedReader中特有的一次读一行的读取方法:readLine()方法,返回null时,表示读到文件末尾

注:readLine()方法返回的时候只返回回车符之前的数据内容并不能返回回车符,通俗来说,

readLine()方法读取不了回车符,读取文件内容时换不了行

解决readLine()读取文件换不了行方法: newLine()  换行,在每次读一行后调用换行方法,继续读这样就按照原文本格式把文件中数据读出来了。

 

 

转换流:

读取转换流:

    InputStreamReader

字节流通向字符流的桥梁

写入转换流:

outputStreamWriter

字符流通向字节流的桥梁

 

 

打印流:

字节打印流

printStream

字符打印流

printWriter

 

 

合并流:SequenceInputStream

合并流又称序列流,合并流思想:有很多的源和同一个目的相连,比如说源1,源2,源3,同时和目的1相连,合并流将源1,源2,源3作为对象分装到集合中,将集合放入SequenceInputStreamList)中,将SequenceInputStream类对象,作为源4,和目的1相连,这样就不用创建4个流和目的1相连,只需源4和目的间创立一个流相连即可,提高了效率

 

对象流:

      

对象输入流

ObjectprintStream

对象输出流

ObjectprintWriter

 

管道流:

     

管道输入流

PipedInputStream

       管道输出流

PipedOutputStream

 

 

随机存取文件流:

随机访问文件,自身具备读写的方法,该类不算是IO体系中子类,而是直接继承Obje类,但是它是IO包中的成员,因为具备读和写的功能,内部分装了一个数组,而且通过指针对数组元素进行操作。

 

流操作的基本规律:4个明确来完成

1.明确源和目的

源:输入流        Reader       InputStream

目的:输出流      Writer        OutputStream

2.明确操作数据是否是纯文本

是: 字符流

否:字节流

3.体系明确后,明确使用哪个具体对象

4.明确是否需要提高效率

字节流

字符流

输入流

BufferedInputStream

BufferedReader

输出流

BufferedOutputStream

BufferedWriter

 

IO流应用实例:

import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Copy {/** *拷贝文件步骤: * 1.创建一个文件B,用于存储读取A文件内数据 * 2.定义读取流和A文件关联 * 3.定义数组,作为读取流和写入流之间联系的桥梁 * 4.通过不断的读写完成数据存储 * 5.关闭流资源 */public static void main(String[] args) {FileWriter fw=null;     //定义写入流FileReader  fr=null;      //定义读取流try {   fw=new FileWriter("e://hello.txt");   //创建写入流   fr=new FileReader("f://demo.txt");   //创建读取流      char [] buf=new char[1024];        //创建数组作为连接写入流与读取流之间的联系桥梁      int len=0;    //数组长度变量      while((len=fr.read(buf))!=-1){           //将读取的元素存到数组中      fw.write(buf, 0, len);          //将数组中的元素写入到写入流中   }      } catch (IOException e) {System.out.println("拷贝文件失败");e.printStackTrace();}finally{if(fw!=null){try {fw.close();     //将写入流中的数据冲入到保存区域并关闭写入流} catch (IOException e) {System.out.println("关闭写入流失败。。。");e.printStackTrace();}if(fr!=null){try {fr.close();} catch (IOException e) {System.out.println("关闭读取流失败。。。");e.printStackTrace();}}}}}}import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class CopyPhotos {/** * 复制一个图片: * 1.用字节读取流和图片关联 * 2.用字节写入流对象创建一个图片文件,用于存储获取到得图片数据 * 3.通过循环读写,完成数据的存储 */public static void main(String[] args) {         FileOutputStream fos=null;  //定义字节流         FileInputStream  fis=null;                  try {            fis=new FileInputStream("c://a.jpg");         fos=new FileOutputStream("d://b.jpg");         //定义数组,作为两个字节流之间的中转站   byte[] buf=new byte[1024];    int len=0;   while((len=fis.read(buf))!=-1){  //循环读写,完成数据的存储       fos.write(buf,0,len);   }      } catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{  //释放流资源 if(fis!=null){  try {fis.close();} catch (IOException e) {e.printStackTrace();}  }  if(fos!=null){ try {fos.close();} catch (IOException e) {e.printStackTrace();}  } }}}import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class Copy {/** * 复制一个MP3文件 * 1.用字节读取流和MP3文件关联 * 2.用字节写入流对象创建一个MP3文件,用于存储获取到得图片数据 * 3.通过循环读写,完成数据的存储 */public static void main(String[] args) {FileInputStream fis=null;  //操作数据不是纯文本定义字节流FileOutputStream fos=null;BufferedInputStream bufis=null;  //定义缓冲区BufferedOutputStream bufos=null;long start=System.currentTimeMillis();  //复制文件开始时间try {fis=new FileInputStream("c://a.mp3");   //读取,写入文件fos=new FileOutputStream("d://b.mp3");bufis=new BufferedInputStream(fis);bufos=new BufferedOutputStream(fos);int len=0;while((len=bufis.read())!=-1){       bufos.write(len);}long end=System.currentTimeMillis();  //复制文件结束时间System.out.println(end-start+"毫秒"); //复制文件花费上时间} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{                                           //关闭流资源if(bufis!=null){try {bufis.close();} catch (IOException e) {e.printStackTrace();}}if(bufos!=null){try {bufos.close();} catch (IOException e) {e.printStackTrace();}}}}}


 

原创粉丝点击