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