Нет, ты не можешь этого сделать. Вы можете передавать только байты.
Что вам нужно сделать, это загрузить файл во временный файл, а затем преобразовать его:
final Path transferFile = Files.createTempFile("transfer", "xxx");
// transfer file to transferFile
// Sure it's not 1252?
final Charset srcCharset = Charset.forName("windows-1251");
final Path dstFile = Paths.get("destinationFile");
final Charset dstCharset = StandardCharsets.UTF_8;
final char[] buf = new char[16384]; // or another size
int charsRead;
try (
final BufferedReader reader = Files.newBufferedReader(transferFile, srcCharset);
final BufferedWriter writer = Files.newBufferedWriter(dstFile, dstCharset);
) {
while ((charsRead = reader.read(buf)) != -1)
writer.write(buf, 0, charsRead);
writer.flush();
}
Files.delete(transferFile);
Теперь, если вы можете получить InputStream
из файла, который хотите передать, код будет выглядеть следующим образом (ПРИМЕЧАНИЕ: закрытие исходного InputStream
здесь НЕ обрабатывается; однако обратите внимание, что .close()
Closeable
является идемпотентным, поэтому даже если читатель закроет поток , вы все равно хотите его закрыть):
// "in" is the InputStream from the remote file
final Charset srcCharset = Charset.forName("windows-1251");
final Path dstFile = Paths.get("destinationFile");
final Charset dstCharset = StandardCharsets.UTF_8;
try (
final FileSystem sshfs = xxx;
final Reader reader = new InputStreamReader(in, srcCharset);
final BufferedWriter writer = Files.newBufferedWriter(dstFile, dstCharset);
) {
while ((charsRead = reader.read(buf)) != -1)
writer.write(buf, 0, charsRead);
writer.flush();
}
ИДЕАЛЬНО: существует реализация JSR 203 через SFTP, однако я ее не нашел; если вы найдете его, вы можете даже использовать Files.copy()
:
final Charset srcCharset = Charset.forName("windows-1251");
final Path dstFile = Paths.get("destinationFile");
final Charset dstCharset = StandardCharsets.UTF_8;
try (
final FileSystem sshfs = xxx;
final BufferedReader reader
= Files.newBufferedReader(sshfs.getPath("sourcepath"), srcCharset);
final BufferedWriter writer = Files.newBufferedWriter(dstFile, dstCharset);
) {
while ((charsRead = reader.read(buf)) != -1)
writer.write(buf, 0, charsRead);
writer.flush();
}
person
fge
schedule
12.01.2015