文件 *** 作和IO

文件 *** 作和IO,第1张

目录

一、存储

1.非易失性存储(non-volatile storage)

2.缓冲区(Buffer)技术

二、文件(File)

1.文件的分类

1.1普通文件和目录文件

1.2文本文件和二进制文件

2.文件是按照树形结构组织

3.文件路径

3.1绝对路径

3.2相对路径

4.一个唯一的路径并不代表对应的文件一定存在

三、Java中的File类-----java.io.File

1.构造方法

2.File的主要方法

3.新建一个普通文件

4.新建一个目录

5.删除文件/目录

6.通过重命名的方式把一个文件移动到另一个节点

7.给定起始目录,遍历这个目录下的所有文件


一、存储

硬盘存储和内存存储,硬盘存储也叫非易失性存储

1.非易失性存储(non-volatile storage)

可以再断电的情况下进行数据存储;低速存储,读写速度远低于内存

弥合速度差,针对硬盘数据的读写提出了各种各样的数据结构、算法来解决

硬盘中的数据更适合块状读取,一次性读取很多的数据,和连续读写

2.缓冲区(Buffer)技术
  • 由于磁盘存储的低速性,有了缓冲区技术,为了减少硬盘的读写频次
  • *** 作系统会在内存中开辟一段空间

比如写入400字节的内存

1、写入100字节

2、写入100字节

3、写入100字节

4、写入100字节

为了减少硬盘的读写,让达到一定条件后统一写回硬盘(应用程序主动要求冲刷缓冲区,定时冲刷、定量冲刷等)

IO中进行flush是必要的 *** 作,否则会造成数据丢失

二、文件(File)

一种抽象的概念,表示硬盘中的数据块;

狭义上讲文件是关于硬盘中数据的抽象;

变量、对象是对内存中数据的抽象;

逻辑上讲,一个文件是由两块数据组成的,文件的元数据(管理数据)和文件内容本身

文件中的数据= 管理数据+内存数据

文件系统(FileSystem):对硬盘上的数据、文件进行直接组织和管理的一个模块

1.文件的分类 1.1普通文件和目录文件

普通文件:存储普通数据,一般就是字符串

目录文件:存储了一张表,该表就是该目录文件下,所有文件名和inode的映射关系

1.2文本文件和二进制文件

普通文件,根据其保存数据的不同,划分为文本文件 和二进制文件

文本文件:保存被字符集编码的文本

二进制文件:按照标准格式保存的非被字符集编码过的文件

  • 【.txt】【 .c】【 .java】都属于文本文件
  • 【.doc】【.ppt】【.exe】【.zip】【.class】等等都属于二进制文件
2.文件是按照树形结构组织

通过路径描述结点的方式,来确定唯一一个文件

目录/文件夹也是一种特殊的文件,由管理数据和内容数据组成

管理数据:名称,属于本机用户,路径...

内容数据:文件夹下有.doc文件、.txt文件等 

3.文件路径

文件路径用于定位到哪个文件,路径存在,并不代表文件一定存在

以“.”或“. .”开头的,其中“.”表示当前路径,“. .”表示当前路径的父目录(上级路径)

文件路径分为绝对路径和相对路径

  • 绝对路径——无论现在在哪个位置,绝对路径都是从起点到目标
  • 相对路径——从我当前所处位置,到目标位置,当前的位置变化了,描述的节点也跟着变化
3.1绝对路径

从一颗数的根节点触发,到达对应节点的完整路径

 一个唯一的路径一定可以描述一个唯一的节点

Windows使用反斜杠作为分割符,对于路径【C:\Program Files\Java\a.txt】,如果要写到字符串中,需要先对反斜杠进行转义,程序中需要写【C:\Program Files\Java\a.txt】

3.2相对路径

相对于当前所处的位置而言的路径,不是从根节点的位置出发

4.一个唯一的路径并不代表对应的文件一定存在

 路径存在,并不代表文件一定存在

三、Java中的File类-----java.io.File

File对象就是对文件的管理数据的抽象

File对象创建出来并不能代表文件存在

1.构造方法

对于这个test.txt

import java.io.File;

/**
 * @author happy
 */
public class Main {
    public static void main(String[] args) {
        {
            File file = new File("D:\JAVA\java1\project\java-ee\test.txt");
            System.out.println(file);
            // 对象存在
            // 文件并不存在
        }

        {
            // 父结点,一般都是目录
            File parent = new File("D:\JAVA\java1\project\java-ee");
            File file = new File(parent, "test.txt");
            System.out.println(file);
        }

        {
            // 父结点,一般都是目录
            File file = new File("D:\JAVA\java1\project\java-ee", "test.txt");
            System.out.println(file);
        }
    }
}

输出结果:

 点击蓝色就可以看到test.txt文件里面的内容

2.File的主要方法

 

  • 示例1 
package thread_safe.day5_8;

import java.io.File;
import java.io.IOException;

/**
 * @author happy
 */
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("D:/JAVA/java1/project/java-ee/test.txt");
        // 返回此抽象路径名的绝对形式。
        System.out.println(file.getAbsolutePath());
        // 返回此抽象路径名的绝对路径名字符串
        System.out.println(file.getCanonicalPath());
        // 返回文件的长度
        System.out.println(file.length());
        // 返回文件的名称
        System.out.println(file.getName());
        // 返回父级的路径名字符串
        System.out.println(file.getParent());
    }
}

 

  •  实例2
import java.io.File;
import java.io.IOException;

/**
 * @author happy
 */
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("D:/JAVA/java1/project/java-ee/test.txt");
        // 返回相对路径
        System.out.println(file.getCanonicalPath());
        // 文件是否存在
        System.out.println(file.exists());

        // 返回该路径的文件是否是目录
        System.out.println(file.isDirectory());
        // 返回该路径的文件是否是普通文件
        System.out.println(file.isFile());

        System.out.println(file.canExecute());
        System.out.println(file.canRead());
        System.out.println(file.canWrite());
    }
}

3.新建一个普通文件

前提是路径对应的文件父目录存在,文件不存在

import java.io.File;
import java.io.IOException;

/**
 * @author happy
 */
public class Main5 {
    public static void main(String[] args) throws IOException {
        // 如果当前目录本身不存在,所以无法创建,以异常的形式体现
        File file = new File("D:/JAVA/java1/project/java-ee/hello.txt");
        // 刚开始没有该文件,返回false
        System.out.println(file.exists());
        file.createNewFile();
        // 创建完成之后返回true
        System.out.println(file.exists());
    }
}

4.新建一个目录

前提是路径对应的文件父目录存在,文件不存在,要想连同不存在的父目录一起创建,使用mkdirs()方法

import java.io.File;

/**
 * @author happy
 */
public class Main6 {
    public static void main(String[] args) {
          // 一级一级目录创建
//        File f1 = new File("../a");
//        f1.mkdir();
//        File f2 = new File("../a/b");
//        f2.mkdir();
//        File f3 = new File("../a/b/c");
//        f3.mkdir();
//        File file = new File("../a/b/c/d");
//        System.out.println(file.mkdir());

        File file = new File("../a/b/c/d");
        System.out.println(file.mkdirs());
    }
}
 5.删除文件/目录

只是标记要删除,真正删除的时候是在JVM进程退出的时候

Windows上的回收站只是一个特殊的目录,回收站的删除其实不是删除,只是把文件移动到对应的目录
普通文件正常删除;目录文件要求目录必须是空目录

import java.io.File;

/**
 * @author happy
 */
public class Main7 {
    public static void main(String[] args) {
        File file = new File("../hello.txt");
        System.out.println(file.delete());
    }
}
6.通过重命名的方式把一个文件移动到另一个节点

package thread_safe.day5_8;

import java.io.File;

/**
 * @author happy
 */
public class Main8 {
    public static void main(String[] args) {
        // 把a目录下的test.txt移动到b目录下
        File src = new File("../java-ee/a/test.txt");
        File dest = new File("../java-ee/b/test.txt");

        System.out.println(src.renameTo(dest));
    }
}

 7.给定起始目录,遍历这个目录下的所有文件

只有b目录下才有test.txt文件

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author happy
 */
public class FileDemo {
    static List all_file = new ArrayList<>();

    private static void traversal(File dir) throws IOException {
        File[] files = dir.listFiles(); // 该目录的所有孩子
        if (files == null) {
            return;
        }

        for (File file : files) {
            if (file.isDirectory()) {
                traversal(file);
            } else if (file.isFile()) {
                if (file.getName().endsWith(".txt")) {
//                if (file.getName().equals("test.class")) {
                    all_file.add(file.getCanonicalPath());
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        File startDir = new File("D:/JAVA/java1/project/java-ee");
        traversal(startDir);
        for (String path : all_file) {
            System.out.println(path);
        }
    }
}

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/877025.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存