在Java 1.5中读取UTF-8 .properties文件?

时间:2011-12-05 11:42:02

标签: java file utf-8 properties

我有一个项目,一切都是UTF-8。我使用Properties.load(Reader)方法读取此编码中的属性文件。但是现在,我需要使项目与Java 1.5兼容,并且Java 1.5中不存在所提到的方法。只有一个load方法将InputStream作为参数,假设它在ISO-8859-1中。

有没有简单的方法可以使我的项目1.5兼容而无需将所有.properties文件更改为ISO-8859-1?我真的不想在我的项目中混合编码(编码已经是一次一个时间下沉,更不用说混合时)或者将我的所有项目都改为ISO-8859-1。

使用“一种简单的方法”,我的意思是“无需从头开始创建自定义属性类”。

6 个答案:

答案 0 :(得分:3)

您可以使用xml-properties吗?据我所知,spec .properties文件应该在ISO-8859-1,如果你想要其他字符,应该使用native2ascii工具引用它们。

答案 1 :(得分:2)

可能适用于这种情况的一种策略如下:

  1. Reader的字节读入ByteArrayOutputStream
  2. 完成后,请致电toByteArray() 见下文。
  3. 使用byte[]构建ByteArrayInputStream
  4. 使用Properties.load(InputStream)
  5. 中的ByteArrayInputStream

    正如所指出的,上面的实际上未能将字符集从UTF-8转换为ISO-8859-1。要解决这个问题,请进行调整。

    BAOS填写后,而不是拨打toByteArray() ..

    1. 致电toString("ISO-8859-1")以获取ISO-8859-1编码String。然后看.. ..
    2. 致电String.getBytes()以获取byte[]

答案 2 :(得分:1)

你可以做的是打开一个使用BufferedReader读取数据的线程,然后将数据写出到PipedOutputStream,然后通过加载使用的PipedInputStream进行链接。

PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream(pos);
ReaderRunnable reader = new ReaderRunnable(pos, new File("utfproperty.properties"));
Thread t = new Thread(reader);
t.start();
properties.load(pis);
t.join();

BufferedReader将一次读取一个字符的数据,如果它检测到的字符数据不在US-ASCII(即低7位)范围内,则写入“\ u”+字符代码进入PipedOutputStream。

ReaderRunnable将是一个类似于:

的类
public class ReaderRunnable implements Runnable {
  public ReaderRunnable(OutputStream os, File f) {
    this.os = os;
    this.f = f;
  }
  private final OutputStream os;
  private final File f;
  public void run() {
    // open file
    // read file, escape any non US-ASCII characters
  }
}

现在写完所有我认为有人应该先解决这个问题并解决它之后,找到这些东西的最佳位置是Apache Commons。幸运的是,他们在那里实施了。

https://commons.apache.org/io/apidocs/org/apache/commons/io/input/ReaderInputStream.html

Apache的实现并非没有缺陷。您的输入文件即使是UTF-8也必须只包含ISO-8859-1字符集中的字符。我上面提供的设计可以处理这种情况。

答案 3 :(得分:1)

我个人在我的项目中做的是将我的属性保存在带有扩展名.uproperties的UTF-8文件中,并在构建时使用native2ascii.exe将它们转换为ISO到.properties文件。这允许我以UTF-8维护我的属性,Ant脚本为我做其他所有事情。

答案 4 :(得分:1)

根据您的构建引擎,您可以\ uXXXX将属性转义到构建目标目录。 Maven可以通过 native2ascii-maven-plugin 过滤它们。

答案 5 :(得分:-1)

我刚刚体验到的是,使所有.java文件也是UTF-8编码类型(不仅是存储UTF-8字符的属性文件)。这种方式也不需要用于InputStreamReader。另外,请确保编译为UTF-8编码。

这对我有用,没有添加任何UTF-8参数。

要测试这个,请在​​eclipse中编写一个简单的存根程序,并通过转到该文件的属性和资源部分来更改该java文件的格式,以设置UTF-8编码格式。