I/O流
2023年6月1日大约 6 分钟
I/O流
文件
概念
1、文件
保存数据的地方
2、 文件流
- 流:数据在数据源(文件)和程序(内存)之间的路径
- 输入流:将磁盘中的文件写入内存
- 输出流:将内存中的内容写入磁盘
文件操作
- 创建文件对象相关的构造器和方法
new File(String pathname)
根据路径创建一个File对象new File(File parent,String chil)
根据父目录文件+子路径构建new File(String parent,String child)
根据父目录+子路径构建- createNewFile创建新文件
- 获取文件的相关信息
- getName、getAbsolutePath、getParent、length、exists、isFile、isDirectory
- 目录操作和文件删除
- 创建一级目录:mkdir
- 创建多级目录:mkdirs
- 删除空目录或文件:delete
IO流原理及流的分类
Java IO原理
- IO流是input、output的缩写,用于处理数据传输,如读写文件、网络通信
- 在Java程序中,对于数据的输入。输出以“流(stream)”的方式进行
- java.io包下提供了各种“流”的类和接口,用于获取不同种类的数据,并通过方法输入或输出数据
流的分类
操作数据单元:字节流、字符流
数据流的流向:输入流、输出流
流的角色:节点流、处理流(字符流)
*输入流
InputStream
FileInputStream
Reader(字节输入流)
- 关系图
FileReader
- 相关方法
new FileReader(File/String)
read
:每次读取单个字符,返回该字符,如果到文件末尾,返回-1read(char[])
:批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾,返回-1
- 相关API
new String(char[])
:将char[]转成Stringnew String(char[],off,len)
:将char []的指定部分转换成String
*输出流
OutputStream(字节)
FileOutputStream
ObjectOutputStream
Writer(字符)
FileWriter
- 常用方法
- new FileWriter(File/String):覆盖模式,相当于流的指针在首段
- new FileWriter(File/String,true):追加模式,相当于流的指针在尾端
- write(int):写入单个字符
- write(char[]):写入指定数组
- write(char[],off,len):写入指定数组的指定部分
- writer(string):写入指定字符串
- writer(string,off,len):写入指定字符串放入指定部分
- 相关API
- String类
- toCharArray:将String转换成char[]
- 注意:FileWriter使用后,必须关闭(close)或刷新(flush),否则写入不到指定文件
OutputStreamWriter
节点流和处理流
- 节点流可以从一个特定的数据源读取数据,如FileReader、FileWriter
- 文件节点流:FileInputStream、FileOutputStream、FileReader、FileWriter
- 数组节点流:ByteArrayInputStream、ByteArrayOutStream、CharAttayReader、CharArrayWriter
- 访问管道、访问字符流
- 处理流(包装流)是"连接"在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,更加灵活,如BufferedReader、BufferedWriter
- 节点流与处理流的区别与联系
- 节点流是底层流/低级流,直接跟数据源相接
- 处理流包含节点流,及可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出
- 处理流对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连
标准输入输出流
类型(编译类型) 类型(运行类型) 默认设备 System.in标准输入 InputStream BufferedInputStream 键盘 System.out标准输出 PrintStream PrintStream 显示器 转换流-InputStreamReader和OutputStreamWriter
- 解决文件乱码问题
打印流-PrintStream和PrintWriter
- 打印流只有输出流
- PrintStream(字节流)
- PrintWriter(字符流)
序列化与反序列化
- 序列化:在保存数据时,保存数据的值和数据类型
- 反序列化:在恢复数据时,恢复数据的值和数据类型
- 需要让某个对象支持序列化机制,则必须让其类是可序列化的(实现接口:Serializable或Externalizable)
- Serializable:标记接口,没有方法
- Externalizable:该接口有方法需要实现
Properties类
- 专门用于读取配置文件的的集合类
- 配置文件格式:键=值
- 注意:键值对不需要有空格,值不需要用引号括起来。默认类型是String
- 常见方法:
- load:加载配置文件的键值对到Properties对象
- list:将数据显示到指定设备
- getProperty(key):根据键获取值
- setProperty(key,value):设置键值对到Properties对象
- store:将Properties中的键值对存储到配置文件中,在idea中,保存信息到配置文件,如果含有中文,会存储为UNICode码
作用:存储和读取数据
I:input
O:output
流:像水流一样传输数据
IO流的分类
字节流
FileOutputStream
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中
public class ByteStreamText{
public static void main(String[] args) throws IOException{ //抛出异常
//步骤:
//1.创建对象
FileOutputStream fos = new FileOutputStream("myio\\a.txt")//创建对象的路径
//2.写出数据
fos.write(97);
//3.释放资源
fos.close();
}
}
运行结果:a
- 创建对象细节:
- 参数是字符串表示的路径或者是File对象都是可以的
- 如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
- 如果文件已经存在,则会清空文件
- 写出数据细节:
- write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
- 释放资源细节:
- 每次使用完流之后都要释放资源
void write(int b) //一次写一个字节数据
void write(byte[] b) //一次写一个字节数组数据
void write(byte[] b,int off,int len) //一次写一个字节数组的部分数据
FileInputStream
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
public class ByteStreamText{
public static void main(String[] args) throws FileNotException{
//步骤:
//1.创建对象
FileInputStream fis = new FileInputStream("myio\\a.txt");
//2.读取数据
int b1 = fis.read();
System.out.println(b1);
//3.释放资源
fis.close();
}
}
创建对象细节:如果文件不存在,直接报错
读取数据细节:
- 一次读取一个字节,读出来的就是数据在ASCII上对应的数字
- 读到文件末尾,read方法返回-1
释放资源细节:每次使用完流之后都要释放资源
字节输入流循环读取
import java.io.FileInputStream;
import java.io.IOException;
public class ByteStreamText{
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("myio\\a.tet");
int b;
while((b = fis.read()) != -1){
System.out.println((char)b);
}
fis.close();
}
}
文件拷贝
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class BytestreamText{
public static void main(String[] args) throws FileNotFoundException{
FileInputStream fis = new FileInputStream("D:\\原路径.mp4");
FileOutStream fos = new FileOutputStream();
}
}