目标黑马,我的自学之路:第十章 IO流

一、IO流

       IO流用来处理设备间的数据传输,Java对数据的操作是通过的流的方式,而操作流的对象都在IO包中。流按照流向分为输入流、输出流,按照操作数据分为字节流、字符流。众所周知,计算机只识别二进制数据,为了方便操作字符,就加入了编码转换,字符流就是融合了编码表,也是基于字节流的。IO流有四个常用抽象基类,字节流的为InputStream和OutputStream,字符流的为Reader和Writer,由这四个基类派生出来的子类名称都是以其父类名作为子类名的后缀。

       字符流和字节流的区别:字节流一次操作一个字节,字符流一次操作一个字符,根据编码表完成转换,可以是多个字节,字节流可以操作任意类型的文件,而字符流只能操作纯文本文件。

二、IO包内的对象

       1、文本输入流和输出流:字符流的FileReader和FileWriter,字节流的FileInputStream和FileOutputStream,这四个流对象在对象初始化时就需要明确要被操作的文件,如果文件不存在则会被创建到指定目录下,如果该目录下已有同名文件则会覆盖。字符流写入数据时数据会被先写入流的缓冲区中,通过调用fluse方法将缓冲区中的数据刷入目的地中,close方法存在刷新流的动作,但调用close方法会在刷新缓冲区的同时关闭流,flush刷新后流可以继续使用。

        2、字符流缓冲区和字节流缓冲区:缓冲区的出现提高了对数据的读写效率,它结合流才能使用,所以在创建缓冲区之前必须要有流对象,,并将流对象作为实际参数传递给缓冲区的构造函数,缓冲区在流的基础上对流的功能进行了增强,属于装饰类。

        3、转换流:InputStreamReader是字节流通向字符流的桥梁,可以使用字符流的方法。OutputStream是字符流通向字节流的桥梁,在这两个流中加入了编码表,可以实现按照指定编码表对指定内容进行编码和解码的功能。

        4、File类:File类用来将文件或者文件夹封装成对象,可以方便对文件和文件夹的属性信息进行操作,同时可以将File类对象作为实际参数传递给流的构造参数。

             File类中的基本方法:(1)增加:createNewFile方法在指定位置创建文件,如果该文件已存在则不会被覆盖。

                                                (2)删除:delete方法删除文件,返回值为boolean,deleteOnExit方法是在程序退出时删除指定文件。

                                                (3)判断:canExecute方法判断文件是否能被执行,isHidden方法判断文件是否隐藏,isFile方法判断是不是文件,ifDirectory判断是不是文件夹,exists方法判断文件是否存在。在判断文件是否是文件或者文件夹时,会先调用exists方法判断文件是否存在。

                                                (4)获取信息:getName、getPath、getAbsolutePath、getParent分别获取文件的名字、路径、绝对路径和父目录。getPath和getAbsolutePath方法不管文件是否存在都会获取到路径,getPath获取的路径既为封装的路径,而getParent方法获取的则是封装路径中的父目录,如果没有上层目录则返回null。list方法是获取指定目录下的文件和文件夹的名称,包括隐藏文件,并将他们存入字符串数组中返回,调用list方法的file对象必须是封装了一个目录,且该目录下必须存在。listFiles方法则是获取指定目录下的所有文件和文件夹,这两个方法的不同之处在于,listFiles方法获取的是文件和文件夹,还可以对它们的属性信息进行操作。

        5、打印流:PrintStream和PrintWriter,该流提供了打印方法,可以将各种数据类型的数据原样打印,字节打印流PrintStream的构造函数可以接受File对象、字符串路径、字节输出流,从而调用打印流的特有方法println进行打印,而字符流PrintWriter的构造函数除了能接受File对象、字符串路径、字节输出流以外,还能接受字符输出流作为参数。

        6、序列流:SequenceInputStream,该流并没用对应的输出流,用于将多个流进行合并串联,该流用到了Enumration实现对3个或3个以上的流的合并。

        7、对象流:ObjectInputStream和ObjectOutputStream,该流用于对对象的持久化存储,但需要对象所属类实现Serializable接口,这个接口可以现实类的序列化,是一个标记接口。

        8、管道流:PipedInputStream和PipedOutputStream,管道流是IO流中与多线程结合的流对象,输入流和输出流同时运行,实现了边读边写的操作,不建议使用单线程,因为可以会死锁线程。

        9、随机访问文件:RandomAccessFile,该类不是IO体系中的子类,但是它是IO包中的成员,它只能对文件进行读写操作,因为它具备读写功能,这是通过内部封装字节输入流和字节输出流实现的,它的内部还封装了一个大的byte数组,可以通过seek和skipBytes方法调整指针位置,从而完成对写入和修改操作。

       10、DataInputStream和DataOutputStream,这两个流对象是用于操作基本数据类型的流对象,它们的构造函数接受的字节输出流和字节输入流。

       11、ByteArrayInputStream和ByteArrayOutputStream,它们是操作字节数组的流对象,输入流构造函数接受的是一个字节数组,输出流则是一个空参数的构造函数,因为在其内部封装了一个可变长度的byte数组,这两个流对象操作的都是数组,并没用调用底层资源,所以不用调用close方法,即使关闭了也可以继续使用,此外还有CharArrayInputStream和CharArrayOutputStream,StringWriter和StringReader分别对字符数组和字符串进行操作。

  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值