学习笔记(二十)JavaSE(十三)I/O

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

输入/输出流

  1. 在 Java.IO包中操作文件主要有两大类:字节流、字符流,两类都分为输入和输出操作。
  2. 流中保存的实际上都是字节文件,字符流中多了对编码的处理
    注:磁盘上保存的文件是二进制字节数据
字节流主要架构

在这里插入图片描述

字节流常用方法

在这里插入图片描述
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)设置文件指针位置
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值