文章目录
I/O是什么
I/O 指的是输入/输出(Input/Output),在 Java 中 I/O 操作主要是指使用 Java 进行输入和输出操作
I/O分类
IO可以按照数据处理方式分为以下两类
- 流 I/O:传输过程是以字节流形式进行的,这样的设备是不需要缓冲机制的,简单易用但效率较低
- 块 I/O:把数据打包成块进行传输,传输基本单位为块,传输过程中需要缓冲区(buffer)支持,读写也是以块作为基本单位,效率很高但编程比较复杂
数据流
数据流是一串连续不断的数据的集合,数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流
对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据
不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的
数据流可以分为两类(以内存为判断标准)
- 输入流:从外界读取数据写入内存
- 输出流:从内存中读取数据到外界
I/O体系结构
整个 java.io 包中最重要的就是五个类和一个接口
- 五个类:File、OutputStream、InputStream、Writer、Reader
- 一个接口:Serializable
在学习过重很容易混淆,分不清是字节流还是字符流,看每个类的最后这个单词,如果是 Stream 的话就是字节流,如果是 Reader/Writer 的话就是字符流
Java 中字符是采用 Unicode 标准,一个字符是16位,即一个字符使用两个字节来表示,Java 中引入了处理字符的流
字节流
输入字节流
InputStream
InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,是所有字节输入流类的超类
继承自 InputStream 的流都是向程序中输入数据的,且数据单位为字节(8bit)
Inputstream类中的常用方法
读取一个 byte 的数据,返回值是高位补0的 int 类型值。若返回值= -1说明没有读取到任何字节读取工作结束
public abstract int read()
读取 b.length 个字节的数据放到b数组中,返回值是读取的字节数
public int read(byte b[])
从输入流中最多读取 len 个字节的数据,存放到偏移量为off的b数组中
public int read(byte b[], int off, int len)
返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果 InputStream 对象调用这个方法的话,它只会返回0,这个方法必须由继承 InputStream 类的子类对象调用才有用
public int available()
忽略输入流中的 n 个字节,返回值是实际忽略的字节数, 跳过一些字节来读取
public long skip(long n)
我们在使用完后,必须对我们打开的流进行关闭
public int close()
FileInputStream
FileInputStream可以使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。
在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色。
作用:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类
输出字节流
字符流
输入字符流
输出字符流
非流类
RandomAccessFile
从文件的任意位置进行存取(输入输出)操作
File
File类提供了描述文件和目录的操作与管理方法,主要用于命名文件、查询文件属性和处理文件目录
- File中常用方法
public boolean exists() 判断文件或目录是否存在
public boolean isFile() 判断是文件还是目录
public boolean isDirectory() 判断是文件还是目录
public String getName() 返回文件名或目录名
public String getPath() 返回文件或目录的路径
public long length() 获取文件的长度
public String[] list() 将目录中所有文件名和目录名保存在字符串数组中返回
public File[] listFiles() 返回某个目录下所有文件和目录的绝对路径,返回的是File数组
public String getAbsolutePath() 返回文件或目录的绝对路径
public boolean renameTo(File newFile) 重命名文件
public void delete() 删除文件
public boolean mkdir() 创建目录
public boolean createNewFile() 创建文件