Java IO流学习笔记

 IO流

  • File类:

     File类表示文件或文件目录表示的路径

     *相对路径:相较于某个路径下指明的路径,通常是相对于当前module所在的路径

     *绝对路径:包含了盘符在内的文件或文件目录的路径(文件分隔符通常是双杠,防止与转义字符相冲突)

     *由于不同系统分隔符不同,为了提高通用性可以使用separator=“ ”+separatorChar的方式,即用+号连接路径。

     实例化:1.File(String filePath)

             2.File(String parentPath,String childPath)

             3.File(File ParentFile,String childPath)

     *public File[ ] listFiles( ):获取指定目录下所有文件或文件目录的名称数组,适用于文件目录,显示时显示绝对路径

     *public Boolean renameTo(File dest):把文件重命名为指定的文件路径。如果要保证返回值为true,以file1.renameTo(file2)为例,需要确保file1存在,file2不存在。转化成功后file1不再存在。支持相对路径

     *File类只涉及操作文件本身的方法,并不涉及读入和读取的方法,如果要读入或读取,就要使用IO流相关的方法

     *删除文件目录时,文件目录内部不能有子目录或文件

     *注意,main()方法中实例化的文件路径与单元测试时的文件路径并不相同

二.流:

     分类:按操作数据单位:字节流(8bit)、字符流(16bit,更适合处理文本文件)

           按流向:输入流、输出流

           按流的角色不同:节点流(直接作用于文件上的流)、处理流(包裹流的流)

     结构:

     抽象基类:InputStream     OutputStream     Reader     Writer

     节点流(文件流):FileInputStream     FileOutputStream     FileReader     FileWriter

     缓冲流(处理流的一种):BufferedInputStream     BufferedOutputStream     BufferedReader     BufferedWriter

1.节点流

  1. FileReader():实例化代操作文件,指明文件供流操作;read()方法读取内容,返回int类型,当输出到结尾时返回-1.(因为返回类型是int,所以打印时要强转);关闭流(Java的垃圾回收机制对数据库连接、输入输出流、socket连接等物理连                                接无法收回

     *在选择异常处理时不建议使用throws·,一旦异常抛出,后序程序将不会执行,流无法被关闭,可能存在泄露问题

     *注意,如果流在实例化时就出现异常(如文件不存在),程序尾部强行close流可能出现空指针异常

     *由于read传输速度较慢可以使用read传数组,注意结尾时可能有部分数据未覆盖,可能出现错误结果

     2)FileWriter():输出数据的流。

           对应的file文件可以不存在,并不会报异常;如果文件不存在,在输出过程中会自动创建此文件;如果在构造器中设置false或不做添加,文件会被新输入的内容所覆盖,如果设置true,文件只会追加不会覆盖。

     *无法用传输字符的方式处理图片等依赖于字节传输的数据

     3)FileInputStream():以字节的方式读入数据,当读入数据为英语字符和阿拉伯数字等单字节就可以表示的字符时,打印结果不会出现乱码;当输入数据为中文等其它字符时,输出结果为乱码(注意,当以数组的方式输出时,如果数组大小和当时的情况刚好容下了一个完整的汉字编码时,此时的汉字可以正常输出)

     *实际上流只起到搬运的作用,字节流可以用于复制文本文件,如果在控制台查看,非英语字符依旧是乱码,但只查看复制生成的文件的话,文本与文件源是完全相同的,所以事实上可以用字节流复制文本文件

2.缓冲流:提高流写入、读取的速度

     缓冲流无法直接作用于文件本身,所以在使用缓冲流时,依旧要声明节点流。不过在使用流读取文件时,应使用缓冲流进行读取。在关闭资源时,先关外层流,再管内层流(注意,事实上,在关闭外部流时,内部流也会被同时关闭,所以内部流的关闭操作可以省略)

     *提高效率的原因:缓冲流中定义了一个缓冲区,数据在读入时先进入缓冲区,等缓冲区装载到一定大小时,再一次性进行操作

     *BufferedReader()中多了readline()方法,读取一整行数据,但中间不加换行符

*注意,流的构造器支持直接输入文件的路径,省去文件的实例化

*增强for循环是只读的,无法改变原数组的元素,所以如果需要对数据进行特殊处理,使用传统for循环

3.转换流:提供字节流和字符流之间的转换,体系上属于字符流(通过后缀判断)

     InputStreamReader:将一个字节的输入流转为字符输入流

     OutputStreamWriter:将一个字符的输出流转为字节输出流

  1. InputStreamReader可以自主设计字符集,若不指定则默认使用系统默认字符集UTF--8
  2. OutputStreamWriter可以在输出的过程中该换字符集

4.标准输入输出流:

     System.in:标准的输入流,默认从键盘输入

     System.out:标准的输出流,默认从控制台输出

    *可以通过setIn和setOut来进行重定向

5.打印流:PrintStream和PrintWriter

     提供了一系列重载的print()和println()方法,,用于多种数据类型的输出;

     输出不会抛出IO异常;

     都有自动flush功能;

     PrintStream打印所有的字符默认转换为字节,打印字符时应使用PrintWriter

6.数据流:DataInputStream和DataOutputStream

     用于读取或写出基本数据类型的变量或字符串

     *在将文件中存储的基本数据类型和字符串读取到内存时,应保存在变量中

     *读取不同类型数据时,读取数据的顺序要与写入数据的顺序一致

     *无法处理对象类型的数据

7.对象流:ObjectInputStream和ObjectOutputStream,用于存储和读取基本数据类型数据或对象。将对象从内存传入文件称序列化(ObjectOutputStream),从文件读取到内存称反序列化(ObjectInputStream)

     *对象序列化机制允许把内存中的对象转换成与平台无关的二进制流,当其它程序获得这种流时可以恢复成原来的对象

     *同样是处理流,需要包裹节点流。

     *不能序列化static和transient修饰的成员变量,程序可以运行,但数据不会被保存

     *要想让一个自定义类可序列化,需要满足其带有Serializable接口(一个标识接口,无具体方法需要实现,需要加上用public修饰的序列版本号)或Externalizable接口,并保证当前所有类内部的属性都是可序列化的。

     *读取要按照写入时的顺序来,一般在实际运用中,纯熟的对象最好保持为同一对象

     *版本号用于表明类的不同版本间的兼容性,以序列化对象进行版本控制,如果没有自己声明,系统会根据当前系统内部细节生成版本号,如果类和对象做了修改,版本号很可能会发生变化

     *如果自行声明了版本号,在序列化后对类进行了修改,反序列化依然可以进行,新添的修改会被赋上默认值

     8.随机存取稳健流:RandomAccessFilm,直接继承于Object,与四个基类流无关;继承了DataInput和DataOutput,既可以输入也可以输出。对于之前不存在的文件,使用后会自动生成;对于已存在的文件,会内容长度相同的部分进行从头覆盖。

     *当只使用此类来代替输入流和输出流时,需要造两个不同的对象,在构造器中指定不同的模式。r:以只读的方式打开;rw:读取和写入;rwd:读取与写入,同时同步文件内容的·更新;rws:读取和写入,同步文件内容和元数据的更新·

     *seek()方法:指定写入时的覆盖位置,指定想要覆盖的位置的角标

二.NIO:新的IO API,NIO支持面向缓冲区,基于通道(Channel)的IO操作(IO支持面向流),传输速度更加高效;使用Path接口替换Film,代表一个无关平台的平台路径,描述目录结构中文件的位置,并且支持提供异常信息;使用Paths类提供的get()静态方法来对Path进行实例化;Path和Film可以相互转换

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值