Чтение файлов UTF-8 .properties в Java 1.5? - PullRequest
2 голосов
/ 05 декабря 2011

У меня есть проект, где все в UTF-8. Я использовал метод Properties.load (Reader) для чтения файлов свойств в этой кодировке. Но теперь мне нужно сделать проект совместимым с Java 1.5, а упомянутый метод не существует в Java 1.5. Существует только метод загрузки, который принимает InputStream в качестве параметра, который, как предполагается, соответствует ISO-8859-1.

Есть ли какой-нибудь простой способ сделать мой проект 1.5 совместимым, не меняя все файлы .properties на ISO-8859-1? На самом деле я не хочу, чтобы в моем проекте было сочетание кодировок (кодировки уже занимают время по одному, не говоря уже о том, чтобы смешивать их) или изменить весь мой проект на ISO-8859-1.

Под «простым способом» я подразумеваю «без создания собственного класса свойств с нуля».

Ответы [ 6 ]

3 голосов
/ 05 декабря 2011

Не могли бы вы вместо этого использовать xml-properties ? Как я понимаю по спецификации .properties файлы должны быть в ISO-8859-1, если вы хотите, чтобы другие символы были заключены в кавычки, используя инструмент native2ascii.

2 голосов
/ 05 декабря 2011

Одна стратегия, которая может работать в этой ситуации, выглядит следующим образом:

  1. Считать байты Reader в ByteArrayOutputStream.
  2. Как только это будет завершено, позвоните toByteArray() См. Ниже.
  3. С помощью конструкции byte[] a ByteArrayInputStream
  4. Используйте ByteArrayInputStream in Properties.load(InputStream)

Как указывалось выше, на самом деле не удалось преобразовать набор символов из UTF-8 в ISO-8859-1. Чтобы исправить это, подправить.

После заполнения BAOS вместо вызова toByteArray() ..

  1. Позвоните toString("ISO-8859-1"), чтобы получить кодировку ISO-8859-1 String. Тогда посмотри ..
  2. Позвоните String.getBytes(), чтобы получить byte[]
1 голос
/ 05 декабря 2011

В зависимости от вашего движка сборки вы можете \ uXXXX-экранировать свойства в целевой каталог сборки. Maven может фильтровать их с помощью native2ascii-maven-plugin .

1 голос
/ 05 декабря 2011

Что я лично делаю в своих проектах, так это то, что я храню свои свойства в файлах UTF-8 с расширением .uproperties и преобразовываю их в ISO во время сборки в файлы .properties, используя native2ascii.exe.Это позволяет мне поддерживать свои свойства в UTF-8, а скрипт Ant делает все остальное за меня.

1 голос
/ 05 декабря 2011

Что вы можете сделать, это открыть поток, который будет читать данные с использованием 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. Дизайн, который я представил выше, может справиться с этой ситуацией.

0 голосов
/ 18 февраля 2013

То, что я только что испытал, это сделать все файлы .java также типом кодировки UTF-8 (не только файл свойств, в котором вы храните символы UTF-8). Таким образом, нет необходимости использовать для InputStreamReader также. Кроме того, не забудьте скомпилировать в кодировку UTF-8.

Это сработало для меня без каких-либо дополнительных параметров UTF-8.

Чтобы проверить это, напишите простую программу-заглушку в eclipse и измените формат этого java-файла, перейдя в свойства этого файла и раздела Resource, чтобы установить формат кодировки UTF-8.

...