【问题标题】:bufferewd reader spacing stringbufferewd 读取器间距字符串
【发布时间】:2016-02-11 00:05:28
【问题描述】:

我有以下代码:

StringBuilder builder = new StringBuilder();
String fichier = "achats.txt";

try{
    InputStream ips=new FileInputStream(fichier);
    InputStreamReader ipsr=new InputStreamReader(ips);
    BufferedReader br=new BufferedReader(ipsr);
    String ligne;

    while((ligne=br.readLine())!=null){
        builder.append(ligne);
    }

    br.close();
}
catch (Exception e){
    System.out.println(e.toString());
}

我的文件文本是

让·布歇,32134564、543、54
Gilles Boucher, 32145425, 555, 21

我有以下问题:在我从文件中读取它之后,它看起来像这样:

杰安·博克彻尔, 3 2 1 3 4 5 6 4, 5 4 3 , 5 4

我尝试删除所有空白但仍然保持不变。我真的不在乎它在我的屏幕上看起来像什么。但我需要没有空格的数字 543 和 555,所以我可以将它们从字符串转换为 int。有人在阅读后有任何提示如何使其干净吗?

【问题讨论】:

  • 您当前使用的是系统默认编码,我怀疑这就是问题所在。文件的实际编码是什么?我的猜测是它是 UTF-16。#
  • (我会添加一个答案,但在您确认文件的编码之前没有多大意义。)
  • 我的 xml 文件的编码是 Iso-8859-1(是的,我也有这个)。对于 .txt 文件,它的编码是 ansi (我不知道如何将其更改为 iso-8859-1,因为它不是 txt 保存编码)
  • 我已将我的 ansi 更改为 utf-8,现在它可以正常工作了。

标签: java file-io bufferedreader


【解决方案1】:

发生这种情况是因为您的文件包含大小为 1 字节的数据,但读取器类用于读取字符而不是字节,并且从文件中读取的每个字符使用 2 个字节。您必须使用 InputStream 类而不是 InputReader 类。

StringBuilder builder=new StringBuilder();
           String fichier="achats.txt";
           byte [] ar = new byte[1];
           try{
               InputStream ips=new FileInputStream(fichier);
               BufferedInputStream br=new BufferedInputStream(ipsr);
               ar[0] = -1;
               while((ar[0] = br.read()) != -1){
                    builder.append(new String(ar[0]));
                }
                ips.close();
                br.close();
               }
             catch (Exception e){
             System.out.println(e.toString());
               }

【讨论】:

  • 您假设每个字符都是一个字节,并且您仍然有效地使用系统默认编码。这不是解决问题的方法。
  • 正确的方法是使用正确的编码打开文件,但仍然使用阅读器。它是 text 数据,而不是二进制数据,因此 OP does 想要直接使用 Reader 而不是 InputStream... 但他们需要这样做正确的编码。
  • 不,因为我们不知道文件的编码 - 请阅读我的 cmets 问题。但这种方法不是正确的。
  • 您关于读者总是为每个字符读取 2 个字节的说法也是不正确的 - 实际上,这里的问题是读者为每个字符读取 一个 字节,但是OP 的文件包含每个字符的 两个 字节。只有当 OP 的输出省略了所有其他字符时,您的方法才是正确的。
猜你喜欢
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多