一、File类
- java.io.File
可以用来处理文件目录问题。
方法 | 描述 |
---|---|
File(String pathname) | 通过将给定路径的字符串来创建一个表示对应文件的File实例 |
exists() | 判断此File的实例对应的文件是否存在 |
isFile() | 判断此File实例是否是一个标准文件 |
isDirectory() | 判断此File实例是否是一个文件夹 |
getName() | 获取此File实例对应的文件或文件夹的名称 |
getAbsolutePath() | 获取此File实例对应文件或文件夹的绝对路径 |
lastModified() | 返回此File实例的最后修改时间 |
length() | 返回此File实例的长度,单位字节 |
isHidden() | 是否隐藏 |
canRead() | 是否可读 |
canWrite() | 是否可写 |
createNewFile() | 创建一个文件/文件夹(返回是否创建成功) |
mkdir() | 创建目录 |
delete() | 立即删除文件(夹) |
deleteOnExit() | 在程序结束时候文件删除 |
listFiles() | 列出当前目录下所有文件对象 |
list() | 列出当前目录下所有文件名 |
二、输入/输出流
文件中的数据操作
文件中的数据操作:就是通过计算机的输入/输出设备完成。
在Java中将数据的输入/输出抽象为流(stream)
- 数据收集时:又来源地
- 数据使用时:有目的地
输入/输出流
应用程序中如何使用
注意:
1、在Java.io包中操作文件内容主要有两大类:字节流、字符流,两类都分为输入和输出操作。
2、流中保存的实际上全都是字节文件,字符流中多了对编码 的处理
Java中流的分类:
- 在Java中操作文件主要有两大类:字节流、字符流。两类都分为输入和输出操作。
- 在字节流中输入数据使用的是InputStream,输出数据主要是使用OutputStream(InputStream和OutputStream是为字节流设计的,主要用来处理字节或二进制对象)
- 在字符流中输入数据主要使用Reader完成,输出数据主要使用Writer完成 (Reader和Writer是为字符流(一个字符占2个字节)设计的,主要用来处理字符或字符串;对多国语言支持比较好,如果是音频、视频、图片等建议使用字节流)
- 注意:磁盘上保存的文件是二进制字节数据,字符流中多了对编码的处理
字节流的架构
InputStream & OutputStream
使用字节流读写文件
文件字节流
- FileInputStream
- FileOutputStream
InputStream inStream = new FileInputStream("file.txt");
int size = inStream.available();
System.out.println("可读取的字节数:" + size);
byte[] bytes = new byte[size];
size = inStream.read(bytes, 0, size);
String value = new String(bytes);
System.out.println("读取出的内容:" + value);
inStream.close();
OutputStream outStream = new FileOutputStream("file.txt", true);
String content = "待写入文件的内容";
outStream.write(content.getBytes());
outStream.flush();
outStream.close();
//使用带缓冲的装饰器类为文件流增加缓冲区
File file = new File(filepath);
FileInputStream fInStream = new FileInputStream(file);
BufferedInputStream bInStream = new BufferedInputStream(fInStream);
bInStream.close();
fInStream.close();
使用字符流读写文件
字符流架构
读取文件 :FileReader 、BufferedReader
FileReader reader = new FileReader("file.txt");
BufferedReaderbReader = new BufferedReader(reader);
while((line = bReader.readLine()) != null){
content.append(line);
content.append("\r\n");
}
System.out.println(content);
bReader.close();
reader.close();
写入文件: FileWriter 、BufferedWriter
FileWriter writer = new FileWriter("file.txt", true);
BufferedWriterbWriter = new BufferedWriter(writer);
writer.write(content.toString());
bWriter.flush();
bWriter.close();
writer.close();
Scanner和PrintWriter
- java.io.PrintWriter
- 写入的同时对写入的数据进行格式化
- 注意:类中的方法不会抛出 I/O 异常
try(PrintWriterout = new PrintWriter(new File("file.txt"))){
out.printf("%s:%s\r\n", "姓名", "小明");
out.printf("%s:%d\r\n", "年龄", 28);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try(Scanner input = new Scanner(new File("file.txt"))){
while(input.hasNext()){
System.out.println(input.next());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
注意:
- 一个 try-with-resources 语句可以像普通的 try 语句那样有 catch 和 finally 块
- 在try-with-resources 语句中, 任意的 catch 或 者 finally 块都是在声明的资源被关闭以后才运行。
BufferedReader&BufferedWriter
try(BufferedReader reader = new BufferedReader(new InputStreamReader(newURL(strUrl).openStream()))){
String line = null;
while((line = reader.readLine()) != null){
content.append(line);
content.append(System.getProperty("line.separator"));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try (BufferedWriterwriter = new BufferedWriter(new FileWriter(file))) {
writer.write(content);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
对象I/O(序列化和反序列化)
对象的输入和输出
- ObjectInputStream&ObjectOutputStream可以读/写可序列化的对象
- 序列化的作用就是把对象以二进制写入到文件(Save)
- 反序列化的作用是把二进制文件转化为对象(Load)
什么情况下需要序列化
- 当想把的内存中的对象状态保存到一个文件中或者数据库中时候
- 当想用套接字在网络上传送对象的时候
- 当想通过RMI(远程方法调用)传输对象时
注意:
- 序列化时,只对对象的状态进行保存,而不管对象的方法
- 当一个父类实现序列化,子类自动实现序列化,不需要显 式实现Serializable接口
- 当一个对象的实例变量引用其他对象,序列化该对象时也 把引用对象进行序列化
随机访问文件
java.io.RandomAccessFile
- 使用顺序流打开的文件称为顺序访问文件,顺序访问文件的内容不能更新
- RandomAccessFile允许在文件的任意位置上进行读写(随机访问文件)