Java-IO流
File类
- File类是操作文件和文件目录的类,能新建、删除、重命名、文件和目录
- 但File类不能访问文件本身的内容,如果需要访问文件内容,则需要使用输入/输出流
- File对象可以作为参数,传递给流的构造器,是操作流的基础
File类常用方法
public String getAbsolutePath():获取绝对路径
public String getPath() :获取路径
public String getName() :获取名称
public String getParent():获取上层文件目录路径。若无,返回null
public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
public long lastModified() :获取最后一次的修改时间,毫秒值
public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组
public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
public boolean mkdirs() :创建文件目录。如果此文件目录存在,就不创建了。如果上层文件目录不存在,一并创建
public boolean delete(): 删除磁盘中的文件或文件目录,删除注意事项:Java中的删除不走回收站。
IO 原理
- I/O是Input/Output的缩写,用于处理设备之间的数据传输,如读/写文件,网络通讯等
- 在Java程序中,对于数据的输入/输出操作,以"流"的方式进行的
- 输入input:读取外部数据(磁盘、光盘等存储设备)到程序内存中
- 输出output:将程序内存的数据,输出到存储设备
流的分类
- 按操作数据单位分类:字节流(8 bit)、字符流(16 bit),一个汉字2个字节
- 按数据流的流向分类:输入流、输出流
- 按流的角色的不同分类:节点流、处理流(以Buffered开头的类)
- 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
- 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,...),使用字节流处理,如果用此处理文本,有可能会出现乱码
IO 体系
IO体系图常用流各自的应用场景
字符流(操作字符串)
字符输入流
1、FileReader 字符输入流:用于文本文件读取操作,例:(.txt,.java,.c,.cpp)等文本文件
2、BufferedReader 缓冲区字符输入流:用于提升使用 FileReader 在文件读取方面的效率,针对大文本文件的读取
3、InputStreamReader :将一个字节的输入流转换为字符的输入流,可以设置指定字符流的编码格式
字符输出流
1、FileWrite 字符输出流:用于文本文件写入操作,例:(.txt,.java,.c,.cpp)等文本文件
2、BufferedWriter 缓冲区字符输出流:用于提升使用 FileWrite 在文件写入方面的效率,针对大文本文件的写入
3、OutputStreamWriter :将一个字符的输出流转换为字节的输出流,可以设置指定字符流的编码格式
字节流(操作非文本)
字节输入流
1、FileInputStream 字节输入流:用于非文本文件读取,例:(.jpg,.mp3,.mp4,.avi,.doc,.ppt)等
2、BufferedInputStream 缓冲区字节输入流:用于提升使用 FileInputStream 在文件读取方面的效率
字节输出流
1、FileOutputStream 字节输出流:用于非文本文件写入操作,例:(.jpg,.mp3,.mp4,.avi,.doc,.ppt)等
2、BufferedOutputStream 缓冲区字节输出流:用于提升使用 FileoutputStream 在文件写入方面的效率
对象流
对象的序列化
- ObjectOutputStream 序列化(写入操作):把内存中的Java对象,转换成平台无关的二进制流,从而方便保存到磁盘和网络传输
- ObjectInputStream 反序列化(读取操作):把硬盘/网络中的二进制流还原成Java对象,方便程序调用
自定义类要想序列化、反序列化,需满足以下要求
1、需要实现接口:Serializable
2、当前类提供一个全局常量:serialVersionUID
3、除了当前Person类需要实现Serializable接口之外,还必须保证其内部所有属性
也必须是可序列化的。(默认情况下,基本数据类型可序列化)
RandomAccessFile 随机读取写入操作类(应用于:多线程继点下载)
- 1.RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
- 2.RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
- 3.如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建,如果写出到的文件存在,则会对原有文件内容进行覆盖。(默认情况下,从头覆盖)
- 可以通过相关的操作,实现RandomAccessFile“插入”数据的效果