StringBuilder 不正确地反转文件名

StringBuilder improperly reversing a filename

我有一个 StringBuilder 用于简单地反转和 return 一个字符串。有问题的字符串是一个文件名:"server_1.8.2_java_8.jar"(这会有所不同)。

当我反转字符串并 return 时,它变成 "sre_.._aa8jra._vj281rve"。我使用了这个的一些变体(以及像 "Reverse this string" 这样的常规句子),我得到了相同的结果。

但是,如果我在方法中直接分配字符串(而不是将其作为参数并对其执行 some operations),它似乎可以正常工作。

测试方法代码以防有帮助:

static String parseJarfileName(String jarLocation) {
            if(jarLocation == null)
                    return ""; // path to jar location is empty,
                                       // return so stuff doesn't get messed up
            String jarfileName = ""; // name of the .jar server executable
            for(int i = jarLocation.length(); jarLocation.charAt(i - 1) != '/'; i --) {
                    // read the string backwards until a / is found,
                    // signaling that the jarfile name has ended
                    // as this is done, concatenate the characters of the jarfile name
                    jarfileName += jarLocation.charAt(i - 1);
                    jarfileName.trim();
                    // the jarfile name will be backwards here, so reverse it
                    String str = new StringBuilder(jarfileName).reverse().toString();
                    jarfileName = str;
            }
            return jarfileName;
    }

public static void main(String[] args) {
    String filePath = "/Users/John/Desktop/server/server_1.8.2_java_8.jar";
    String fileName = parseJarfileName(filePath);
    System.out.println(fileName);
}

// written by 2xedo: twitter.com/2xedo

此代码将 "sre_.._aa8jra._vj281rve" 打印到控制台。

如果我没记错的话你正在寻找类似

的东西
public static String parseJarfileName(String jarLocation) {
    if (jarLocation == null)
        return ""; 
    return jarLocation.substring(jarLocation.lastIndexOf('/')+1);
}

或者更具可读性

public static String parseJarfileName(String jarLocation) {
    if (jarLocation == null)
        return ""; 
    return new File(jarLocation).getName();
}

您还可以使用 Path,它是 File

的更新版本(在大多数情况下是首选)
return Paths.get(jarLocation).getFileName().toString();

您每次迭代都在反转文件名。

r
ra
arj
jra.
.arj8
//...

for 循环结束后移动 reverse() 代码。

    }  // end of for loop
    // the jarfile name will be backwards here, so reverse it
    String str = new StringBuilder(jarfileName).reverse().toString();
    jarfileName = str;

    return jarfileName;
}

此外,文件名中没有空格似乎无关紧要,但是

jarfileName.trim();

如果不将返回值分配给某物,则无用。使用

jarfileName = jarfileName.trim();

你可以删除这个:

String str = new StringBuilder(jarfileName).reverse().toString();
jarfileName = str;

一切似乎都很好。

如果您只想 return 文件名,为什么不直接 jarLocation.substring(jarLocation.lastIndexOf("/") + 1, jarLocation.length);

您可能需要做更多的工作来处理边缘情况等等,但这应该能准确地满足您的需求。