1.File类
File 类 就是当前系统中 文件或者文件夹的抽象表示
通俗的讲 就是 使用File对象 才操作我们电脑系统中的文件或者文件夹
学习File类 其实就是学习 如果通过file对象 对系统中的文件/文件夹进行增删改查
1.1File对象的创建
(1)在电脑的非系统盘 创建一个 AAA文件夹 今天所有的操作都在这个文件夹中
(2)public static void main(String[] args) {
//创建一个File对象 并指定文件得路径
File file01 = new File("D:/AAA/aaa.txt");
//目录层级 在window系统下层级分割符为\ 但是在linux和mac系统上分割符为 /
我们得java代码是一种跨平台得语言。 我们得开发在window 但是我们项目得部署在linux.
我们使我们得代码能在任意系统下来用。 我们有两种解决办法
第一种 因为window 兼容 / 和 \
File file02 = new File("D:/AAA/bbb.txt");
// 第二种 File.separator根据当前代码所在得系统自动获取相应得分割符
System.out.println(File.separator); // \因为我们当前在window下
File file03 = new File("D:"+File.separator+"AAA"+File.separator+"ccc.txt");
}
1.2增
public static void main(String[] args) throws IOException {
File file =new File("D:/AAA/aaa");
//创建一个单级目录
file.mkdir();
File file1 = new File("D:/AAA/bbb/b1");
//创建一个多级目录
file1.mkdirs();
File file2 = new File("D:/AAA/a1");
//创建一个文件
file2.createNewFile();
1.3删
//当程序退出后删除
File file5 = new File("D:/AAA/aaa");
file5.deleteOnExit();
//删除空目录
//File file3 = new File("D:/AAA/aaa");
//file3.delete();
//删除文件
//File file4 = new File("D:/AAA/a1");
// file4.delete();
1.4改
//修改
File file3 = new File("D:/AAA/a1");
//设置该文件不能写
file3.setWritable(false);
//设置只能读
file3.setReadOnly();
//重命名
File file4 = new File("D:/AAA/a1");
file4.renameTo(new File("D:/AAA/a2"));
1.5查询
public static void main(String[] args) {
File file = new File("D:/AAA/bbb/b1");
//获取文件名称
String s = file.getName();
System.out.println(s);
//获取父级文件名称
String s1 = file.getParent();
System.out.println(s1);
//获取完整路径
String s2 = file.getPath();
System.out.println(s2);
//判断是否为文件类型
boolean b = file.isFile();
System.out.println(b);
//判断是否为目录类型
boolean b1 = file.isDirectory();
System.out.println(b1);
//列出AAA下的所有文件目录
File f = new File("D:/AAA");
String[] list= f.list();
System.out.println(Arrays.toString(list));
//列出AAA下的所有文件目录对象
File[] fl= f.listFiles();
for (File file1:fl){
System.out.println(file1.toString());
}
经典题目: 显示指定目录下的所有文件。D:/AAA下所有的文件,用的方法的递归调用。
public class Test5 {
public static void main(String[] args) {
showAllFiles("D:/AAA");
}
public static void showAllFiles(String s){
File file = new File(s);
//判断文件是否存在 或者文件是否为目录.
if (!file.exists()||!file.isDirectory()){
return;
}
//列出所有文件对象
File[] files= file.listFiles();
for (File file1:files){
if (file1.isDirectory()){
System.out.println(file1.getPath()+"目录");
showAllFiles(file1.getPath());//继续调用本方法
}else {
System.out.println(file1.getPath());
}
}
}
}
2.IO流
1. IO 表示有两个单词的缩写。
I: Input 输入 O: Output 输出
2. IO的作用:就是对文件中的内容进行操作。
输入: 读操作(读取文件的内容) 输出: 写操作(往文件中写内容)
3. IO流的分类:
(1)根据流的方向:
---输入流: 程序可以从中读取数据的流。
---输出流: 程序能向其中写入数据的流。
(2)根据流的单位:
---字节流: 以字节为单位传输数据的流
---字符流: 以字符为单位传输数据的流
(3)根据功能
---节点流: 直接和文件进行交互
---处理流: 不是直接作用在文件上。
四个基本的流: 其他的流都是在这四个流的基础上进行扩展的
字节输入流
字节输出流
字符输入流
字符输出流
2.1字符输出流Writer
public static void main(String[] args) throws Exception {
//writer字符输出流
//true 表示可以追加内容
Writer writer = new FileWriter("D:/AAA/c1.txt",true);
String s = "不可以偷懒";
writer.write(s);
//刷新流
writer.flush();
//关闭流资源
writer.close();
}
2.2字符输入流Reader
public static void main(String[] args) throws Exception {
//字符输入流
Reader reader =new FileReader("D:/AAA/c1.txt");
//表示读取字符的个数
int count=0;
//创建一个char数组,每次读取到元素存入该数组中
char[] chars = new char[2];
while((count=reader.read(chars))!=-1){
String s = new String(chars,0,count);
System.out.println(s);
}
}
2.3字节输出流OutputStream
以字节为单位。 它是所有字节输出流的父类,子类有FileOutputStream
@Test
public void TestOutPutStream() throws Exception {
//字节输出流
OutputStream o = new FileOutputStream("D:/AAA/c3.txt");
String s = "abcdefg";
//把字符串转换为字节数组.
byte[] bytes =s.getBytes();
o.write(bytes);
o.flush();
o.close();
}
2.4字节输入流InputStream
以字节为单位。 它是所有字节输入流的父类,子类有FileInputStream
@Test
public void TestInPutStream() throws Exception {
//字节输入流
InputStream is = new FileInputStream("D:/AAA/c3.txt");
int count=0;
byte[] bytes = new byte[2];
while ((count=is.read(bytes))!=-1){
String s = new String(bytes,0,count);
System.out.println(s);
}
is.close();
2.5用字节流和字符流分别完成文件复制
字符流只能复制文本文件。
字节流可以完成文本文件,也可以完成任意类型的文件复制。
@Test//用字符实现文件内容的复制
public void Test1() throws Exception {
//创建一个字符输入流
FileReader f = new FileReader("D:/AAA/c1.txt");
//创建一个字符输出流
FileWriter w = new FileWriter("C:/AAA/c11.txt");
int count=0;
char[] chars = new char[3];
while ((count=f.read(chars))!=-1){
w.write(chars,0,count);
w.flush();
}
f.close();
w.close();
}
@Test//用字节实现文件内容的复制
public void Test2() throws Exception {
//创建一个字节输入流
InputStream is = new FileInputStream("D:/AAA/aaa/1.webp");
//创建一个字节输出流
OutputStream os = new FileOutputStream("C:/AAA/2.webp");
int count=0;
byte[] bytes =new byte[2];
while ((count=is.read(bytes))!=-1){
os.write(bytes,0,count);
os.flush();
}
is.close();
os.close();
}
2.6缓存流
缓存流是在基础流[InputStream(字节输入流), OutputStream(字节输出流), Reader(字符输入流) Writer(字符输出流)]之上 添加了一个缓存池功能.
BufferInutStream BufferOutputStream BufferReader BufferWriter 提高IO的效率,降低IO的次数。
@Test//缓存流
public void TestBuffer() throws Exception {
OutputStream os = new FileOutputStream("D:/AAA/c3.txt");
BufferedOutputStream bf = new BufferedOutputStream(os);
String s = "你好,我要回家了";
byte [] bytes =s.getBytes();
// 暂时放入缓存池中,没有直接放入文件中,所以文件中没有你的内容。
bf.write(bytes);
//bf.flush();//刷新缓存池 把池子中的内容输入到文件上
bf.close();//关闭流资源 先刷新缓冲池 再关闭流资源
}
2.7对象流
序列化: 把内存中的java对象存储到磁盘[网盘]的过程。
反序列化: 把磁盘中的内容读取到java对象内存中的过程。
java对象所属的类必须实现序列化接口.implements Serializable
@Test
public void TestObjectOutputStream()throws Exception{
//序列化
//对象数输出流
OutputStream os = new FileOutputStream("D:/AAA/c3.txt");
ObjectOutputStream os2 = new ObjectOutputStream(os);
//使用对象输出流调用输出方法 输出的类对象 该类必须实现Serializable 序列化接口
Student s = new Student("小明",20,"男");
os2.writeObject(s);
os2.close();
}
@Test
public void TestObjectInputStream() throws Exception {
//反序列化
//对象输入流
InputStream is = new FileInputStream("D:/AAA/c3.txt");
ObjectInputStream oi = new ObjectInputStream(is);
Object o=oi.readObject();
System.out.println(o);
oi.close();
}