Java基础学习 day_14 File类

 ̄綄美尐妖づ 提交于 2020-08-10 16:39:15

File类

在这里插入图片描述

//构造方法
File file=new File("");
File file=new File("","")

创建文件

 //创建文件
        File file=new File("d:\\Test01\\aaa.txt");
        File file1=new File("D:\\Test01","qq.txt");
        if(!file1.exists()){
            boolean b=file1.createNewFile();
            System.out.println("创建结果:"+b);
        }else{
            System.out.println("文件已经创建");
        }
        //删除文件
        //直接删除
        boolean delete = file.delete();
        System.out.println("删除结果:"+delete);
        //JVM删除
//       Thread.sleep(5000); 
        file.deleteOnExit();
        //获取信息
        System.out.println("文件长度:"+file.length());
        System.out.println("文件名称:"+file.getName());
        System.out.println("字符串绝对路径:"+file.getAbsolutePath());
        System.out.println("相对路径:"+file.getPath());
        System.out.println("父目录:"+file.getParent());
        System.out.println("规范名称:"+file.getCanonicalPath());
        System.out.println("文件格式绝对路径:"+file.getAbsoluteFile().toString());
        System.out.println(new Date(file.lastModified()).toLocaleString());
        //判断
        System.out.println("是否存在"+file.exists());
        System.out.println("是否只读:"+file.canRead());
        System.out.println("是否隐藏:"+file.isHidden());
        System.out.println("是否是文件:"+file.isFile());
        System.out.println("是否是绝对路径:"+file.isAbsolute());

        //修改名称(具有剪切的功能)
        file.renameTo(new File("D:\\Test01\\haha.txt"));

Filefilter接口

当调用File类中的listFiles()方法时,对获取文件进行过滤,只要满足条件的文件的才可以出现在listFiles()的返回值中。

过滤文件
创建目录

  //创建文件夹
        File dir=new File("d:\\aaa\\bbb\\ccc");
        if(!dir.exists()){
            //dir.mkdir() 创建单级目录
            boolean b=dir.mkdirs();//创建多级目录
            System.out.println("创建结果:"+b);
        }else{
            System.out.println("目录已存在");
        }
        //删除
        //直接删除 只能删除最里层的空目录
//        boolean b= dir.delete();
//        System.out.println("删除结果:"+b);
        //JVM删除
//        Thread.sleep(5000);
//        dir.deleteOnExit();
        //获取信息
        System.out.println("获取绝对路径:"+dir.getAbsolutePath());
        System.out.println("获取路径:"+dir.getPath());
        System.out.println("获得父目录:"+dir.getParent());
        System.out.println("获得名称:"+dir.getName());
        System.out.println("规范名称:"+dir.getCanonicalPath());
        System.out.println("长度;"+dir.length());
        //判断
        System.out.println("是否存在:"+dir.exists());
        System.out.println("是否隐藏:"+dir.isHidden());
        System.out.println("是不是文件夹:"+dir.isDirectory());
        System.out.println("是不是绝对路径:"+dir.isAbsolute());
        //重命名 只能修改最后一个目录的名字
        System.out.println("是否修改成功:"+dir.renameTo(new File("d:\\aaa\\bbb\\hello")));
        //获取目录的子目录和文件
        File dir1=new File("D:\\aaa");
        System.out.println("-----------------aaa---------------");
        String[] list = dir1.list();
        for (String s : list) {
            System.out.println(s);
        }
        System.out.println("-----------aaaFile形式------------");
        File[] files = dir1.listFiles();
        for (File file : files) {
            System.out.println(file.toString());
        }
        //获取目录下的.txt
        System.out.println("-------------FilenameFilter--------------");
        String[] list1 = dir1.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                if (name.endsWith(".txt")) {
                    return true;
                }
                return false;
            }
        });
        for (String s : list1) {
            System.out.println(s);
        }
        //方法二
        System.out.println("------------特定文件---------------");
        File[] files1=dir1.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if(pathname.getName().endsWith(".txt")){
                    return true;
                }
                return false;
            }
        });
        for (File file : files1) {
            System.out.println(file.getName());
        }
        //获取根目录
        System.out.println("---------获取根目录--------------");
        File[] files2=File.listRoots();
        for (File file : files2) {
            System.out.println(file);
        }

输入流(读取):由存储设备流向内存,如果没有文件,会报错
输出流(写入):由内存流向存储设备,如果没有文件,会自动创建文件。

字节流

InputStream(抽象类):
read():返回值为int
read(byte[] b);返回值为int
read(byge[]b,int off,int len);返回值为int
close();关闭流
outputStream(抽象类):
write(int b);
write(byte[] b);
write(byte[]b ,int off,int len)







文件输入输出字节流

构造方法:
FileInputStream(实现类):
FileOutputStream(实现类):
在这里插入图片描述
true,表示追加。默认为false,也就是覆盖。



字节缓冲流

缓冲区大小默认为8k。
BufferedOutputStream:
在这里插入图片描述
并没有写入硬盘,写入了缓冲区。如果想及时写入硬盘,对象.flush();
当调用对象.close(),会自动调用flush(),执行写入硬盘操作。



BufferedInputStream:
参数要是个字节流,本身没有读入读出功能。
在这里插入图片描述关闭缓冲流,会自动关闭真正具有读写功能的流。

try(类 对象=对象或则new 类){
}
他会调用对象的close()方法,但是这个类要实现Closeable接口的close()方法。如果想释放多个资源的话,中间可以加分号


close()关闭是按倒序关闭的。
比如:try(Student student=new Student;Person person=new Person()){
}


对象流

不具有真正的写入和读出功能,需要借助文件字节流等来实现。
ObjectOutputStream:
ObjectInputStream:
在这里插入图片描述


1.序列化的类必须实现Serializable(自动序列化,标记接口)或则Externalizable(手动序列化,要重写他的方法)
2.序列化的类要添加一个私有的long类型的静态常量:serialVersionUID,保证序列化的类和反序列化的类是一致的。

3.使用transient修饰的属性,不可序列化。
4.静态属性不可序列化。
5。但是使用Externalizable接口,可以把transient修饰的属性序列化。
6。读取到文件的末尾,在读取,会出现java.io.EOFException异常。



实现serializable接口

public static void serializable() throws Exception{
    Person person=new Person("轩轩",12);
    Person person1=new Person("轩二",21);
    ObjectOutputStream obj=new ObjectOutputStream(new FileOutputStream("D:\\person.txt"));
    ArrayList<Person> array=new ArrayList<>();
    array.add(person);
    array.add(person1);
    obj.writeObject(array);
    System.out.println("序列化成功");
    obj.close();
}
public static void fanSerializable() throws Exception{
    ObjectInputStream obj=new ObjectInputStream(new FileInputStream("D:\\person.txt"));
    ArrayList<Person> array=(ArrayList<Person>)obj.readObject();
    for (Person person : array) {
        System.out.println(person.toString());
    }
    array.close();
}

Externalizable接口:

public class Person implements Externalizable {
    private String name;
    private int age;
    private transient String color;

    public Person(String name, int age,String color) {
        this.name = name;
        this.age = age;
        this.color=color;
    }

    public Person() {
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", color='" + color + '\'' +
                '}';
    }
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {//重写
        out.writeObject(name);
        out.writeObject(age);
    }
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        name=(String)in.readObject();
        age=(int)in.readObject();
    }
}

Java中的对象的创建四种方式

1.new 方法,调用构造方法
2.反射,调用构造方法
3.反序列化,不会调用构造方法(Serializable),(Externalizable会调构造方法)
4.克隆, 实现Cloneable接口(标记接口),调用构造方法。如果一个类中还有个类对象,浅克隆只是把地址克隆了下来,深克隆则创建了个新的对象。
5.clone():创建并返回此对象的副本, 如果一个类仅包含原始字段或对不可变对象的引用,则通常情况下,super.clone返回的对象中的字段通常不需要修改。如果要进行深拷贝,就需要重新写clone()方法中的代码。



字符编码

在这里插入图片描述

UTF-8:有可能是一个字节,两个或则三个,中文是三个字节
ISO-8859-1:一个字节。0-255

字符流(抽象类)本质上是没有字符流的,他的源码是用的字节流,采用了特定的编码方式转换

抽象类:
Reader:
close()
read()
read(char[])
read(char[],int off,int len)
Writer:
flush()
write(int c)
write(char[])
write(char[],int off,int len)
write(String)
write(String,int off,int len)
#


# 文件字符流(实现类)
有缓冲区,flush()可以使用。关闭的时候会自动调用flush()方法。
FileReader
FileWriter












字符缓冲流(需要借助字符流)

BufferedReader:
除了普通的字符流方法外,还增加了:
对象.readLine():读取一个文本行。返回值为String
BufferedWriter:
对象.newLine();换行(可以实现跨平台)
对象.flush();刷新




转换流

可将字节流转换为字符流
可设置字符的编码方式
InputStreamReader:将硬盘的字节转换成字符**(参数是字节流)(字节流,编码方式)**
OutputStreamWriter:将内存的字符转换成字节**(参数是字节流)(字节流,编码方式)**


打印流(原样打印,看到的是什么,打印出来的就是什么)

print();
println();
flush();
构造方法,可以直接写文件,也可以使用字节流。
PrintStream:字节打印流
PrintWriter:字符打印流
在这里插入图片描述





重定向标准输出流

system.out.println():默认输出到控制台
修改输出位置
system.out中的out是个打印字节流
system.in中的in是个字节输入流
system.setOut(new PrintStream(" "))



在这里插入图片描述

RandomAccessFile(随机流 对字节进行操作)

在这里插入图片描述
在这里插入图片描述对应的读也是一样。
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。
length():返回lang型
seek(long a):文件指针的偏移量,以开头的位置,也就是0的位置。
skipBytes(int a):跳过字节个数,从当前位置跳。
在这里插入图片描述





Properties属性集合

list(打印流):遍历输出
对象.list(new PrintSteam());
对象.list(new PrintWriter());

store(字符流或者字节流输出流):保存到文件
load(字符输入流或者字节输入流):加载文件

除了文件字节输出流之外的其他输出流都有缓冲区。都可以用对象.flush();

切记,除了文件字节输出流之外的其他输出流,需要flush(),所有的流必须加上close()。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!