文件操作

本文详细介绍了Java中I/O流的基本概念,包括字节流、字符流、底层流和包装流的区别与使用方法。深入探讨了File类的构造方法、API及文件加密原理,同时提供了序列化与反序列化的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

File

构造方法

new File(String 文件路径)
new File(String 父路径, String 子路径)

API

createNewFile():以此File路径创建一个文件
delete():删除此文件或空目录
exists():判断该文件是否纯在

getAbsoluteFile():获得绝对路径
getCanonicalPath():获得绝对路径的字符串形式

getName():获得文件名
getPath():获得文件名的字符串形式

isDirectory():判断是否为目录
isFile():判断是否为文件
lastModified():返回最后一次的修改时间
setlastModified():设置最后一次的修改时间
length():返回文件大小

list():返回一个由该目录下的文件和目录组成的字符串数组
list(FilenameFilter filter):返回一个由该目录下的且满足其中过滤器的文件和目录组成的字符串数组

listFiles():返回一个由该目录下的文件组成的文件数组
listFiles(FilenameFilter filter):返回一个由该目录下的且满足其中过滤器的文件组成的文件数组

mkdir():创建该目录
mkdirs():创建该目录,且包括必须且不存在的父目录

过滤器

new FileFilter() {
	@Override
	public boolean accept(File f) {
	//处理f,返回true, 表示f要保留
	//返回false, 表示f不想保留了
	return f的处理结果;
	}
}

路径

绝对路径

从盘符(windows)或者根目录(Linux/MACOSX)开始的路径

相对路径

绝对路径 = 当前目录 + 相对路径

根据相对路径, 获得当前程序环境下的绝对路径:
1.类名.class.getResource(“相对路径”).getPath():得到一个绝对路径
2.类名.class.getClassLoader().getResource(“相对路径”).getPath():得到一个绝对路径
ClassLoder:类加载器
类路径 classpath: 就是src编译后的目录, 也叫编译根目录
以上 1 和 2 代码得到的绝对路径, 都是在编译后的目录中, 和src没有直接关系
在开发中, 我们是先将文件放入src中的, 会自动编译到类路径中

I/O流

分类

1.以单位来分: 字节流 字符流
字节流:InputStream/OutputStream
字符流:Reader/Writer
2.以层级来分: 底层流 包装流

字节流(用来做文件复制):FileInputStream/FileOutputStream

构造方法

FileInputStream(“文件路径”);
FileOutputStream(“文件路径”,boolean);

API

write();写入这个int值得低八位
write(byte[] b):写入一个字节数组
write(byte[] b, int off, int len):写入一个字符数组,从off开始的len个字节

read();读文件中一个字节, 并且存入int的低八位, 其余空位补0当返回 -1 的时候, 说明文件读到了末尾
read(byte[] b):读取一个字节数组
read(byte[] b, int off, int len):从该输入流读取最多len个字节的数据为字节数组。

包装字节流

BufferedInputStream/BufferedOutputStream
构造方法:BufferedInputStream(字节流对象);
BufferedOutputStream(字节流对象);
API:与字节流相同。

文件加密

原理:将读出来的字节做了运算后写入到新文件中
解密:将加密过的文件, 再读出, 做一个还原运算, 重新写入
一般使用^

异常处理

try - catch
close放在finally中

不需要close方法的写法:

try - catch
close放在finallytry(BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a_back.txt"))) { 
} catch (FileNotFoundException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}

一般写法:

BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
	InputStream is = new FileInputStream("a.txt");
	bis = new BufferedInputStream(is);
	OutputStream os = new FileOutputStream("a_back.txt");
	bos = new BufferedOutputStream(os);
} catch (FileNotFoundException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
} finally {
	if (bis != null) {
	try {
		bis.close();
	} catch (IOException e) {
		e.printStackTrace();
		}
	}
	if (bos != null) {
	try {
		bos.close();
	} catch (IOException e) {
		e.printStackTrace();
		}
	}
}

字符流Reader/Writer

构造方法

InputStreamReader(InputStream in)
OutputStreamWriter(OutputStream out)
InputStreamReader(InputStream in, String charsetName)
OutputStreamWriter(OutputStream out, String charsetName)
charsetName:字符集

API

与字节流相同

包装字符流:缓冲字符流

BufferedReader/PrintWriter
构造方法:BufferedReader(字符流对象);
1.只能清空原文件内容, 但是可以指定字符集
PrintWriter(String fileName, String csn)
2.可以在原文件上追加内容, 但是不可以指定字符集, 可以自动刷新缓冲区
PrintWriter(OutputStream out, boolean autoFlush)
3.可以在原文件上追加内容, 可以指定字符集, 可以自动刷新缓冲区
PrintWriter(Writer out, boolean autoFlush)
API:readLine():读取一整行, 返回null 标记读到文件末尾
void print(Object): 写出内容, 不加换行,不自动刷新
void println(): 写出内容, 并且换行,自动刷新

对象输入输出流

序列化/反序列化

对象转换为文件/字节称为序列化
文件/字节转换为对象称为反序列化

构造方法

ObjectInputStream(InputStream)
ObjectOutputStream(OutputStream)

API

readObject()
writeObject(Object)

可序列化的Serializable

接口:接口中没有常量, 也没有抽象方法, 空接口,仅用于标识可串行化的语义。

transient

被该修饰词修饰的变量在序列化的时候, 会被忽略掉

serialVersionUID

公开的静态常量
给类添加固定的序列版本号

EOFException

读对象到末尾时产生的异常:End Of File文件结束了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值