一、I/O流分类
字节流:将内存中的数据存储到永久设备,并且从永久设备中读取数据存到内存
字符流:为了能够更好的处理文件中的字符,在字节流的基础之上,增加了对字符的编码能力后, Java提供了专门用于读取和写入字符数据.(底层任然是字节流,只是程序提供了帮你转换字符的过程而已)
二、I/O流的作用
我们要读取一个文件或者想要从电脑上得到数据,那么必须要在电脑的硬盘上读取。
而数据在硬盘上是以文件的形式进行存储的,Java通过java.io.File对象实现对硬盘上文件进行操作。( Java要想实现对硬盘文件的操作,那么该文件必须映射到Java的一个java.io.File对象上,设置硬盘上文件的路径。没有这个路径没有办法去追踪到这个对象,也没有办法读取这个文件)
对于硬盘文件系统来说,存在文件和目录(文件夹)两种,无论是文件还是目录,Java都是用java.io.File对象表示。
三、java.io.File具体操作
Java.io.File文件操作方法:
判断该File对象所代表的是否是一个文件:boolean isFile = file.isFile( );
判断该File对象所代表的文件是否存在;boolean isExists = file.exists( );
将该文件创建到硬盘上:boolean isCreated = file.creatNewFile( );
获得该文件的文件名:String filename = file.getName( );
获得该文件的绝对路径:String absoluteFilePath = file.getAbsoluteFilePath( );
获得该文件的大小: long length = file.length( ); 文件大小的单位是Byte
删除该文件:boolean isDelete = file.delete( ); —— 这里的删除是无法在回收站找到 的,而是直接把该文件数据在硬盘上进行删除
Java.io.File目录操作方法:
因为无论是文件还是目录,对应的都是一个Java.io.File对象,因此使用Java.io.File对象创建一个目录
根据该目录的路径创建对应的Java.io.File对象 :
String dirPath = “ ”;
File file = new (dirPath );
判断该目录是否存在:boolean isExists = file.exists( );
对目录的创建:
boolean isCreated = file.mkdir( ); —— 只能创建目录本身,如果该目录所在的目录 不存在,创建失败
boolean isCreated = file.mkdirs( ); —— 能够实现多级目录的创建,如果该目录所在 的目录不存在,可以一次性完成这些目录的创建
获得File对象对应目录的名字:String dirname = file.getName( );
获得该文件的绝对路径:String absoluteFilePath = file.getAbsoluteFilePath( );
获得该目录是否存在子目录或者文件对应的File数组信息:
File [ ] children = file.listFiles( );
创建该目录对应的路径:File file = new File(dirpath);
获得该目录下的所有子目录和文件数组: File[ ] children = file.lisstFiles( );
判断该File对象是否是一个目录 boolean isdir = file.isDirectory( );
判断能否获得子目录和文件:
Optional.ofNullable(children ).isPreseent( ) children.length > 0
获取当前字节信息:input.read( )
四、I/O流两大组成
IO可以分为输入流和输出流:
(1)输入流:用于将文件中的数据传递到程序中的IO对象称之为输入流;
(2)输出流:用于将程序中的数据传递到文件中的IO对象称之为输出流;
我是程序,数据奔着我来就是输入,从我这里出去就是输出
下图为输入流输出流的具体执行过程!
我们要想实现将内存中的数据存储到文件中,或者从文件中读取数据到内存中,那么就需要使用I/O (Input/Output)实现。(File相当于管道,Input和Output是管道的两头,IO数据流从这里经过)
五、字节输入流和字节输出流
(1) 字节输入流的顶级接口是java.io.InputStream , 其最基本的实现类是java.io.FileInputStream (文件字节输入流)。
(2)字节输出流的顶级接口是java.io.OutputStream,最基本的实现类是java.io.FileOutputStrea(文件字节输出流)。
除此之外其他字节输入流均之为包装流,包装流必须借助于基本流才能工作。使用FileInputStream 读取文件数据是一个字节一个字节的读取,每一次读取都会获得当前字节的字节编码,当所有的字节读取完毕后,会得到一个-1做为标志。对输入流可以增加缓冲区buffer。
六、Java提供了ObjectInputStream和ObjectOutputStream两个包装类,能够实现将对 象写入到文件中,或者将文件中的对象数据读取到程序中(FileInputStream 和 FileOutputStream两个操作是相同的)
- 提前写好User类
- 分别初始化FileOutputStream和ObjetOutputStream
- 关闭输出流,关闭最外层ObjectOutputStream即可
- 根据写入文件路径创建FileOutputStream对象
- 根据FileOutputStream创建ObjectOutputStream
- 创建User类型对象,传递参数
- 使用ObjectOutputStream的writerObject( ) —— 写对象方法
- 把这个数据变成让它可以存在硬盘上(把数据往硬盘上存,都是二进制)二进制序列
- 这时候User类要具有一个接口implements Serializable.
- 这个时候这个文件就写入成功,程序可以读懂的
- 这个时候Java的实现类需要写一个序列号码,是为了可以找到和读取这个文件, 使用java.io.ObjectInputStream读取文件中的对象数据,可以生成一个默认值和 程序自己生成一个唯一值
下面有一个示例代码,进行解析:
这个代码的意思是:先从我的桌面上新建一个名为“输入流和输出流.png”的图片,然后新建一个文件把这个图片的路径复制好,
随后我新建一个需要添加这个图片的文件夹路径,把这个图片文件挪到这个文件夹路径里面。
其中我增加了缓冲区,让Java应用程序读一个字节写一个字节,直到把这个文件写入到新的文件之中!
在程序的最后我们要关闭输入流输出流,以避免资源的浪费。
对于使用mac系统的用户建议文件路径可以写成下图所示;windows系统的用户文件路径复制你所在的文件路径即可!!!
以上是我对于I/O流的简单学习,希望不足之处请各位大佬多多指教!