【问题标题】:Create a function for File.separator using Pattern Matcher使用模式匹配器为 File.separator 创建一个函数
【发布时间】:2018-10-27 02:15:39
【问题描述】:

在我的 java 项目上运行时,静态分析工具会出现“文件分隔符中的可移植性缺陷”错误,我需要修复它。在我的代码中,我有 fileUnsafe。我想使用一种方法将其转换为 fileSafe(如下所述)。

// Case 1
//no platform independence, good for Unix systems
File fileUnsafe = new File("tmp/abc.txt");

//platform independent and safe to use across Unix and Windows
File fileSafe = new File("tmp"+File.separator+"abc.txt");

类似的路径 -

// Case 2
//no platform independence, good for Unix systems
File fileUnsafe = new File("/tmp/abc.txt");

// platform independent and safe to use across Unix and Windows
File fileSafe = new File(File.separator+"tmp"+File.separator+"abc.txt");

我的项目中有多个这样的文件地址,我需要创建一些转换方法,该方法可以只将此路径作为字符串接收,将 File.separator 附加到它,然后返回它。像这样 -

File fileSafe = new File(someConversionMethod("/tmp/abc.txt"));

我尝试了这种方法,但它在案例 2 上给了我 NullPointerException。

public static String someConversionMethod(String target) {
        Pattern ptr = Pattern.compile("[\\\\\\\\|/]+");
        Matcher mtr = ptr.matcher(target);
        return mtr.replaceAll(File.separator + "" + File.separator);
    }

任何解决此方法或建议处理这种情况的优雅方法的帮助将不胜感激。

nit - 我提到了Replacing character with File.separator using java.regex Pattern Matcher,但它并没有真正帮助我的情况。

【问题讨论】:

  • 我不确定我们是否需要这个方法,因为如果你只是在任何地方使用 /,Java 将在所有平台上正确运行。不需要在 Java 文件名中使用反斜杠。如果是这样,那我们为什么还需要 File.分隔符了吗?
  • 您用于 Java 编程的 IDE 是哪个?它是否支持正则表达式查找和替换?
  • 我正在使用 Eclipse。它支持正则表达式查找和替换。
  • 忽略警告。这是不对的。 / 是 Java 中独立于平台的路径分隔符。

标签: java regex file separator matcher


【解决方案1】:

我会尝试将文件分隔符处的字符串拆分为这样的数组。

String str = "/tmp/abc.txt";
String result = "";
String rgx = "\\\\|/";
String [] arrOfStr = str.split(rgx);;

然后您可以使用 for 循环重新添加您的 File.separator。像这样:

    for (int i = 1; i < arrOfStr.length ; i++)
        result += File.separator + arrOfStr[i];

我从第一个索引开始,因为第一个斜杠在结果字符串中加倍。

【讨论】:

    【解决方案2】:

    由于这是一次性更改,您可以在 Eclipse 中使用正则表达式查找和替换

    对于第一种情况: 使用正则表达式:^File\sfileUnsafe\s=\snew File\(\"(?&lt;folder1&gt;[^\/]+)\/(?&lt;fileName&gt;[^\.]+)(?&lt;extension&gt;\.\w{3})\"\);

    替换为:File fileSafe = new File("${folder1}"+File.separator+"${fileName}${extension}");

    Demo

    对于第二种情况: 使用正则表达式:^File\sfileUnsafe\s=\snew File\(\"\/(?&lt;folder1&gt;[^\/]+)\/(?&lt;fileName&gt;[^\.]+)(?&lt;extension&gt;\.\w{3})\"\);

    替换为:File fileSafe = new File(File.separator+"${folder1}"+File.separator+"${fileName}${extension}");

    Demo

    如果你有多个文件夹,你可以继续这个模式并修复它们。

    我承认,这不是一个干净直接的方法,但可以完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 2021-02-03
      • 2011-12-16
      • 1970-01-01
      相关资源
      最近更新 更多