两个字符串显示相同但不等:Socket传参split提取文件名无法打开文件
问题分析与解决
你遇到的核心问题是从Socket获取的字符串经split后得到的文件名,表面和硬编码字符串一致,但实际不相等,导致无法正常打开文件。这大概率是因为split得到的name字符串包含不可见的隐藏字符,或者存在前后空白字符,只是控制台打印时看不出来。
常见原因及验证方法
前后空白/隐藏字符:Socket传输的字符串可能附带空格、制表符(
\t)、换行符(\n)或回车符(\r),这些字符在控制台输出时不会显示,但会导致字符串不相等。
验证方法:打印字符串的长度和每个字符的ASCII码,对比差异:// 打印split后name的长度和每个字符编码 System.out.println("name长度: " + name.length()); for (char c : name.toCharArray()) { System.out.println("字符: '" + c + "' 编码: " + (int)c); } // 打印硬编码文件名的长度和字符编码做对比 String testName = "Sample.txt"; System.out.println("testName长度: " + testName.length()); for (char c : testName.toCharArray()) { System.out.println("字符: '" + c + "' 编码: " + (int)c); }如果长度不同,或者某位置字符编码不一致,就能直接定位到隐藏字符。
字符编码不一致:Socket传输时如果两端编码不统一(比如一端用UTF-8,一端用GBK),可能导致字符看似相同但实际编码值不同。不过这种情况较少见,因为文件名通常是ASCII字符。
解决方法
针对最常见的隐藏字符/空白问题,直接对split后的name做处理即可:
// 方法1:去除前后空白字符(包括空格、换行、回车、制表符) String name = str.split(";")[2].trim(); // 方法2:过滤所有非打印ASCII字符(更彻底) String name = str.split(";")[2].replaceAll("\\p{Cntrl}", "");
处理后再拼接路径,就能和硬编码的path1相等,正常打开文件了。
另外,代码里用new String()包裹字符串字面量是多余操作,直接写String path1 = "Input_Blatt3/Sample.txt";即可。
内容的提问来源于stack exchange,提问作者niklaswort
相关产品推荐
相关产品推荐

