文件操作和io

文件的概念

文件分为狭义的文件和广义的文件,这里讨论的是狭义的文件。文件是针对硬盘抽象出来的概念,当我们想要将数据保存再硬盘上时,是以文件的形式来保存的,并且是以文件为单位来保存的。文件包含的信息有文件名,文件类型,文件大小等,我们把这些信息视为文件的原信息。

由于文件的繁复,为了对文件进行高效的管理,诞生了对文件按照层级结构组织管理的方式,这种方式就是树型结构组织,就像数据结构里的树型结构。于是就有了用于存放管理信息的文件,例如我们计算机上的文件夹和目录。

绝对路径和相对路径

绝对路径,如何在文件系统中定位到唯一的文件,根据管理文件的树型结构来看,要想定位到指定文件就要从根节点开始一步一步到达指定节点,把这个过程对应到文件的路径中就是绝对路径。

 红色方框里的就是绝对路径。

相对路径,相对路径的起点不是根节点,而是以某个节点为参考,从参考节点出发到终点的叫做相对路径,就是以当前目录为参考的一条路径。假设当前目录为D:\temp,要想定位到image这个目录,就可以表示成 ./image,./就表示当前目录。

如果工作目录是D:\temp\movie,要想定位到image目录,相对路径为 ../image,../表示上级目录;

如果当前目录是D:\temp\movie\family,要想定位到image目录,相对路径为 ../../image。

Java中对文件的操作

1、针对文件系统操作(文件的创建,删除,重命名...);

2、针对文件内容的操作(读和写)。

Java中提供了File类。

在构造File对象时,要指定一个路径,此时File对象就是指定路径所对应的文件。

File类中提供了许多方法来操作文件,我们借助代码来讲解:

1、创建File对象

public static void main(String[] args) throws IOException {
        File file = new File("d:/text.txt");
        //返回file对象的文件名称
        System.out.println(file.getName());
        //返回file对象的父目录文件路径
        System.out.println(file.getParent());
        //返回file对象的文件路径
        System.out.println(file.getPath());
        //返回file对象的绝对路径
        System.out.println(file.getAbsoluteFile());
        //返回file对象规范的绝对路径
        System.out.println(file.getCanonicalFile());
    }

创建一个File对象,此时的File对象就是d:/test.txt路径对应的文件test.txt(此时不要求d:/下真的有这个对象,这里只是创建了一个对象,而不是创建了一个文件)。看看执行结果:

 

注意:“/” 和 “\”的效果是一样的,windows上盘符大小写都可以。

我们将上述代码中构造对象的路径改为相对路径,其他不变:

 

看看执行结果:

两个结果对比,可以看到,getParent()是不会对路径中的“.”或“..”进行路转的,同理getAbsoluteFile()获取到的路径如果包含“.”或“..”是不进行路转的,而getCanonicalFile()是会对“.”或“..”进行路转的。

2、指定路径创建一个文件

public static void main(String[] args) throws IOException {
        File file = new File("./test.txt");
        //创建一个文件
        file.createNewFile();
        //判断文件是否真的存在
        System.out.println(file.exists());
        //判断File对象代表的是否为一个普通文件
        System.out.println(file.isFile());
        //判断file对象代表的文件是否是以个目录
        System.out.println(file.isDirectory());
    }

 可以看到左侧目录也多了text.txt这个文件,如果想删除文件,直接调用delete()就行。

 

数据流

“流”可以理解为川流不息的水流,Java中根据“流”的类型分为两大类,字节流和字符流。

字节流,对文件进行读写时,是以“字节”为单位进行读写操作。InputStream是字节输入流,它是所有字节输入流的父类,InputStream是抽象类,不能直接进行new操作,要使用就需要实现具体的类,这里使用FileInputStream。同样的我们借助代码来讲解InputStream的一些方法使用:

public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("d:/cat.jpg");
        //读取文件
        while(true){
            //read()返回类型是int,每次读取一个字节的数据,并返回读取到的字节,如果读取结束返回-1。
       //这种方式不能读取中文。
int b = inputStream.read(); if(b == -1){ break; } System.out.printf("%x\n", (byte)b); } //关闭字节流,使用InputStream最后一定要进行这个操作 inputStream.close(); }

OutputStream是字节输出流,它是Java中所有字节输出流的父类,与InputStream类似也是抽象类,要使用具体实现的类,这里使用FileOutputStream。

public static void main(String[] args) throws IOException {
        //使用write()来进行写操作
        try(OutputStream outputStream = new FileOutputStream("d:/test.txt")){
            outputStream.write(97);//a对应的ascii为97
            outputStream.write(98);//b
            outputStream.write(99);//c
            outputStream.write(100);//d

            //不要忘记这一步
            outputStream.flush();
        }
    }

 

数据流,Java中提供读的类是Reader,Reader也是抽象类,这里使用FileReader,提供写的操作是Writer,也是抽象类,这里使用FileWriter。

public static void main(String[] args) throws IOException {
     //进行读操作 Reader reader
= new FileReader("d:/test.txt"); while(true){ int ch = reader.read();//read()返回类型为int,当等于-1时,读取完毕 if(ch == -1){ break; } System.out.print("" + (char)ch); } }

 

写操作:

 public static void main(String[] args) throws IOException {
        Writer writer = new FileWriter("d:/test.txt");
        writer.write("hello world");
        //刷新缓冲区
        writer.flush();
    }

posted @ 2023-09-13 18:08  司丝思  阅读(1)  评论(0编辑  收藏  举报