字符串包含相同的字符但仍然不同[重复]

2024-04-29

我正在尝试读取一个 .txt 文件并使用每个句子作为团队的名称,同时使用该名称查找另一个 .txt 文件以获取其内容。所有 .txt 文件都位于我的资产文件夹的根目录中。第一个 .txt 文件工作正常,我使用assetmanager.open and readLine()获取字符串,但是当使用该字符串作为参数来获取第二个 .txt 时,我得到了java.io.FileNotFoundException。但是,当使用硬编码字符串调用同一 .txt 文件时,一切正常。经过进一步检查,我发现硬编码字符串和用作参数的字符串在使用后返回 falseequals()其上发挥作用。

这是调用的方法first.txt

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, bio, 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;
}

文件中的第一句话是“Netherlands”(不带引号) 我认为这应该导致team_Netherlands.txt为了path2多变的。 然而,使用它会使应用程序崩溃。使用path变量它工作得很好。 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)    

为什么这些字符串不相等以及如何使它们相等? (即,使非硬编码字符串等于硬编码字符串)


如果我执行这段代码:

public static void main(String[] args) {
    load_Players("Netherlands");
}

private static void load_Players(String team_Name) {
    String path = "team_Netherlands.txt"; // works
    String path2 = "team_" + team_Name + ".txt"; // doesn't work?
    System.out.println("are " + path + " and " + path2 + " the same? " + path.equals(path2));
}

一切都按预期进行,所以...出了什么问题?


正如您在日志中看到的,第一个荷兰不是蓝色的,这意味着解析器发现了不同的东西。

可疑啊?


CHECKS:

当我将这部分代码粘贴到我的 eclipse 中时:

team_Netherlands.txt and team_Netherlands.txt 

保存时出现此错误:

如果我选择选项选择第一个字符,它会选择:

System.out.println("team_Netherlands.txt".equals("team_Netherlands.txt"));
                                                       ↑ this one!!!

因此,您传递了错误的编码,您可以使用以下代码片段进行检查:

public static void main(String[] args) {
    String rightString = "_Netherlands.txt";
    String wrongString = "_Netherlands.txt";

    System.out.println("WRONG HASH");
    System.out.println(rightString.hashCode());
    System.out.println("\nRIGHT HASH");
    System.out.println(wrongString.hashCode());

    System.out.println("\nRIGHT");
    printChars(rightString);

    System.out.println("\n\nWRONG");
    printChars(wrongString);

}

private static void printChars(String s) {
    for (Character c : s.toCharArray()) {
        System.out.print((int) c + " ");
    }
}

OUTPUT:

WRONG HASH
1109617587

RIGHT HASH
-428164238

RIGHT
95 78 101 116 104 101 114 108 97 110 100 115 46 116 120 116 

WRONG
95 65279 78 101 116 104 101 114 108 97 110 100 115 46 116 120 116 
// ↑ here!!

解决方案:(source http://www.rgagnon.com/javadetails/java-handle-utf8-file-with-bom.html)

  • Use BOMInputStream来自 Apache IO Commons
  • 手动处理(快速简单的方法):

    private static String clean(String s) throws Exception {
        InputStream is = new ByteArrayInputStream(s.getBytes());
        try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
            // BOM marker will only appear on the very beginning
            br.mark(4);
            if ('\ufeff' != br.read())
                br.reset(); // not the BOM marker
    
            return br.readLine();
        }
    }
    

测试一下!:

public static void main(String[] args) throws Exception {
    String rightString = "Netherlands.txt";
    String wrongString = "Netherlands.txt";

    System.out.println("\nCOMPARE");
    System.out.println(rightString.equals(wrongString));
    System.out.println("\nCLEAN COMPARE");
    System.out.println(clean(rightString).equals(clean(wrongString)));

    System.out.println("\nRIGHT");
    printChars(clean(rightString));

    System.out.println("\n\nWRONG");
    printChars(clean(wrongString));
}

private static String clean(String s) throws Exception {
    InputStream is = new ByteArrayInputStream(s.getBytes());
    try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
        // BOM marker will only appear on the very beginning
        br.mark(4);
        if ('\ufeff' != br.read())
            br.reset(); // not the BOM marker

        return br.readLine();
    }
}

private static void printChars(String s) {
    for (Character c : s.toCharArray()) {
        System.out.print((int) c + " ");
    }
}

OUTPUT:

COMPARE
false

CLEAN COMPARE
true

RIGHT
78 101 116 104 101 114 108 97 110 100 115 46 116 120 116 

WRONG
78 101 116 104 101 114 108 97 110 100 115 46 116 120 116 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串包含相同的字符但仍然不同[重复] 的相关文章

  • 取消正在执行的 AsyncTask 的理想方法

    我正在后台线程中运行远程音频文件获取和音频文件播放操作AsyncTask A Cancellable显示获取操作运行时间的进度条 我想取消 中止AsyncTask当用户取消 决定反对 操作时运行 处理这种情况的理想方法是什么 刚刚发现Ale
  • 如何仅使用命令行运行 Maven 创建的 jar 文件

    我需要一些帮助来尝试使用命令行运行以下 Maven 项目 https github com sarxos webcam capture https github com sarxos webcam capture webcam captur
  • 返回 Consumer 表达式内的 Method 值

    我试图在方法中返回一个布尔值 并且我正在使用消费者函数 有什么方法可以直接在 Consumer 表达式中返回该值吗 这是代码 private static boolean uuidExists UUID uuid MySQL getResu
  • Java 相当于 C# 的 async/await?

    我是一名普通的 C 开发人员 但偶尔也会使用 Java 开发应用程序 我想知道 Java 中是否有相当于 C async await 的东西 简单来说 java 相当于 async Task
  • Android:iOS UIActionSheet 等效项

    我正在转换一个 iOS 应用程序 并且需要实现从 iOS 到 Android 的 UIActionSheet 的等效项 什么 UI 元素最能模仿这一点 我的目标是 Android 2 2 及更高版本 您将使用 AlertDialog 或 D
  • 如何修复Android模拟器中“无法连接到相机服务”异常

    当我在模拟器中运行 Android 应用程序时 出现无法连接到相机服务异常 我已经阅读了各种现有的帖子 但没有一个修复了这个问题 显然是 Camera open 调用失败了 我最终想让网络摄像头在模拟器中运行 正如许多 SO 帖子所讨论的那
  • Java:字符串连接和变量替换的最佳实践[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在 Java 中连接字符串和添加变量值的方法有太多 我应该如何选择一个 优点 缺点 最佳用例等 MessageFormat forma
  • Java - 修剪字节数组中的尾随空格

    我有与此类似的字节数组 77 83 65 80 79 67 32 32 32 32 32 32 32 大致等于 M S A P O C when printed as chars 现在我想修剪尾随空白 使其看起来像 77 83 65 80
  • CellTables 和 css (GWT)

    有人可以帮我设置 CellTable 行的背景吗 拜托 我整晚都在努力做这件事 但一直失败 这是 让我发疯 我尝试过调用setRowStyles 但是那个 似乎不起作用 我读到你无法更改 设置样式后 CellTable 的样式 作为默认样式
  • 无法使用 jolokia 从 Kafka 提取 JMX 数据

    我已经在 centos 7 机器上安装了 Jolokia 并尝试使用 Jolokia 代理提取 Kafka 指标 并使用 Nagios 插件 check jmx4perl 与 Icinga 监控工具集成 以下是我遵循的配置步骤 步骤1 下载
  • Android 检测片段何时分离

    我可以轻松检测到Fragments附于Activity via Activity onAttachFragment 但我怎样才能检测到Activity那一些Fragment脱离活动了吗 没有Activity onDetachFragment
  • Android 基础知识:在 UI 线程中运行代码

    从在 UI 线程中运行代码的角度来看 以下两者之间有什么区别 MainActivity this runOnUiThread new Runnable public void run Log d UI thread I am the UI
  • 从流中过滤/删除无效的 xml 字符

    首先 我无法更改 xml 的输出 它是由第三方生成的 他们在 xml 中插入无效字符 我得到了 xml 字节流表示形式的 InputStream 除了将流消耗到字符串中并对其进行处理之外 是否有一种更干净的方法来过滤掉有问题的字符 我找到了
  • 如何添加不确定的进度条

    我的应用程序 UI 是使用 Android 支持库构建的 但目前没有我的应用程序真正需要的 不确定的 进度条的 AppCompat 版本 我宁愿不使用任何第三方库来实现材料设计进度条 所以我想知道是否有人坐在有关为什么它不包含在支持库中的信
  • XML 渲染错误 Android 预览 N

    更新后我已将 android SDK 更新为 android Preview N 但收到此 xml 渲染错误 单击详细信息后 它显示以下堆栈跟踪如何避免这种情况 org jetbrains android uipreview Renderi
  • 如何在android中创建nanohttpd服务器?

    其实我也查过一些问题 然后去github上找了一下 但我是新来的 我无法理解这个例子 我想在android中创建http服务器 这样我就可以在PC浏览器中访问它 我有一个类扩展 nanohttpd 的实例 但服务器无法工作 不知道为什么 我
  • 使用 Maven 将值附加到文件中

    我想在文件末尾附加一个值 但我无法确定要使用哪个插件 例子 我要附加的值 myValue file value1 value2 myValue 追加后 我知道我可以使用 antrun plugin 来做到这一点 但是可以使用 Maven 插
  • 如何解决“布局有超过 80 个视图,对性能不利”?

    我正在做一个有点复杂的布局 只是我无法修复 LINT 指示的错误 黑莓浏览次数超过 80 对性能不利 这是布局
  • JVM 调试端口 7779 正在使用

    我正在使用 RAD 8 当我在调试模式下启动服务器时 它会显示一条错误消息 指出JVM debug port 7779 is in use 我多次遇到这个问题 因为我知道 RAD 使用了这个端口 所以我不得不停止这个过程窗口任务管理器 gt
  • Jsplitpane 自动调整大小

    我有一个 JSPlitPane 它们之间有 50 的分隔线 这工作正常 但是 当我在右侧添加一些 JLabels 时 jsplitpane 会忽略我的 50 分隔符 左侧窗格会增加其大小 并会挤压右侧窗格 为什么会发生这种情况以及如何解决

随机推荐

  • jQuery 可以改变 css 样式定义吗? (不是每个元素的单独CSS)

    我还没有看到任何文档说 jQuery 可以更改任何 CSS 定义 例如更改 td padding 0 2em 1 2em to td padding 0 32em 2em 但要么必须更改整个样式表 要么更改每个元素的类 要么更改每个元素的
  • 如何使用 Skype4Java 连接到 Skype?

    尝试运行 MakeCall 示例代码时出现以下异常 com skype NotAttachedException at com skype Utils convertToSkypeException Utils java 36 at com
  • 将字符串作为有序字典导入

    我有一个没有扩展名的文件 其中包含这样的行 忽略行之间的间距 但每一行都是单独的行 OrderedDict key1 u value1 key2 value2 OrderedDict key1 u value1 key2 value2 Or
  • 安装我的应用程序时的 android 意图

    安装我的应用程序时我需要执行一项操作 我研究过使用 Intent PACKAGE ADDED 但我没有收到正在安装的应用程序中的意图 我想在第一次安装我的应用程序时运行代码 该用例是注册在线服务 我可以列出 BOOT COMPLETED 如
  • Indexeddb 添加新值而不是更新现有值

    当尝试更新其中的记录时索引数据库使用put方法 看起来是创造了新的价值而不是改变 根据MDN https developer mozilla org en US docs Web API IDBObjectStore put这是更新记录的方
  • Rails Turbolinks 长请求不显示页面加载

    在 Rails 中使用 Turbolinks 如果请求花费很长时间 无论是预期的还是非预期的 浏览器都没有通常的提示来显示任何事情正在发生 我创建了一个要点 它使用加载对话框来解决此问题 如果请求花费的时间超过 500 毫秒 这是可配置的
  • 是什么导致 OS X 应用程序无法打开并出现错误“LSOpenURLsWithRole() 失败,错误 -10810”?

    我正在为 OS X 开发一个非常简单的应用程序包 我的操作系统版本是 10 7 5 本例中的应用程序是一个 shell 脚本 Kerkerkruip app Contents Info plist https github com i7 k
  • 从 MySql 迁移:MariaDB 服务器意外关闭客户端连接

    由于许可 商业使用原因 我们正在从 MySql 迁移到 MariaDB 我们已经成功用 MariaDB 客户端 jar 替换了 MySql 连接器 jar 第一次更改 现在正在尝试用 MariaDB 服务器替换 MySql 服务器而不更改数
  • mvc3 中的小数错误 - 该值对于字段无效

    我正在关注 ASP NET MVC 3 入门 1 我无法添加 编辑 Price 9 99 或 9 99 的值 它说 值 9 99 对 Price 无效 和 价格字段必须是数字 如何解决这个问题 Model public class Movi
  • Xamarin 中的 Task.ConfigureAwait(false) - 安全使用/建议使用?

    经验法则是 如果它不是与 UI 相关的方法 请使用Task ConfigureAwait false 如果我有一个接受接口的 PCL 核心库怎么办IUIAccess 核心库中的视图模型有一个方法 public Task ViewModelL
  • 左/右旋转进位的实际用途

    循环左进位和循环右进位指令有哪些实际用途 在我的汇编课上 我们无法想出一个有用的好例子 如果要将位从一个操作数移出并移入另一个操作数 SHL EAX 1 move sign bit of EAX RCL EDX into LSB of ED
  • 为什么我不能声明对可变对象的引用? (“引用不能声明为可变的”)

    假设我们有一个test cpp如下 class A class B private A mutable a 汇编 gt gcc test cpp test cpp 6 20 error reference a cannot be decla
  • 相对于父元素的边框框调整子元素的大小

    如果我以百分比设置子元素的大小 则大小将相对于父元素计算内容框 http www w3schools com css css boxmodel asp 独立于我已经设置了它的事实box sizing财产给border box 所以如果我有这
  • 初始化影子变量

    标准中是否有任何内容定义从它隐藏的变量初始化变量 例如 int i 7 int i i Visual Studio 2013 允许这样做而不发出警告并按预期工作 内在i变量是 7 然而 Clang 和 GCC 给我一个警告 关于从自身初始化
  • 多次发生 Web 服务错误

    在许多机器 使用 Asp net 1 和 2 上 我们看到以下带有随机文件名的错误 使用 dll每次我们尝试进行 Web 服务调用时都会生成此扩展名 过去我们不得不重新安装asp net这似乎已经解决了问题 然而 有一次我们尝试获取命令提示
  • 序列化/反序列化 LinkedHashMap (android) java

    所以我想将 LinkedHashMap 传递给意图 SEND THE MAP Intent singlechannel new Intent getBaseContext singlechannel class singlechannel
  • CSS 中 img 上的 box-shadow

    是否可以在CSS中为img标签添加阴影 我尝试过 但似乎不起作用 我是正确的还是我的代码搞砸了 CSS image carousel img padding right 14px display block float left box s
  • 在 Databricks 中的 pyspark 数据帧上下载 punkt 时出现 NLTK 查找错误

    我试图通过对 Databricks 中的 pyspark 数据框应用余弦相似度来查找文本列 标题 标题 的相似性 我的函数称为 cosine sim udf 为了能够使用它 我必须进行第一次 udf 转换 将函数应用于 df 后出现查找错误
  • 提升解析器中的 Spirit 段错误

    我一直在尝试将我在本科编译器中编写的一些 lex 和 yacc 代码转换为精神代码以学习精神 我发现了一个我似乎无法弄清楚的段错误 我这样写了词法分析器 namespace lex boost spirit lex enum Tokens
  • 字符串包含相同的字符但仍然不同[重复]

    这个问题在这里已经有答案了 我正在尝试读取一个 txt 文件并使用每个句子作为团队的名称 同时使用该名称查找另一个 txt 文件以获取其内容 所有 txt 文件都位于我的资产文件夹的根目录中 第一个 txt 文件工作正常 我使用assetm