Java-IO-字节流
IO
什么是IO流
input
:输入——数据从硬盘到内存output
:输出——数据从内存到硬盘- 流:数据
IO的分类
根据数据流向可以分为输入流和输出流
输入流:把数据从其他设备
读取到内存
中的流
输出流:把数据从内存
写出到输出设备
上的流
格局数据的类型分为:字节流和字符流
一切皆为字节
明确一个概念:
一切文本、视频、图片、视频在存储时,都是以二进制数字的形式保存的
字节输出流OutputStream
此抽象类是表示输出字节流的所有类的超类。
输出流接受输出字节并将这些字节发送到某个接收器
常用方法
1 | public void close()throws IOException |
子类
1 | ByteArrayOutputStream |
FileOutputStream
包路径
1 | java.io |
构造方法
1 | FileOutputStream(File file) |
作用:
- 创建一个
FileOutputStream
对象 - 会根据构造方法中传递的文件/文件路径,创建一个空的文件
- 会把
FileOutputStream
对象指向创建好的文件
写数据到文件
原理:内存->文件
Java程序 –> JVM –> OS(操作系统) –> OS调用写数据的方法 –> 把数据写入到文件中
步骤:
- 创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
- 调用FileOutputStream对象中的方法write,把数据写入到文件中
- 释放资源(流会占用一定的内存,使用完毕要把内存清空,提高程序的效率)
1 | public static void main(String[] args) throws IOException { |
文件存储和记事本打开原理
- 存储
写入数据会把十进制的整数转化为二进制整数,
fos.write(97);
会把97
变为1100001
- 记事本
任意的文本编辑器(记事本),
在打开文件的时候都会查询编码表,
把字节转换为字符表示,会把97
变为a
字节输出流写多个字节的方法
1 | FileOutputStream fos = new FileOutputStream("D:\\a.txt"); |
选定输入几个字节
1 | FileOutputStream fos = new FileOutputStream("D:\\a.txt"); |
输入字符串
1 | FileOutputStream fos = new FileOutputStream("D:\\a.txt"); |
数据的追加续写
这就用到了另外两个FileOutputStream的构造方法
1 | FileOutputStream(File file, boolean append) |
1 | FileOutputStream fos = new FileOutputStream("D:\\a.txt",true); |
字节输入流InputStream
此抽象类是表示字节输入流的所有类的超类。
包路径
1 | java.io |
子类
1 | AudioInputStream |
常用方法
1 | public abstract int read()throws IOException |
FileInputStream
构造方法
1 | FileInputStream(File file) |
作用:
- 创建一个
FileInputStream
对象 - 会把
FileInputStream
对象指定到构造方法的位置中去读取文件
原理:
Java程序 -> JVM -> OS -> OS读取数据的方法 -> 读取文件
常用方法
1 | public int read()throws IOException |
步骤:
- 创建FileInputStream对象,构造方法中绑定要读取的数据源
- 使用
FileInputStream
中的read
方法读取文件 - 释放资源
1 | FileInputStream fis = new FileInputStream("D:\\a.txt"); |
读取未知文件,使用while循环,固定写法
1 | FileInputStream fis = new FileInputStream("D:\\a.txt"); |
原理:
创建构造函数之后,会创建一个指针指向文件的第一个字节,每当运行read()
方法,指针就指向下一个
当read()
方法返回-1时,读取将会结束
一次读取多个字节的方法
使用第二个构造函数
注意:
- byte[]设定了一次读取的个数,起到缓冲作用,存储每次读取到的多个字节;数组的长度一般设定为1024或者1024的整数倍
read
方法的返回值int是每次读取的有效元素的长度1
2
3
4
5
6
7FileInputStream fis = new FileInputStream("D:\\a.txt");
byte[] bytes = new byte[2];
int len = fis.read(bytes);
//返回数组的长度
System.out.println(len);
System.out.println(Arrays.toString(bytes));
fis.close();
原理:
一次读取多个字节,
构造函数创建后,指针指向第一个字节
在此后的read方法中,会一次读取数组长度的字节
之后指向数组长度之后的那个字节
读取固定写法
1 | FileInputStream fis = new FileInputStream("D:\\a.txt"); |
文件复制
原理:
读入再输出即可
1 | //复制一个文件 |