После нескольких тестов и поиска я нашел решение.
Чтобы изменить кодировку кодировки файла, мне нужно прочитать и записать файл, используя новую целевую кодировку, но для создания чего-то общего c который может получить любую кодировку, мне нужно идентифицировать исходную кодировку.
Чтобы добиться этого, я добавляю зависимость с именем UniversalDetector
:
<dependency>
<groupId>com.github.albfernandez</groupId>
<artifactId>juniversalchardet</artifactId>
<version>2.3.1</version>
</dependency>
Используя ее, я могу сделать это:
encoding = UniversalDetector.detectCharset(file.getInputStream());
if (encoding == null) {
//throw exception
}
И способ преобразования файла:
private static void encodeFileInLatinAlphabet(InputStream source, String fromEncoding, File target) throws IOException {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(source, fromEncoding));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target),
StandardCharsets.ISO_8859_1))) {
char[] buffer = new char[16384];
int read;
while ((read = reader.read(buffer)) != -1)
writer.write(buffer, 0, read);
}
}
Чтобы я мог получить любую кодировку и кодировать в нужную кодировку.
Примечание: В моем случае мне всегда нужно файл в ISO_8859_1
, так что почему в методе исправлено, но вы можете получить целевой набор символов в качестве параметра.