IO学习

一、java IO流简介

       java IO流是一组有顺序的字节序列,通过流我们可以进行硬盘文件、内存、IO设备等数据的流通。IO流根据处理类型不同可以分为字节流和字符流;根据流向不同可以分为输入流和输出流。

      字节流一次读入或者读出8位(1byte=8bit)二进制;而字符流以字节(byte)为单位,根据码表映射字符,一次可能读取多个字节。设备上的文字、图片、视频等都是用二进制存储的,所以所有的文件都能通过字节流读取或者写入;另外,对于纯文本(如txt)来说,根据数据编码不同,才用字符流来进行读写,能够提高操作效率,字符流本质是基于字节流读取时,查了指定的编码表。

    结论:字节流什么文件都能读写,字符流只能操作纯文本,而且如果是纯文本,优先用字符流,效率高。

二、IO流类图


 三、字节流(输入流和输出流)     

       InputStream和OutputStream分别为字节输入流和字节输出流的父类,它们是抽象类。ByteArrayInputStream、StringBufferInputStream、FileInputStream 和 ByteArrayOutputStream、FileOutputStream是五种基本的介质流,  它们分别从Byte数组、StringBuffer、本地文件读取数据 和 分别向Byte数组、本地文件写入数据。

另外:PipedInputStream 、PipedOutputStream 是从与其它线程共用的管道中读写数据。ObjectInputStream 、ObjectOutputStream 和所有FilterInputStream、FilterOutputStream 的子类都是装饰流(装饰器模式的主角)。

字符流 Reader和Writer不做介绍了。

四、节点流和处理流

1、节点流

      节点流就是直接与数据源相连,直接读取或写入。


本地文件 数组  字符串 管道直接与数据源相连,就是节点流 。

2、处理流

        处理流就是在节点流上套接一层,套接在节点流上的就是处理流,处理流的构造方法总是要带一个其他流的对象做参数。


 3、引入缓冲流的目的

     在已经有了inputStream、OutputStream、 FileInputStream、FileOutputStream的情况下,为什么还要引入BufferedInputStream和BufferedOutputStream呢?

    我们知道inputStream、OutputStream流不带缓存区,也就是每读一个字节就要写一个字节,这样会频繁的I/O操作,效率太低;节点流FileInputStream、FileOutputStream是用byte数组来做了缓存;BufferedInputStream和BufferedOutputStream流是带缓冲区的,它可以一次读取很多个字节,而不向磁盘写入,只是先放到缓冲内存中,等凑够缓存区大小的时候一次性写入磁盘,这样就减少了I/O操作,提高了效率。


五、File类介绍

        File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。

六、总结

   1、涉及到本地文件、文件系统读写文件,可以用FileInputStream和FileOutputStream; 

比如:从本地一个文件把数据读取到另一个文件

           FileInputStream in = null;
 9         FileOutputStream out = null;
10         try {
11             in = new FileInputStream("D:\\Java\\MyEclipse 10\\Workspaces\\AnnotationTest\\src\\cn\\galc\\test\\MyMouseAdapter.java");
12             out = new FileOutputStream("D:/java/TestFileOutputStream1.java");
13             // 指明要写入数据的文件,如果指定的路径中不存在TestFileOutputStream1.java这样的文件,则系统会自动创建一个
14             while ((b = in.read()) != -1) {
15                 out.write(b);
16                 // 调用write(int c)方法把读取到的字符全部写入到指定文件中去
17             }
18             in.close();
19             out.close();

当然,用相应的缓存流来处理效率更高

BufferedInputStream bis =new BufferedInputStream(new FileInputStream(new File("文件路径")));

int i =0 ;

while((i = bis.read())!=-1){ //i 就是从文件中读取的字节,读完后返回-1 }

FileOutputStream fos =new FileOutputStream(file);

BufferedOutputStream bos=new BufferedOutputStream(fos);

bos.write(要写出的字节或者字节数组);

bos.flush();

bos.close();


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值