0

下面的程序从一个名为的文件中读取文本,tes.txt并将纯英语字符串与整个文件中相同的乌尔都语字符串分开。它作为每个英语单词之后的印记。该文件如下所示:(乌尔都语字符串跟随英文字符串)

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

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。为什么是这样 ?它也只打印数组中的一个字符串。我还检查了缓冲区数组的长度,结果是一个。为什么是一个(文件中有多个字符串在将其与正则表达式分离后会进入缓冲区)?我在哪里犯了错误?

4

3 回答 3

0

您没有正确读取文件内容,这是读取内容的更好方法:

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

 String[] splits = text.split("سٹیمپ ختم ہو جاتی ہے");
于 2012-10-13T03:25:01.453 回答
0

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

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

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

于 2012-10-13T01:29:17.953 回答
0

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

     text += new String(buffer);

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

于 2012-10-13T01:25:09.967 回答