我有以下代码,从一种方法复制/粘贴:
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状态的结尾,因此不是造成问题的原因。