IO流(一):概念,字节流,InputStream,OutputStream,FileInputStream,FileOutputStream
程序员文章站
2022-04-03 16:46:17
...
概念
I/O(Input/Output)流:内存于存储设备(硬盘等)之间传输数据的通道,程序允许通过流的方式于输入输出设备进行数据传输。流位于 java.io 包下
按方向分类:
- 输入流:将<存储设备>中的内容读入到<内存>中
- 输出流:将<内存>中的内容写入到<存储设备>中
按传输数据的单位分类:
- 字节流:以字节为单位,可以读写所有数据
- 字符流:以字符为单位,只能读写文本数据
按功能分类:
- 节点流:具有实际传输数据的读写功能
- 过滤流:在节点流的基础之上增强功能
字节流
在 jdk 中,提供了两个抽象类 InputStream 和 OutputStream ,它们是字节流的*父类。
InputStream的常用方法
方法声明 | 功能描述 |
---|---|
int read() | 从输入流读取一个8位字节,转换为0~255之间的整数,并返回这一整数,当没有可用字节时,返回-1 |
int read(byte[] b) | 从输入流读取若干字节,保存在参数b指定的字节数组中,返回的整数表示读取字节的数目 |
int read(byte[] b,int off,int len) | 从输入流读取若干字节,保存在参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目 |
void close() | 关闭此输入流并释放该流关联的所有系统资源 |
OutputStream的常用方法
方法声明 | 功能描述 |
---|---|
void write(int b) | 将指定的字节写入此输出流 |
void write(byte[] b) | 把参数b指定的字节数组的所有字节写到输出流 |
void write(byte[] b,int off,int len) | 将指定byte数组中从偏移量off开始的len个字节写入输出流 |
void flush() | 刷新此输出流并强制写出所有缓冲的输出字节 |
void close() | 关闭此输出流并释放该流关联的所有系统资源 |
面向文件的读写操作
-
FileOutputStream
构造方法:
FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。 参数可以写称盘符,例如 “F:\\a.txt” 不需要指明往哪个文件写入,每刷新一次,将首先覆盖原来的数据,再写入
FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。第二个参数是布尔类型的参数,意思是,是否追加, 如果为true,在原始数据后面写入,如果为false或者不写,即为不追加,任然是覆盖原来的数据再写入
-
public void write(byte[] b) 一次写多个字节,将b数组中所有字节,写入输出流
public static void main(String[] args) throws Exception { //字节输出流,如果里面没有此盘符,会出错 //但是,如果在此盘符下没有此文件,他会先创建文件,再写入 /* * 绝对路径:D:\\Development\\IdeaProjects\\IO\\Files\\a.txt * 相对路径:Files\\a.txt 相对于此项目的位置,与上一种形式等价 * */ FileOutputStream fileOutputStream = new FileOutputStream("Files\\a.txt",true); fileOutputStream.write(65);//一次输出一个字节 fileOutputStream.write(66); fileOutputStream.write('C'); byte[] bytes = new byte[]{65,66,67,68,69}; fileOutputStream.write(bytes);//一次输出一组字节 //输出一组字节,从下标1开始,输出3个 fileOutputStream.write(bytes,1,3); } -------------------------------------------------- 但是,F:\\a.txt 这个路径是个绝对路径,属于硬编码,不符合实际, 所以我们使用相对路径,就是相对于程序本身项目的位置,项目的根, "a.txt" 就使用这种方式
-
-
FileInputStream
-
public void read(byte[] b) 从流中读取多个字节,将读到的内容存入b数组,返回实际读到的字节数
public static void main(String[] args) throws IOException { //字节输入流 FileInputStream fis = new FileInputStream("Files\\a.txt"); //先写一个死循环,在里面读,再判断,因为没有可用字节时 //返回 -1 所以里面判断,当返回的整数为 -1 时,就跳出循环, //实际上就是读取完成 while (true) { //一次读取一个字节 int read = fis.read(); if(read == -1) { break; } System.out.println((char) read); } } 但是这种方式也不好,每读取一个字节,就要读一次磁盘,对于硬盘也是有损伤的 ------------------------------------- //一次读取一组字节 //创建一个长度为4的数组,作为读取时的缓存 //也可以写成 1024 * 1024 byte[] bytes = new byte[4]; while (true) { //每读取一次,填满数组,最后一次可能填不满 int i = fis.read(bytes); if(i == -1) { break; } //根据读取字节的个数,决定打印次数 for (int j = 0; j < i; j++) { System.out.print((char) bytes[j] + "\t"); } System.out.println(); } } 这种方式可以减少访问硬盘的次数
-
上一篇: 元朝是怎么灭亡的?为何如此短命?
下一篇: IO流的常用方法(三)