IO流(文件流)
- 什么是IO流
- 主要针对磁盘文件及文件夹的操作,新建、删除、修改等等操作
1. File 文件类
- 包: Java.io
public Class File extends Object implements Serializable, Comparer<File>
-
文
件
\color{#ff0036}{文件}
文件和
目
录
路
径
名
\color{#ff0036}{目录路径名}
目录路径名的抽象表示形式
- 常用的构造方法:
File(String pathname)
通过给定的路往名来创建一个新的File实例。 - 常用方法:
返回值 | 用法 | 作用 |
---|
boolean | createNewFile() | 当且仅当路径指定的文件不存在的时候,创建一个空文件 |
boolean | delete() | 删除此路径表示的文件或目录 |
boolean | exists() | 测试此路径指的文件或目录是否存在 |
String | getName | 返回此路径所表示的文件名或文件来名 |
boolean | isDirectory | 检测此路径表示的是否是文件夹 |
boolean | isFile | 是否是文件 |
boolean | isHidden | 是否是隐藏文件 |
boolean | mkdir | 创建抽象路经指的目录 |
返回抽象路径的信息 |
String [] | list () | 返回一个字符串数组,是该路径下的所有文件和文件来名 |
list [] | listFiles() | 返回文件对象数组 |
Serializable 序列化接口
- 用处: java的类只有实现了Serializable接口,它的对象才是可序列化的,Serializable是
一
个
空
接
口
\color{#ff0036}{一个空接口}
一个空接口,它的目的只是简单的标识一个类的对象可以被序列化。
- 什么是序列化和反序列化?
- 序列化将对象写入到IO流中;
- 反序列化从IO流中恢复成对象;
- 意义: 允许将实现了序列化的类转换位字节序列,这些字节序列可以保存到磁盘上,或者通过网络传输,以达到以后恢复成原来的对象。序列化使对象可以脱离程序的运行而独立存在。
- 场景: 所有可以在网络上传输的对象都必须是可序列化的
- 详细请点这里:传送门
流
![流的关系](https://img-blog.csdnimg.cn/2020052521555081.png#pic_center)
- 针对文件的操作
- 输出流(Outputstream): 写入的动作 将内存中的数据写入到磁盘中
- 输入流(inputstream): 读的动作 将文件内容读取出来到内存中
- 总的来说:
读
取
输
入
输
出
写
入
\color{#ff0036}{读取输入 输出写入}
读取输入输出写入 我们站在内存中来看
OutPutStream 字节输出流
- 包: Java.io
public abstract class OutPutStream implements Closeable, Flushable
- 此
抽
象
类
\color{#ff0036}{抽象类}
抽象类是表示
输
出
字
节
流
\color{#ff0036}{输出字节流}
输出字节流的所有类的超类。
FileOutputStream 文件输出字符流
- 包: java.io
public class FileOutputStream extends OutputStream
- 文件输出流 是用于将数据写入File或FileDescriptor 的输出流。
- FileOutputStream用于写入图像之类的原始字节的流。要写入字符流,建议使用FileWriter
- 构造方法:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200525223150267.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20xNjMxMm1h,size_16,color_FFFFFF,t_70#pic_center)
- 常用方法:
返回值 | 用法 | 作用 |
---|
void | close() | 关闭此文件输出流释放与此流有关的所有资源 |
protected void | finalize() | 清理此文件的所有连接,并确保此文件输出流时调用close方法 |
void | write(byte[] b) | 将此字节数组长度的数据从此数组流入文件中 |
FileWriter 字符流
- 包: java.io
public class FileWriter extends OutputStreamWriter
- 用来写入的便捷类
- 构造方法:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200525225749990.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20xNjMxMm1h,size_16,color_FFFFFF,t_70#pic_center)
- 常用方法
- write
- public void write(String str)
- 写入字符串
- flush
BufferedWriter
- 包: java.io
public void BufferedWriter extends Writer
- 写入字符流,效率较高
- 构造函数
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200525232543714.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20xNjMxMm1h,size_16,color_FFFFFF,t_70)
- 方法:
InputStream 输入流
- 从文件到内存
public abstract class InputStream extends Object implements Closeable
- 方法:
返回值 | 用法 | 作用 |
---|
int | available() | 返回实际的可读字节数 |
void | close() | 关闭输入流 |
void | mark(int redlimit) | 此输入流中标记当前位置 |
boolean | markSupported | 测试这个输入流是否支持mark和reset方法 |
abstract int | read() | 返回读取流的下个字节 |
int | read(byte[] b) | 从此输入流中读取到一定数量的字节,并存储到b中 |
void | reset() | 重新回到最后一个mark()方法的位置 |
long | skip(long n) | 跳过和丢弃此输入流数据中n个字节 |
FileInputStream 文件输入流
- 字节流,其它的和FileOutputStream相反
FileReader
- 用于读取字节的便捷类。
- emm… 和FileWriter是一对
BufferedReader
- 读取字符流,缓冲各个字符,从而高效读取
- 特殊方法:readLine() 读取一行 遇到\r或\n时输出
[面试题]java中IO流分成几种?
- 按功能分:
输入流(InputStream) 输出流(OutputStream)
类(接口) | 名 | 说明 |
---|
OutputStream | 输出流 | 把对象从内存→文件 |
InputStream | 输入流 | 把文件→内存 |
FileOutputStream | 字节流 | 输出(写),操作任何文件类型 |
FileInputStream | 字节流 | 输入(读),操作任何文件 |
BufferedWriter/FileWriter | 字符流 | 写 字符串 |
BufferedReader/FileReader | 字符流 | 读 字符串 |
- 按类形分
- 字节流和字符流: 节位是以
8
字
节
\color{#ff0036}{8字节}
8字节大小输入/出流动,节符以
16
字
节
\color{#ff0036}{16字节}
16字节大小流动
DataOutputStream 数据输出流
- 可以将多种数据类型写入文件,不再只是字串了。
public class DataOutputStream extends FilterOutputStream implements DataOutput
- 构造方法:
DataOutputStream(OutputStream out)
- 常用方法:
- write数据类型: 写入 用包装类中的方法,将基本类型数据转成机器可识别的long int 4-byte…然写入文件。
public class TestDataOutputStream {
public static void main(String[] args) {
String name="小旺";
int age=22;
double score=100;
FileOutputStream out = null;
DataOutputStream dos =null;
try {
out = new FileOutputStream("e:\\temp\\info\\data.txt",true);
dos = new DataOutputStream(out);
dos.writeUTF(name);
dos.writeInt(age);
dos.writeDouble(score);
System.out.println("写入成功~~");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (dos!=null)
dos.close();
if (out!=null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
DataInputStream 数据输入流
- 可以有类型的读取文件中的数据,而不只是字符串
public class DataInputStream extends FliterInputStream implements DataInput
- 构造方法: DataInputStream(InputStream in)
public class TestDataInputStream {
public static void main(String[] args) {
String name ="";
int age=0;
double score=0;
FileInputStream fis = null;
DataInputStream dis =null;
try {
fis = new FileInputStream("e:\\temp\\info\\data.txt");
dis = new DataInputStream(fis);
name = dis.readUTF();
age = dis.readInt();
score = dis.readDouble();
System.out.println(name+","+age+","+score);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (dis!=null)
dis.close();
if (fis!=null)
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
序列化与反序列化
ObjectOutputStream 序列化存储
- 将对象及对象的信息状态存储在文件中。
public class ObjectOutputStream extends OutputStream implements ObjectOutput ,ObjectStreamConstants
- 将Java 对象的基本数据类型和图形写入OutputStream。可以用ObjectInputStream 读取对象,实现对象的持久存储