File
绝对路径:
1.window是 - 从盘符开始C:\xx\xx…
2. Linux是 - /xx/xx (从根目录开始)
相对路径:
会有一个参考对象 a.txt
参考值:/Users/bonnie/Desktop 相对路径是: a.txt
a.txt的真实路径为/Users/bonnie/Desktop/a.txt
常用API
传入文件路径,构造File对象
注意:new出来的File对象,只是在JVM内存中有一个对象,和本地磁盘有没有这个文件无关
File file = new File("a.txt");
传入父路径和子路径,共同构造File对象
File file = new File("b/c","d/a.txt");
获得file的绝对路径
String path = file.getAbsolutePath();
file对应的文件或者目录存不存在
boolean exists = file.exists();
测试此抽象路径名表示的文件是否是一个目录。
boolean a = file.isDirectory()
测试此抽象路径名表示的文件是否是一个标准文件
boolean a = file.isFile()
测试此抽象路径名表示的文件或目录是否存在。
boolean a = file.exists()
创建一个文件
file.exists 返回true,就表示存在,就不能创建新的
如果文件不存在,则创建该文件
如果文件存在,则不创建,也不会报错
boolean newFile = file.createNewFile();
创建一个目录
boolean mkdir = file.mkdir();
创建一个目录,并且将不存在的父目录一起创建
boolean mkdirs =file.mkdirs();
删除此抽象路径名表示的文件或目录。
boolean delete = file.delete();
返回上一级目录
File file = new File(".");
列出这个目录中的所有文件和目录 -> File对象
File[] files = file.listFiles();
列出file目录下,所有的文件和目录的名字 -> String对象
String[] list = file.list();
重写筛选方式
file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return XXX
}
});
例:
这里用lanbda表达式
只想保留文件,不想保留目录
File[] files = file.listFiles(p -> {
return p.isFile();
});
只保留.txt结尾的文件
File[] files1 = file.listFiles(p -> {
return p.getName().endsWith(".txt");
});
IO:Input/Output
1.以单位来分: 字节流 字符流
2.以层级来分: 底层流 包装流
字节流: InputStream/OutputStream
子类: FileInputStream/FileOutputStream
字符流: Reader/Writer
文件复制:
BufferedInputStream/BufferedOutputStream
文件内容读写:
BufferedReader/PrintWriter
FileReader/FileWriter
对象读写:
ObjectInputStream/ObjectOutputStream
注意:
1.IO所有跟文件相关的流中, 构造方法中需要File作为参数的都可以使用文件路径直接取代
2.字节流写和读都是以字节为单位的, 单个字节能不能正常显示出来, 是不确定的
Input:读取
Output:写入
字节流API
Input
创建方法
InputStream is = new FileInputStream(new File("a.txt"));
InputStream is1 = new FileInputStream("a.txt");
读一个字节
is.read();
循环遍历的例子:
int i ;
while ((i = is.read())!=-1){
System.out.println(i);
}
读一个字符数组
int length = is.read(byte[]);
内容保存在byte[]中,返回读取的长度length
指定开始位置和长度
i
is.read(bytes,int 起始下标, int 长度);
注: 以上三个方法, 返回 -1 都标记着读到文件末尾
Output
OutputStream os = new FileOutputStream(new File("a.txt"));
OutputStream os1 = new FileOutputStream("a.txt");
如果文件不存在,就创建新文件并写入
如果文件存在,会清空原来的内容,然后再写入
OutputStream os = new FileOutputStream("a.txt");
os.write(int);
想保留原来的内容,需要在后面加true
os.write(int,true);
如果文件不存在,就会输出FileNotFoundException
写入字符数组
os.write(byte[]);
指定开始位置和长度
os.write(bytes,int 起始下标, int 长度);
复制
public void copy01() throws IOException {
InputStream is = new FileInputStream("a.jpg");
OutputStream os = new FileOutputStream("a_1.jpg");
int len;
byte[] bs = new byte[1024];
while ((len=is.read(bs))!=-1){
os.write(bs,0,len);
}
}
缓冲 buffered
public void test02Copy() throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a_1.txt"));
int len;
byte[] bs = new byte[1024];
while ((len = bis.read(bs)) != -1) {
bos.write(bs,0,len);
}
//手动刷新缓冲区
//bos.flush();
bis.close();
bos.close();
;
}
字符流: Reader/Writer
构造方法
reader
InputStreamReader(InputStream in, String charsetName) - 指定字符集
InputStreamReader(InputStream in) - 默认字符集
int read() //读一个字符
int read(char[] cbuf) //将字符读入数组。
int read(char[] cbuf, int off, int len) //将字符读入数组的一部分。- 了解
注: 以上三个方法, 返回 -1 都标记着读到文件末尾
writer
OutputStreamWriter(OutputStream out, String charsetName)
OutputStreamWriter(OutputStream out)
void write(char[] cbuf) 写入一个字符数组。
void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
void write(int c) 写入单个字符
包装字符流 -> 缓冲字符流
通常用来读写文件内容
BufferedReader(Reader)
String readLine(): 读取一整行, 返回null 标记读到文件末尾
PrintWriter(Writer)
1.只能清空原文件内容, 但是可以指定字符集
PrintWriter(String fileName, String csn)
2.可以在原文件上追加内容, 但是不可以指定字符集, 可以自动刷新缓冲区
PrintWriter(OutputStream out, boolean autoFlush)
3.可以在原文件上追加内容, 可以指定字符集, 可以自动刷新缓冲区
PrintWriter(Writer out, boolean autoFlush)
void print(Object): 写出内容, 不加换行
void println(): 写出内容, 并且换行
注意: 自动刷新的功能, 只有println方法具有
print方法 必须手动刷新
对象输入输出流:Object
对象 -> 文件[字节] : 序列化
文件[字节] -> 对象 : 反序列化
ObjectInputStream(InputStream)
Object readObject()
ObjectOutputStream(OutputStream)
void writeObject(Object)
Serializable: 可序列化的
接口中没有常量, 也没有抽象方法, 空接口
序列化接口没有方法或字段,仅用于标识可串行化的语义。
serialVersionUID: 给类添加固定的序列版本号
transient: 修饰的变量, 在序列化的时候, 会被忽略掉
属性集: Properties, 仅支持String类型的属性映射
extends Hashtable implements Map
key - value
构造方法
Properties pro = new Properties();
推荐使用的方法
void setProperty(String key, String value)
String getProperty(String key)
加载属性集:
void load(Reader)
void load(InputStream)