Java验证文件名是否合法防止文件名带路径

在Java编程中,验证文件名的合法性是一个常见的需求。有时候,我们希望防止文件名带有路径,以确保文件被保存在指定的目录下。本文将介绍如何使用Java代码来验证文件名是否合法,并防止文件名带有路径。

文件名的合法性

在开始之前,我们需要了解文件名的合法性规则。以下是常见的文件名合法性规则:

  1. 文件名不能包含特殊字符,如斜杠(/)、反斜杠(\)、冒号(:)、星号(*)、问号(?)、双引号(")、尖括号(<、>)等。
  2. 文件名不能包含空格。
  3. 文件名长度不能超过系统限制的最大长度。

验证文件名是否合法

我们可以使用正则表达式来验证文件名是否合法。下面是一个示例代码,用于验证文件名是否合法:

import java.util.regex.Pattern;

public class FileNameValidator {
    private static final Pattern FILENAME_PATTERN = Pattern.compile("^[^\\\\/:*?\"<>|]+$");

    public static boolean isValid(String fileName) {
        return FILENAME_PATTERN.matcher(fileName).matches();
    }
}

在上述代码中,我们使用Pattern类和正则表达式来定义文件名的合法性规则。FILENAME_PATTERN是一个正则表达式,用于匹配不包含特殊字符的文件名。isValid方法接收一个文件名作为参数,并使用正则表达式来验证文件名是否合法。

我们可以使用以下代码来测试上述的isValid方法:

public class Main {
    public static void main(String[] args) {
        String fileName = "test.txt";
        boolean isValid = FileNameValidator.isValid(fileName);
        System.out.println(isValid); // 输出 true

        fileName = "test*.txt";
        isValid = FileNameValidator.isValid(fileName);
        System.out.println(isValid); // 输出 false
    }
}

运行以上代码,可以看到第一个文件名"test.txt"是合法的,输出结果为true。而第二个文件名"test*.txt"是不合法的,输出结果为false

防止文件名带有路径

如果我们希望防止文件名带有路径,可以在验证文件名的基础上,再增加一条规则,即文件名不能包含斜杠(/)和反斜杠(\)。下面是修改后的代码:

import java.util.regex.Pattern;

public class FileNameValidator {
    private static final Pattern FILENAME_PATTERN = Pattern.compile("^[^\\\\/:*?\"<>|]+$");

    public static boolean isValid(String fileName) {
        return FILENAME_PATTERN.matcher(fileName).matches() && !fileName.contains("/") && !fileName.contains("\\");
    }
}

在上述代码中,我们新增了两个条件判断语句,用于判断文件名中是否包含斜杠和反斜杠。如果文件名中包含斜杠或反斜杠,则返回false,表示文件名不合法。

我们同样可以使用以下代码来测试修改后的isValid方法:

public class Main {
    public static void main(String[] args) {
        String fileName = "test.txt";
        boolean isValid = FileNameValidator.isValid(fileName);
        System.out.println(isValid); // 输出 true

        fileName = "path/test.txt";
        isValid = FileNameValidator.isValid(fileName);
        System.out.println(isValid); // 输出 false
    }
}

运行以上代码,可以看到第一个文件名"test.txt"仍然是合法的,输出结果为true。而第二个文件名"path/test.txt"是不合法的,输出结果为false

流程图

下面是验证文件名是否合法的流程图:

flowchart TD
    start[开始]
    input[输入文件名]
    condition1[是否包含特殊字符]
    condition2[是否包含斜杠或反斜杠]
    condition3[是否包含空格]
    condition4[是否超过系统限制的最大长度]
    output[输出验证结果]
    start --> input
    input->condition1
    condition1(yes)->condition2
    condition1(no)->output
    condition2(yes)->output
    condition2(no)->condition3
    condition3(yes)->output
    condition3(no)->condition4
    condition4(yes)->output
    condition4(no