当我期待英语字符串时得到一个奇怪的输出

时间:2012-10-13 01:06:18

标签: java string encoding utf-8

以下程序从名为tes.txt的文件中读取文本,并将普通英语字符串与整个文件中相同的Urdu字符串分开。它充当每个英文单词后的印章。 该文件如下所示:(Urdu字符串跟随英文字符串)

سٹیمپ ختم ہو جاتی ہے

suhail

سٹیمپ ختم ہو جاتی ہے  

gupta

سٹیمپ ختم ہو جاتی ہے

ghazal
سٹیمپ ختم ہو جاتی ہے

在使用Windows时,我编译了以下程序:

import java.io.*;

class checker {
public static void main(String args[]) {
try {
     File f = new File("C:/Users/user/Desktop/tes.txt");
     FileReader reader = new FileReader(f);
     char buffer[] = new char[1024];
     String text = "";
     while( reader.read(buffer) > 0 ) {
        text += buffer.toString();
     }

     String splits[] = text.split("سٹیمپ ختم ہو جاتی ہے");

     for(int i=0;i<splits.length;i++) {
        System.out.println(splits[i]);
     }  
} catch(Exception exc) {
   exc.printStackTrace();
  }
}
}

javac -encoding UTF-8 checker.java。但是当我运行此程序时,我得到的输出为[C@19b49e6。为什么是这样 ?它还只从数组中打印一个字符串。我还检查了缓冲阵列的长度,它出来了。为什么一个(文件中有多个字符串在从正则表达式中分离后会进入缓冲区)?我在哪里弄错了?

3 个答案:

答案 0 :(得分:0)

char buffer []未正确添加到字符串中,请更改此行。

     text += new String(buffer);

*对不起我以前的回答我有点困了。

答案 1 :(得分:0)

你的错误是假设数组的toString为你提供了元素的文本表示。它不是。你想要java.util.Arrays.toString(array)。

另外,假设文件中有5个字符;你将5个字符读入1024个字符的缓冲区中,并将所有1024个字符添加到你的字符串中。这是1019个空字符。我建议使用BufferedReader.readLine()代替将文件读入字符串甚至是Guava的Files.toString(文件文件,字符串字符集) - http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/Files.html#toString(java.io.File,%20java.nio.charset.Charset

但是,要解释如何修复所拥有的内容,只需要存储读取的字符数,并且只使用数组中的那么多字符。如果这还不够清楚,请告诉我,我会写一个代码示例。

答案 2 :(得分:0)

您没有正确阅读文件内容,以下是阅读内容的更好方法:

 String text = "";
 int readcount=0;
 while((readcount =  reader.read(buffer)) != -1 ) {
    text += new String(buffer, 0, readcount);
 }

 String[] splits = text.split("سٹیمپ ختم ہو جاتی ہے");