参见英文答案 >
Two identical Strings are not equal(Not pointer/reference mistake)1个
我正在尝试读取.txt文件并使用每个句子作为团队的名称,同时使用该名称来寻找另一个.txt文件来获取其内容.所有.txt文件都位于我的assets文件夹的根目录下.第一个.txt文件工作正常,我使用assetmanager.open和readLine()来获取字符串,但是当使用该字符串作为参数来获取第二个.txt时,我得到一个java.io.FileNotFoundException.但是,当使用硬编码字符串调用相同的.txt文件时,一切正常.经过进一步检查,我发现硬编码字符串和用作参数的字符串在使用equals()函数后返回false.
我正在尝试读取.txt文件并使用每个句子作为团队的名称,同时使用该名称来寻找另一个.txt文件来获取其内容.所有.txt文件都位于我的assets文件夹的根目录下.第一个.txt文件工作正常,我使用assetmanager.open和readLine()来获取字符串,但是当使用该字符串作为参数来获取第二个.txt时,我得到一个java.io.FileNotFoundException.但是,当使用硬编码字符串调用相同的.txt文件时,一切正常.经过进一步检查,我发现硬编码字符串和用作参数的字符串在使用equals()函数后返回false.
private void loadTeams() { try { BufferedReader r = new BufferedReader(new InputStreamReader(assetManager.open("matches.txt"))); String name,bio,trainer; for(int i = 0; i < 4; i++){ name = r.readLine(); bio = r.readLine(); trainer = r.readLine(); System.out.println(name+","+bio+","+trainer); teams[i] = new Team(name,i,loadPlayers(name),trainer); } r.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
使用“name”作为以下方法的参数:
private Player[] loadPlayers(String teamName){ Player[] players = new Player[11]; try { String path = "team_Netherlands.txt"; //works String path2 = "team_"+teamName+".txt"; //doesn't work? System.out.println("are "+path+" and " +path2 +" the same? "+path.equals(path2)); BufferedReader r = new BufferedReader(new InputStreamReader(assetManager.open(path2))); //perform operations on the obtained info r.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return players; }
文件中的第一句是“荷兰”(没有引号)
我认为应该导致team_Netherlands.txt为path2变量.
然而,使用它会使应用程序崩溃.使用路径变量它可以正常工作. println确认字符串不相等. (见logcat的第一句)
logcat的:
05-26 11:18:23.152 2960-2960/com.myname.testapp I/System.out: are team_Netherlands.txt and team_Netherlands.txt the same? false 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: java.io.FileNotFoundException: team_Netherlands.txt 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.content.res.AssetManager.openAsset(Native Method) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.content.res.AssetManager.open(AssetManager.java:354) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.content.res.AssetManager.open(AssetManager.java:328) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at com.myname.testapp.Poule_Activity.load_Players(Poule_Activity.java:144) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at com.myname.testapp.Poule_Activity.load_Teams(Poule_Activity.java:94) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at com.myname.testapp.Poule_Activity.onCreate(Poule_Activity.java:53) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.app.Activity.performCreate(Activity.java:5990) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.app.ActivityThread.access$800(ActivityThread.java:156) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102) 05-26 11:18:23.152 2960-2960/com.myname.testapp W/System.err: at android.os.Looper.loop(Looper.java:211) 05-26 11:18:23.153 2960-2960/com.myname.testapp W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5373) 05-26 11:18:23.153 2960-2960/com.myname.testapp W/System.err: at java.lang.reflect.Method.invoke(Native Method) 05-26 11:18:23.153 2960-2960/com.myname.testapp W/System.err: at java.lang.reflect.Method.invoke(Method.java:372) 05-26 11:18:23.153 2960-2960/com.myname.testapp W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 05-26 11:18:23.153 2960-2960/com.myname.testapp W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
为什么这些字符串不相等以及如何使它们相等? (即,使非硬编码字符串等于硬编码字符串)
解决方法@H_403_23@
您从文件中读取的team_name包含前面的
UTF-8 byte order mark个八位字节
ef bb bf
并且它们在日志输出中不可见.
保存没有BOM的文件,或remove the BOM in your code.
ef bb bf
并且它们在日志输出中不可见.
保存没有BOM的文件,或remove the BOM in your code.