当前位置:编程学习 > wap >>

读取文本文件相同的字符串不同?

本人因为Android才开始使用Java,上次因为字符串比较用==的问题已经让大家见笑了。感谢大家的帮助。这次又遇到不懂的地方了。还希望大家能够多多指教我这个迷路人。这里提前谢谢大家了。

问题是这样的:我用C#创建了一个UTF-8文本文件sample.txt。假设里面写入了一个字符串
string s="字符串:abc";
而且已经通过工具确定这个文本文件没有BOM。

然后我在Android中把这个文本文件放入raw目录中打开,用TextView显示。另外界面上还有几个Button。
相关代码:

String ss="字符串:abc";

protected java.io.InputStreamReader fs;
protected java.io.FileInputStream fis;
protected java.io.BufferedReader sr;
protected java.io.InputStream ips;

try
{
    ips=this.getResources().openRawResource(R.raw.sample);
    fs=new java.io.InputStreamReader(ips,"UTF-8");
    sr=new java.io.BufferedReader(fs);
    String s=sr.readLine();
    this.mt.setText(s);
    if(s.equals(ss)==true)  this.b2.setText("相同");//b2是一个Button
    //或者直接比较仍然是不同???
   //if(s.equals("字符串:abc")==true) this.b2.setText("相同");
}
catch(Exception e){
    this.b1.setText("打开流的时候出错了!");//没有抛出任何异常。这行代码从来没有被激活。b1也是一个Button
}

读取的时候正常,TextView也能够正确无乱码的显示"字符串:abc"。可是s和ss两个字符串却怎么也不相同?这到底是为什么呢?

我把s和ss都用TextView来显示,至少从显示结果上看不出s和ss有不同。
我的错误出在哪呢? --------------------编程问答-------------------- String s=sr.readLine().trim();
读取文本的时候可能有空格,要把首位空格去掉 --------------------编程问答-------------------- 赞同2楼的说法,另外注意代码中的空格和标点符号要使用同一种格式(中英文一致)。 --------------------编程问答-------------------- 谢谢楼上两位的热心。你们的方法,我刚试了。还是不行。
另外从我问题的描述就能够看出来。我是把我在PC上的软件移植到Android上,并且PC版本是使用了C#并工作正常。把数据文件拿到手机上打开出了问题。
因为是通过程序建立的文件。所以应该不会有空格的问题。因为我在写入的时候就是writeline(string)的。也正是因为是自己的程序写进去的而不是通过记事本手动编辑的。所以才会没有BOM的问题。 --------------------编程问答-------------------- 会不会和编码有关? --------------------编程问答-------------------- 会不会读出来的中文乱码? --------------------编程问答-------------------- 我自己搞了断代码试了,发现长度不同,读出来的是8,程序中的是7不知道为什么?求高手解答 --------------------编程问答-------------------- 会不会读出来的有个换行符?

猜的 --------------------编程问答-------------------- 回楼上两位:要是乱码就好了。最起码知道问题出在哪里。可问题是我在前面说的很清楚,读取和在TextView上显示都没有问题,TextView上也正确的显示了我文件里的字符串。弄得我都不知道到底问题出在哪?
我也怀疑是编码的问题。因为我试验了一下用String类的getbyte方法比较两个字符串,结果还是不一样。
代码:
byte[] br=ss.getBytes("UTF-8");
byte[] bs=s.getBytes("UTF-8");

if(br==bs) this.b2.setText("相同");//这行还是不执行 --------------------编程问答--------------------
引用 7 楼 q445697127 的回复:
会不会读出来的有个换行符?

猜的

嗯。。。

你能调试吗?看看字符串的每个字符都是什么就清楚了。不行把每个字符都打出来。咱们就不用猜了。 --------------------编程问答-------------------- trim一下,应该可以把首尾的空格,换行符都去掉 --------------------编程问答-------------------- 回复楼上:
我刚试了一下,确实如您所说的,读出来的字符串比字符串原值长度多1。
长度都不一样,两个串当然不一样了。可是多出来的到底是不是换行符我还不确定。
而且这又引出另一个问题了。同样的代码C#版本没有任何问题。怎么到了Java这里就出了叉子了?
当然,首先还是得弄明白这长度到底怎么差的1? --------------------编程问答-------------------- this.b3.setText(s.substring(s.length()-1));//b3是个button
this.b4.setText(ss.substring(ss.length()-1));//b4是个button

活见鬼了!

这两行执行完的结果都是c
--------------------编程问答-------------------- 问题在字符串的开头。长度大1。
长在字符串开头。
取得字符串开头字符的时候,从文件读出来的是个不可见字符。
而程序定义的字符串开头第一个字符是正确的第一个字符。
可这到底是为什么呢? --------------------编程问答-------------------- 如果用windoes的记事本编辑过的文件,很可能产生不可见字符.因为记事本的回车,产生二个字符0x0A和0x08,再用Backspace删,只能删除0x0A;不清楚你是如何用C#创建UTF-8文本文件sample.txt.你试试是否是这个原因. --------------------编程问答-------------------- 因为同一个人不能连续回帖三次。结果我只能等着有人回复之后才能继续说试验的结果。
多出来的不可见字符在字符串的开头。得到它的UTF-8编码是 -1 ???
而再读取第二行的时候,即再次readline(),开头就没有这个编码为 -1 的不可见字符了。
现在我怀疑我是不是被我用的工具软件给骗了!
这个 -1 会不会是文件头?
有熟悉BOM的吗?
这个 -1 是不是BOM? --------------------编程问答-------------------- 你用字符 方式读取,不要用utf-8 --------------------编程问答-------------------- 用notepad++这种文本编辑软件打开文件,显示换行符,看看是LF CR双符号换行的还是单单CR换行。 --------------------编程问答-------------------- 在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码, UTF-8的BOM是 EFBBBF
单个-1不太象BOM.
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,