【问题标题】:getting a strange output when I expect english strings当我期望英文字符串时得到一个奇怪的输出
【发布时间】:2012-10-13 01:06:17
【问题描述】:

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

【问题讨论】:

  • 一方面,您不想调用buffer.toString(),而是使用缓冲区的内容创建一个新字符串——如果有记忆的话,类似于new String( buffer, charset )。可能还有其他问题 - 我稍后会尝试查看。

标签: java string encoding utf-8


【解决方案1】:

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

另外,假设文件中有 5 个字符;您将 5 个字符读入 1024 个字符的缓冲区并将所有 1024 添加到您的字符串中。那是 1019 个空字符。我建议使用 BufferedReader.readLine() 代替将文件读入 String 甚至 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)

但是,为了解释如何修复现有问题,您只需要存储读取的字符数并仅使用数组中的字符数。如果还不够清楚,请告诉我,我会写一个代码示例。

【讨论】:

  • 我写了这个code,字符串不会在乌尔都语正则表达式中拆分,我得到output as this 拆分数组的长度也是一个。
【解决方案2】:

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

     text += new String(buffer);

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

【讨论】:

  • 当您使用 text += buffer.toString() 时,您将向文本添加数组的表示,而不是数组的内容。这不是从 char 数组创建新字符串的正确方法
  • 它现在可以工作,但字符串text 没有从乌尔都语文本中断开。This is what I see as output。数组split 的长度也是 1
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2021-04-23
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多