0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java不同的算法

科技绿洲 来源:Java威廉希尔官方网站 指北 作者:Java威廉希尔官方网站 指北 2023-10-08 11:43 次阅读

在本文中,我们将讨论使用 Java 验证一个给定的字符串是否具有操作系统的有效文件名的不同方法。我们可以根据限制的字符或长度限制来检查该值。

我们将只关注核心解决方案,不使用任何外部依赖。我们将使用JDK的java.io和NIO2包来实现我们验证方法。。

使用java.io.File

让我们从第一个例子开始,使用 java.io.File 类。在这个解决方案中,我们需要用一个给定的字符串创建一个File实例,然后在本地磁盘上创建一个文件。

public static boolean validateStringFilenameUsingIO(String filename) throws IOException {
    File file = new File(filename);
    boolean created = false;
    try {
        created = file.createNewFile();
        return created;
    } finally {
        if (created) {
            file.delete();
        }
    }
}

当给定的文件名不正确时,它会抛出一个IOException。让我们注意,由于里面的文件创建,这个方法需要给定的文件名字符串没有对应存在的文件。

我们知道,不同的文件系统有自己的文件名限制。通过使用 java.io.File 方法,我们不需要指定每个操作系统的规则,因为Java自动为我们解决了这个问题。

然而,我们需要创建一个假文件。当我们成功后,我们必须记得在最后删除它。此外,我们必须确保我们有适当的权限来执行这些操作。任何失败也可能导致IOException,所以也最好检查一下错误信息

assertThatThrownBy(() - > validateStringFilenameUsingIO("javanorth?.txt"))
  .isInstanceOf(IOException.class)
  .hasMessageContaining("Invalid file path");

使用 NIO2 API

我们知道java.io包有很多缺点,因为它是在Java的第一个版本中创建的。NIO2 API是java.io包的后继者,它带来了许多改进,这也大大简化了我们之前的解决方案。

public static boolean validateStringFilenameUsingNIO2(String filename) {
    Paths.get(filename);
    return true;
}

我们的功能现在被精简了,所以它是进行这种测试的最快方式。我们不创建任何文件,所以我们不需要有任何磁盘权限,也不需要在测试后执行清理。

无效的文件名抛出 nvalidPathException,它扩展了RuntimeException。这个的错误信息也包含了比之前更多的细节。

assertThatThrownBy(() - > validateStringFilenameUsingNIO2(filename))
  .isInstanceOf(InvalidPathException.class)
  .hasMessageContaining("character not allowed");

但是这个解决方案有一个严重的缺点,与文件系统的限制有关。Path类可能表示带有子目录的文件路径。与第一个例子不同,这个方法没有检查文件名字符的溢出限制。让我们用Apache Commons的randomAlphabetic()方法生成的五百个字符的随机String来检查。

String filename = RandomStringUtils.randomAlphabetic(500);
assertThatThrownBy(() - > validateStringFilenameUsingIO(filename))
  .isInstanceOf(IOException.class)
  .hasMessageContaining("File name too long");

assertThat(validateStringFilenameUsingNIO2(filename)).isTrue();

为了解决这个问题,我们应该像以前一样,创建一个文件并检查结果。

自定义的实现

最后,让我们尝试实现我们自己的自定义函数来测试文件名。我们还将尝试避免任何I/O功能,只使用核心的Java方法。

这类解决方案提供了更多的控制权,允许我们实现我们自己的规则。然而,我们必须考虑不同系统的许多额外限制。

使用String.contains

我们可以使用String.contains()方法来检查给定的String是否包含任何禁止的字符。首先,我们需要手动指定一些示例值。

public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '`', '< ', ' >', '?', '|'};
public static final Character[] INVALID_UNIX_SPECIFIC_CHARS = {'�00'};

在我们的例子中,让我们只关注这两个操作系统,Windows的文件名比UNIX的限制更多。另外,一些的空白字符可能会有问题。

在定义了受限制的字符集之后,让我们来确定当前的操作系统。

public static Character[] getInvalidCharsByOS() {
    String os = System.getProperty("os.name").toLowerCase();
    if (os.contains("win")) {
        return INVALID_WINDOWS_SPECIFIC_CHARS;
    } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
        return INVALID_UNIX_SPECIFIC_CHARS;
    } else {
        return new Character[]{};
    }
}

而现在我们可以用它来测试给定的值。

public static boolean validateStringFilenameUsingContains(String filename) {
    if (filename == null || filename.isEmpty() || filename.length() > 255) {
        return false;
    }
    return Arrays.stream(getInvalidCharsByOS())
      .noneMatch(ch - > filename.contains(ch.toString()));
}

如果我们定义的任何字符不在给定的文件名中,这个Stream谓词返回真。此外,我们还实现了对null值和不正确长度的支持。

正则表达式模式匹配

我们也可以在给定的String上直接使用正则表达式。让我们来实现一个只接受字母数字和点字符的模式,其长度不超过255。

public static final String REGEX_PATTERN = "^[A-za-z0-9.]{1,255}$";

public static boolean validateStringFilenameUsingRegex(String filename) {
    if (filename == null) {
        return false;
    }
    return filename.matches(REGEX_PATTERN);
}

现在,我们可以根据先前准备的模式测试给定的值。我们还可以轻松地修改模式。在这个例子中,我们跳过了操作系统的检查功能。

总结

在这篇文章中,我们集中讨论了文件名及其限制。我们介绍了不同的算法,用Java检测无效的文件名。

我们从java.io包开始,它为我们解决了大部分的系统限制,但执行了额外的I/O动作,可能需要一些权限。然后我们检查了NIO2 API,它是最快的解决方案,但有文件名长度检查的限制。

最后,我们实现了我们自己的方法,不使用任何I/O API,但需要自定义实现文件系统规则。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6814

    浏览量

    123299
  • JAVA
    +关注

    关注

    19

    文章

    2967

    浏览量

    104721
  • API
    API
    +关注

    关注

    2

    文章

    1499

    浏览量

    61981
  • 文件
    +关注

    关注

    1

    文章

    565

    浏览量

    24734
收藏 人收藏

    评论

    相关推荐

    数据结构与算法分析(Java版)(pdf)

    数据结构与算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java数据结构和算法中文第
    发表于 12-20 21:22

    JAVA算法大全

    欢迎多来分享,一起学习交流
    发表于 05-28 12:40

    史上最全面Java面试汇总(面试题+答案)精选资料分享

    JAVA面试精选【Java基础第一部分】JAVA面试精选【Java基础第二部分】JAVA面试精选【Jav
    发表于 07-21 09:39

    Linux系统接口编程

    知识图谱大学课程数字逻辑计算机组成原理汇编语言编译原理操作系统计算机网络高级语言(C、C++、Java算法与数据结构数据库面向对象方法软件工程自学内容ARM 指令集、体系架构ARM 外设Linux 内核、驱动Linux 系统接口编程Linux 网络编程Qt ...
    发表于 11-04 08:02

    JAVA语言的工具类与算法

    JAVA语言的工具类与算法6.1 语言基础类库;            
    发表于 12-14 20:34 66次下载

    JAVA语言实现RSA公钥密码算法

    JAVA语言实现RSA公钥密码算法:本文阐述了公开密钥密码体制RSA算法的原理及实现威廉希尔官方网站 。并在此基础上,给出了JAVA语言实现的RSA算法
    发表于 02-10 10:27 58次下载

    中国农历算法java实现

    /**  * 中国农历算法 - 实用于公历 1901 年至 2100 年之间的 200 年  */import java.text.*;import java.util.*;class ChineseCalendarGB {  
    发表于 12-30 17:53 23次下载

    Java数组与算法试题

    Java数组与算法试题Java数组与算法试题Java数组与算法试题
    发表于 01-15 16:16 0次下载

    基于java的负载均衡算法解析及源码分享

    负载均衡的算法实际上就是解决跨系统调用的时候,在考虑后端机器承载情况的前提下,保证请求分配的平衡和合理。下面是基于java的负载均衡算法解析及源码,以供参考。
    发表于 01-01 19:29 2218次阅读

    40道经典JAVA算法题和解答

    本文档的主要内容详细介绍的是40道经典JAVA算法题和解答。
    发表于 07-02 08:00 0次下载
    40道经典<b class='flag-5'>JAVA</b><b class='flag-5'>算法</b>题和解答

    安装包是7.apk,要求获取flag

    通过分析java算法,判断输入是否正确。 如下是该APK算法部分的核心代码,密码主要是年月日+m数组某成员组成的字符串,经过如下a函数运算处理,如果最终运算结果等于34,则验证成功。 下面主要通过解读
    的头像 发表于 09-26 10:09 3186次阅读
    安装包是7.apk,要求获取flag

    数据结构与算法分析——Java语言描述

    数据结构与算法分析——Java语言描述说明。
    发表于 05-31 14:25 22次下载

    Java智能卡EEPROM碎片整理算法

    Java智能卡EEPROM碎片整理算法(c语言嵌入式开发需要学的东西)-Java智能卡EEPROM碎片整理算法
    发表于 07-30 11:34 9次下载
    <b class='flag-5'>Java</b>智能卡EEPROM碎片整理<b class='flag-5'>算法</b>

    嵌入式 Linux 应用程序开发概览

    这是我给公司研发部同事的一个分享培训课程,把内容大纲分享出来。知识图谱大学课程数字逻辑 计算机组成原理 汇编语言 编译原理 操作系统 计算机网络 高级语言(C、C++、Java算法与数据结构
    发表于 11-01 17:21 8次下载
    嵌入式 Linux 应用程序开发概览

    Java算法大全源码包开源源码

    Java算法大全源码包开源源码
    发表于 06-07 14:58 1次下载