Java SE
本系列为本人学习情况记录,部分资料来自老师课件或书籍摘录。
Java I/O系统
File类
方法 | 描述 |
---|---|
File(String filePath) | 通过给定的字符串来创建一个表示对应文件的File实例 |
exists() | 判断此File实例对应文件是否存在 |
isFile() | 判断此File实例是否是一个文件 |
isDirectory() | 判断此File实例是否是一个文件夹 |
getName() | 获得此File实例对应的文件或文件夹名称 |
getAbsolutePath() | 获得此File实例对应文件或文件夹的绝对路径 |
lastModified | 返回此File实例最后修改时间 |
length() | 返回此File实例的长度,单位字节 |
createNewFile() | 创建文件,并返回是否成功 |
canRead() | 判断此File实例是否可读 |
canWrite() | 判断此File实例是否可写 |
isHidden() | 判断此File实例是否已隐藏 |
delete() | 删除此File实例对应的文件或文件夹,并返回是否成功 |
deleteOnExit() | 在进程结束时删除此File实例对应的文件或文件夹 |
mkdir() | 创建文件夹,并返回是否成功 |
mkdirs() | 创建文件夹及其父路径,并返回是否成功 |
listFiles() | 获得此File实例对应的目录下的所有文件 |
canExecute() | 判断此文件是否可执行(Linux下有效) |
文件路径名格式应为:XX\XX\xx.xxx
输入/输出流
- 在 Java.IO包中操作文件主要有两大类:字节流、字符流,两类都分为输入和输出操作。
- 流中保存的实际上都是字节文件,字符流中多了对编码的处理
注:磁盘上保存的文件是二进制字节数据
字节流主要架构
字节流常用方法
skip()方法多用于多线程下载
使用字节流读写文件:
public byte[] readFile(String filePath) throws IOException{
File file = new File(filePath);
InputStream inputStream = new FileInputStream(file);
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes, 0, bytes.length);
inputStream.close();
return bytes;
}
public void writeFile(byte[] bytes, String filePath) throws IOException{
File file = new File(filePath);
OutputStream outputStream = new FileOutputStream(file);
outputStream.write(bytes);
outputStream.flush();
//close()方法中其实调用了flush()方法
outputStream.close();
}
字符流主要架构
装饰器模式
装饰器通常是内部拥有一个可装饰的父类,可以传入一个需要被装饰的对象,装饰器实现类内部会截断方法实现,并添加功能。
使用带缓冲的字符流读写文件:
public List<String> readFile(String filePath){
List<String> list = new ArrayList<>();
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath))) {
String line = null;
while((line = bufferedReader.readLine()) != null) list.add(line);
}catch (IOException e){ e.printStackTrace(); }
return list;
}
public void writeFile(String filePath, List<String> list){
StringBuilder stringBuilder = new StringBuilder();
list.forEach(line -> { stringBuilder.append(line).append("\n"); });
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath))) {
bufferedWriter.write(stringBuilder.toString());
}catch (IOException e){ e.printStackTrace(); }
}
BufferedInputStream比FileInputStream多了一个缓冲区,执行read()时先从缓冲区读取,当缓冲区数据读完时再把缓冲区填满。
因此,当每次读取的数据量很小时,FileInputStream每次都是从硬盘读入,而BufferedInputStream大部分是从缓冲区读入。读取内存速度比读取硬盘速度快得多,因此BufferedInputStream效率高。
BufferedInputStream的默认缓冲区大小是8192字节。当每次读取数据量接近或远超这个值时,两者效率就没有明显差别了。
BufferedOutputStream和FileOutputStream同理,差异更明显一些。
InputStreamReader
这是一个特殊的类,可以看作是字节流和字符流的转换器
Reader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter
PrintWriter的写入方法类似于PrintStream
可以使用println、printf等格式化写入模式
序列化和反序列化
对象的输入和输出
- ObjectInputStream & ObjectOutputStream可以读/写可序列化的对象(实现Serializable接口)
- 序列化的作用就是把对象以二进制写入到文件中
- 反序列化的作用就是把二进制文件转化为对象
使用对象流读/写文件:
public void writeFile(String filePath, Object object) throws IOException{
new ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filePath));
out.writeObject(object);
out.close();
}
public Object readFile(String filePath) throws IOException{
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filePath));
Object object = in.readObject();
in.close();
Idea设置自动生成序列码
随机访问文件RandomAccessFile
该类的实例支持读取和写入随机访问文件。 随机访问文件的行为类似于存储在文件系统中的大量字节。 有一种游标,或索引到隐含的数组,称为文件指针 ; 输入操作读取从文件指针开始的字节,并使文件指针超过读取的字节。
new RandomAccessFile(File file, String mode);
new RandomAccessFile(String name, String mode);
mode: 1.r 读
2.rw 读写
3.rwd 打开以便读取和写入。相对于 "rw","rws" 还要求对“文件的内容”或“元数据”的每个更新都同步写入到基础存储设备。
4.rws 打开以便读取和写入,相对于 "rw","rwd" 还要求对“文件的内容”的每个更新都同步写入到基础存储设备
方法 | 描述 |
---|---|
length() | 返回读取的文件大小(字节) |
setLength(int length) | 设置文件长度(设置成0可清空文件) |
seek(int pos) | 设置文件指针位置 |