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放在finally中
try(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文件结束了