I/O编程
1.文件操作
1.1File类的使用
- 创建/删除/存在
new File.crateFile()/.delete()./exist()
注意!:每个文件系统对文件的分隔符不同,因此可以使用file类中的
File.separator #自动获得路径分隔符
- 获取文件的元信息
File.listFiles() #列出目录中的全部文件信息
1.2字节流和字符流
- 字节流:OutputStream(写),inputStream(读)
- 字符流:Reader,Wirter
文件操作步骤
- 读取文件
- 对字节流或者字符流实例化
- 执行读/写
- 关闭所有的流
1.2.1 OutputStream
OutputStream的继承关系图
从这个继承关系图可以看出OutputStram是一个抽象类,所以需要使用字节输出流的时候,一般都是用他的子类FileOutputStream
构造方法
FileOutputStream(File file) | 创建一个文件输出流写入指定的 File 对象表示的文件。 |
---|---|
FileOutputStream(File file, boolean append) | 创建一个文件输出流写入指定的 File 对象表示的文件。 |
FileOutputStream(String name) | 创建一个文件输出流,用指定的名称写入文件。 |
FileOutputStream(String name, boolean append) | 创建一个文件输出流,用指定的名称写入文件,参用追加或者覆盖的方式 |
方法
close() | 关闭此文件输出流并释放与此流关联的任何系统资源。 |
---|---|
write(byte[] b) | 写 b.length 字节从指定的字节数组来此文件输出流。 |
write(byte[] b, int off, int len) | 写 len 字节指定字节数组中的起始偏移 off 此文件输出流。 |
write(int b) | 将指定的字节写入该文件输出流中。 |
提示
使用AutoCloseable自动关闭接口
由于OutputStream是AutoCloseable的子类,所以可以使用try-catch来实现自动关闭
try{
File file = new File("");
FileOutputStream fileOutputStream = new FileOutputStream(file);
String str = "Hello";
fileOutputStream.write(str.getBytes());
}catch (Exception e){
e.printStackTrace();
}
1.2.2InputStream
InputStream的继承关系图
方法
close() | 关闭此文件输入流并释放与流关联的任何系统资源。 |
---|---|
read() | 从这个输入流读取一个字节的数据。 |
read(byte[] b) | 读到 b.length 从输入流到字节数组数据字节。 |
read(byte[] b, int off, int len) | 读到 len 从输入流到字节数组数据字节。 |
skip(long n) | 跳过并丢弃 n 字节输入流中的数据。 |
从这个继承关系图可以看出InputStram是一个抽象类,所以需要使用字节输出流的时候,一般都是用他的子类FileInputStream
测试
File file = new File("");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] data = new byte[1024];
int len = fileInputStream.read(data);
//字节转成字符串
System.out.println(new String(data,0,len));
可以一步读完这个文件的所有数组data防止数据越界
InputStream input = new FileInputStream(file);
input.readAllBytes();
1.2.3 Writer
Writer的继承关系图
方法
append(char c) | 追加输出内容 |
---|---|
close() | 关闭流,冲洗它 |
flush() | 冲流缓冲区 |
write(char[] cbuf) | 写一个字符数组。 |
write(char[] cbuf, int off, int len) | 写入一个字符数组的一部分。 |
write(int c) | 写一个字符。 |
write(String str) | 写一个字符串。 |
write(String str, int off, int len) | 写入字符串的一部分。 |
1.2.4 Reader
Reader的继承关系图
方法
skip(long n) | 跳过的字符。 |
---|---|
read() | 读取单个字符。 |
close() | 关闭流并释放与它相关联的任何系统资源。 |
mark(int readAheadLimit) | 标记流中的当前位置。 |
read(char[] cbuf) | 将字符读入一个数组。 |
read(char[] cbuf, int off, int len) | 将字符读入一个数组的一部分。 |
read(CharBuffer target) | 试图将字符读入指定的字符缓冲区中。 |
1.2.5字节流和字符流的区别
虽然在java.io包内都存在字符流和字节流,但是在数据传输(或者将数据存储在磁盘的时候),字节流数据能直接存在磁盘中,而字符流数据需要先暂存到缓冲区中,然后通过FLushable接口中提供的flush()方法,将数据强制刷新缓冲区的数据,才会有内容输出,否则不会有内容输出