我有以下代码,从一种方法复制/粘贴:

String harmonicFile;
...
...
harmonicFile = String.format("%04d%s",this.number, this.suffix.toUpperCase()) + ".tch";


结果看起来还可以,但是我有些时髦了:

我将此字符串传递给另一个包含以下内容的方法:

if(filename.equals(file)){
   return file;
}


fileName是传入的值,而file是资产文件系统中的匹配项。假设文件是​​“ 0062.tch”。在Intellij IDEA调试器中检查文件名将其显示为等于“ 0062.tch”,但永远不会命中return语句。经过仔细检查,我发现文件名中填充了8个空字符(\ u0000)。

我有两个问题:


为什么要填充字符串?
在IDEA中,如果中断if语句,然后使用表达式求值器(Alt-F8),则显示filename.equals(file)为true,但在运行时单步执行我的代码则表明情况并非如此。我认为这在IDEA评估表达式和Dalvik VM的方式上有些低级的区别?我认为虚拟机是正确的,因为文件名确实不等于文件。


感谢您的任何见解。

西蒙

[编辑]我坚信其余代码无关紧要,但无论如何这里都已删除注释以节省空间。

public String filePathForHarmonicFile(){

    String harmonicFile;
    int number = this.number;

    if(this.number < 0){ return "";}

    if(number<10000 && this.suffix.length()<=1){
        harmonicFile = String.format("%04d%s",this.number, this.suffix.toUpperCase()) + ".tch";
    }else{
        harmonicFile = String.format("%s%s",this.number,this.suffix.toUpperCase()) + ".tch";
    }

    return SCFileManager.getAssetFilePath("",harmonicFile);
}

public static String getAssetFilePath(String rootOfSearch, String filename){

    try {

        // get a list of all file entries in the search root
        String[] files = ThisApplication.getContext().getAssets().list(rootOfSearch);

        for (String file:files){

            String newRoot;
            if (rootOfSearch.equals("")){
                newRoot = file;
            } else {
                newRoot = rootOfSearch + File.separator + file;
            }

            if (TidesPlannerApplication.getContext().getAssets().list(newRoot).length>0){

                String thisFile = getAssetFilePath(newRoot,filename);

                if (!thisFile.equals("")){
                    return thisFile;
                }
            } else {
                if(file.equals(filename)){
                    return file;
                }
            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    return "";

}


我知道这最后一个方法很丑陋,但是如果有人知道一种更好的方法来处理资产子文件夹中的7.5k文件,那么我无所不能-AssetManager的$%^&*脑死了!

最佳答案

在注释中,您可以编写此代码。


  正确。如果检查后备char数组,则如下所示:[0] [0] [6] [2] [.] [t] [c] [h] [\u0000] [\u0000] [\u0000] [\u0000] [\u0000] [\u0000] [\u0000] [\u0000]


这不一定意味着String与NUL一起传递。

字符串的状态由value[offset]value[offset + count - 1]的字符组成。我猜想offset必须为零,但是没有真正的证据证明count的值是多少...

这些NUL可能远远超出String状态的结尾,因此不是造成问题的原因。

10-04 17:21