Java API:4. File

0. 快递与路径的类比

理解文件的绝对路径和相对路径,最直观的方式是类比“快递如何寄送”的情境。想象一下:

  • 快递寄送地址(绝对路径):就像你填写的收货地址,无论你在全国哪个地方,这个地址指向的就是收件人所在的具体位置。这个地址不依赖你所在的位置,具有唯一性。
  • 从某个地点出发的路径(相对路径):如果你要从自己家出发去快递公司,你就需要告诉别人“从我的家出发,走到快递公司”,这条路径是相对于你家(当前工作目录)来说的,它依赖于你从哪里出发。
绝对路径 vs 相对路径
  1. 绝对路径

    • 是文件系统中指向目标文件或文件夹的完整路径,通常是从文件系统的根目录开始(在 Unix 系统中为 /,在 Windows 系统中为盘符,如 C:\)。
    • 无论你当前所在的位置在哪里,绝对路径都能指向同一个目标。

    示例

    • 在 Linux 系统中:/home/user/Documents/file.txt
    • 在 Windows 系统中:C:\Users\User\Documents\file.txt
  2. 相对路径

    • 是相对于当前工作目录(你现在所在的目录)的一条路径。你需要告诉操作系统,从当前目录到目标文件或文件夹的路径。
    • 相对路径通常不包含根目录,依赖于你当前所在的目录,因此可以根据不同的起点而变化。

    示例

    • 假设你现在在 /home/user/ 目录下,你想访问 /home/user/Documents/file.txt,那么相对路径就是:Documents/file.txt
    • 如果你在 Documents 文件夹下,那么相对路径就是:file.txt

绝对路径和相对路径的应用

1. 绝对路径:
  • 无论你当前在文件系统的哪个位置,绝对路径都是固定的,指向同一个文件或文件夹。
  • 示例:当你访问文件 /home/user/Documents/file.txt 时,系统会根据绝对路径直接定位文件,无需考虑当前目录。

优点:确定性强,能够精确定位目标。

缺点:不灵活,文件系统的层级变化会导致路径变化,且较长。

2. 相对路径:
  • 相对路径取决于你当前的工作目录,因此文件的位置和目标之间的相对关系会影响路径的表达。
  • 示例:如果你在 /home/user/ 目录下,你可以使用 Documents/file.txt 来访问该文件,而不需要写出完整的 /home/user/Documents/file.txt

优点:灵活,能够根据当前的目录结构变化而调整路径。

缺点:在不同的目录下,路径含义会发生变化,可能会导致错误。

总结

  • 绝对路径:从根目录开始,明确指向目标文件或文件夹,位置固定。
  • 相对路径:相对于当前目录的路径,依赖于当前工作目录,灵活但可能变化。

类比示例

  • 假设你当前在

    /home/user/
    

    目录下,你要访问

    /home/user/Documents/file.txt
    

    文件:

    • 绝对路径是 /home/user/Documents/file.txt
    • 相对路径是 Documents/file.txt(相对当前目录 /home/user/

理解了这两者的区别,就能更好地理解如何在编程中使用文件路径了。在操作文件时,你可以选择使用绝对路径(当路径固定时)或者相对路径(当路径根据当前目录变化时)。


3. File

File 类是 Java 中非常常用的类,用于对文件和目录(文件夹)进行操作。它不直接处理文件的内容,而是用于获取文件属性、路径信息、判断文件状态等操作。

File 类的常见用途:
  1. 创建文件对象
    • 使用 File 类创建文件对象时,通常需要传入文件的路径。
    • 注意:路径可以是绝对路径或相对路径。如果路径是相对的,它将基于当前工作目录。
  2. 获取文件或目录的属性
    • 你可以通过 File 类提供的各种方法来判断文件的属性,获取文件大小,修改时间等信息。
  3. 遍历目录中的文件
    • 你可以列出目录中的所有文件和子目录,通过 list() 方法得到所有文件或子文件夹的名称。
示例分析:
package com.nix.demo;

import org.junit.Test;

import java.io.File;

// 3. File类
/*
    使用File类new一个对象时一定要使用绝对路径,这个类中不仅包含了对文件的操作,还有对文件夹的操作
    文件流中最重要的是对文件路径的了解,调用文件流中的类
 */
public class DemoTest {
    @Test
    public void demo1() {
        // 这里必须是绝对路径
        File file1 = new File("C:\\Users\\86157\\Desktop\\Courses");
        
        // 获取父级路径
        System.out.println(file1.getParent());
        
        // 判断是否为文件
        System.out.println(file1.isFile());
        
        // 判断字节长度
        System.out.println(file1.length());
    }

    // 输出文件夹名字
    @Test
    public void demo2() {
        File file2 = new File("C:\\Users\\86157\\Desktop\\Courses");
        
        // file2.list() 方法用于获取 file2 这个文件夹中的所有文件和子文件夹的名称
        String[] courses = file2.list();
        
        // 遍历文件夹中的文件/子文件夹名称
        for (String name : courses) {
            System.out.println(name);
        }
    }
}
代码解读:
  • new File(String path)
    • File 对象通过文件路径创建。这里需要注意的是,可以使用绝对路径或者相对路径来创建文件对象,但通常建议使用绝对路径,这样路径更明确。
    • 例:new File("C:\\Users\\86157\\Desktop\\Courses")
  • getParent()
    • 获取当前 File 对象的父级目录路径。
  • isFile()
    • 检查该路径是否指向一个文件。如果路径是一个文件,则返回 true,否则返回 false
  • length()
    • 获取文件的大小(以字节为单位)。对于目录,这个方法返回 0。
  • list()
    • 返回当前目录下所有文件和子目录的名称,以字符串数组的形式返回。如果文件对象不是一个目录,该方法将返回 null
使用 File 类注意事项:
  1. 路径问题
    • 路径可以是相对路径或者绝对路径。为了确保准确性,通常推荐使用绝对路径。
    • 在 Windows 系统中,路径分隔符是反斜杠 (\),而在 Unix 系统中是斜杠 (/)。可以使用 File.separator 来适配不同的操作系统。
  2. 目录与文件判断
    • isFile() 可以判断对象是否为文件,而 isDirectory() 用来判断对象是否为目录。
  3. 文件和目录的操作
    • File 类可以用来创建、删除文件或目录,但不能直接读取或写入文件内容。要读取或写入文件,你需要使用 FileInputStreamFileOutputStreamBufferedReader 等类。
示例输出:
  1. demo1 输出

    C:\Users\86157\Desktop
    false
    0
    
  2. demo2 输出: 如果 Courses 文件夹下有一些文件或子目录,输出会显示它们的名称,例如:

    file1.txt
    file2.txt
    subfolder
    

总结

  • File 类提供了访问文件和目录的基础方法,但它并不直接处理文件内容的读取和写入。
  • 你可以使用 File 类来检查文件是否存在、获取文件的大小、列出目录内容等。
  • 需要注意的是,File 类在操作文件路径时要特别小心路径的正确性。

4. Linux与Windows上的路径差异

在操作系统之间,文件路径的表示方式存在一些关键的差异。理解这些差异对于在跨平台环境中编写代码非常重要。

  1. Linux/Unix系统的路径表示方式:

    • 在Linux/Unix系统中,路径是由单斜杠 (/) 来分隔的,不需要转义字符。
    • 绝对路径是从根目录 (/) 开始的。

    示例:

    • 文件夹路径:/home/user/Documents
    • 文件路径:/home/user/Documents/file.txt

    在这个例子中,路径从根目录 (/) 开始,然后逐级进入 home 目录,再进入 user 目录,最后到达 Documents 目录。

  2. Windows系统的路径表示方式:

    • 在Windows系统中,路径是由反斜杠 (\) 来分隔的。
    • 注意: 在字符串中,反斜杠 (\) 是一个转义字符,所以在Windows路径中需要使用双反斜杠 (\\) 来避免转义字符的干扰(例如:\n\t等)。

    示例:

    • 文件夹路径:C:\Users\user\Documents
    • 文件路径:C:\Users\user\Documents\file.txt

    在Windows中,路径是由驱动器字母(如 C:)开始,然后使用反斜杠 (\) 作为目录分隔符。

路径转义与兼容性

  • 转义字符: 在Java中,反斜杠 (\) 是一个转义字符,意味着它有特殊的含义,例如:

    • \n:表示换行。
    • \t:表示制表符。

    因此,在Windows的路径表示中,如果直接使用 \,可能会被解释为转义字符,导致路径错误。为避免这种情况,应该使用 \\ 来表示反斜杠。

  • Linux与Windows路径的差异:

    • Linux/Unix路径:使用 / 作为路径分隔符,不需要转义。
    • Windows路径:使用 \\ 作为路径分隔符,并且需要双反斜杠(\\)在代码中表示。

总结:

  • Linux/Unix:路径以 / 开始,使用 / 作为路径分隔符。
  • Windows:路径以驱动器字母(如 C:)开始,使用 \\ 作为路径分隔符,并且需要特别注意转义字符的问题。
  • 跨平台代码:为了编写能够在不同操作系统上运行的代码,建议使用 File.separator 来处理路径分隔符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值