我有以下代码,从方法中复制/粘贴:
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”,但返回语句从未被命中。仔细检查,我可以看到文件名填充了 8 个空字符 (\u0000)。
我有两个问题:
为什么要填充字符串?
在 IDEA 中,中断 if 语句然后使用表达式评估器 (Alt-F8) 显示 filename.equals(file) 为真,但在运行时单步执行我的代码表明它不是。我认为这是 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 是 $%^&* 脑死!