Java中获取URI最后一个路径段的4种方法

使用统一资源标识符 ( URI ) 是一种常见操作,主要用于Web 开发和文件管理。

此外,最常见的需求之一是获取 URL 中的最后一个路径段(最后一个段是最后一个“/”字符之后的最后一个段)。

在本教程中,我们将研究获取 URL 最后一段的不同方法。

1、使用URI类
java.net.URI类支持使用面向对象的方法来解析和操作 URI 。为了方便起见,我们举个例子:

@Test
public void givenURL_whenUsingURIClass_thenGetLastPathSegment() throws URISyntaxException {
    URI uri = new URI("https://www.example.com/path/to/resource");
    String path = uri.getPath();
    String[] segments = path.split(
"/");
    String lastSegment = segments[segments.length - 1];
    assertEquals(
"resource", lastSegment);
}

给定方法使用示例 URL初始化URI 。随后,使用getPath()方法提取 URI 的路径。然后根据正斜杠 (“/”) 分隔符将路径分成多个段。然后通过访问段数组的最后一个元素来确定最后一个路径段。

最后,测试断言最后一个路径段与预期值匹配,从而确认该功能正确地从 URL 中提取了预期资源。

2. 使用路径类
在Java 7中,java.nio.file.Path类为文件和路径提供了与平台无关的表示。提供一种有效的方法来提取 URI 的最后一段。这是一个例子:

@Test
public void givenURL_whenUsingPathClass_thenGetLastPathSegment() {
    String exampleURI = "https://www.example.com/path/to/resource";
    try {
        URI uri = new URI(exampleURI);
        String pathString = uri.getPath();
        Path path = Paths.get(pathString);
        Path lastSegment = path.getName(path.getNameCount() - 1);
        assertEquals(
"resource", lastSegment.toString());
    } catch (Exception e) {
        fail(
"Exception occurred: " + e.getMessage());
    }
}

与上一节一样,我们首先初始化一个 URI 并使用getPath()方法。随后,我们从获得的pathString创建一个名为 path 的Path对象。最后一个段是使用getName()方法和索引计算来确定的。然后将最后一个路径段转换为字符串以进行比较。

3.使用FilenameUtils类
Apache Commons IO库有一个FilenameUtils类,可用作常见文件和路径任务的实用程序类。让我们举个例子:

@Test
public void givenURL_whenUsingFilenameUtilsClass_thenGetLastPathSegment() throws URISyntaxException {
    String exampleURI = "https://www.example.com/path/to/resource";
    URI uri = new URI(exampleURI);
    String path = uri.getPath();
    String lastSegment = FilenameUtils.getName(path);
    assertEquals(
"resource", lastSegment);
}

使用getPath()方法提取路径后,我们利用FilenameUtils类使用getName()方法获取最后一个路径段,该方法将路径作为参数。

4. 使用正则表达式
在从 URL 中提取最后一个路径段时,正则表达式为灵活且精确的模式定义提供了优雅的解决方案。这是一个例子:

@Test
public void givenURL_whenUsingRegularExpression_thenGetLastPathSegment() throws URISyntaxException {
    URI uri = new URI("https://www.example.com/path/to/resource");
    String path = uri.getPath();
    Pattern pattern = Pattern.compile(
".*/(.+)");
    Matcher matcher = pattern.matcher(path);
    if (!matcher.find()) {
        fail(
"Regex pattern didn't match.");
    }
    String lastSegment = matcher.group(1);
    assertEquals(
"resource", lastSegment);
}

在这里,我们定义了一个正则表达式模式“ /(.+) ”来精确捕获 URL 路径的最后一段。利用Pattern和Matcher类,我们使用compile()和matcher()方法编译正则表达式模式并将其应用到路径字符串。

此外,条件检查进一步验证使用find()方法的正则表达式模式应用程序是否成功。成功匹配后,使用group(1)方法从Matcher对象中提取最后一个路径段。