2016-07-21 15 views
1

Я пытаюсь прочитать файл (не имеет значения, расширение) и писать после этого, но когда я это делаю, выходной файл отличается от ввода.При чтении и записи файла вывод изменяется

мой код следующий:

OutputStream outputStream = null; 
FileReader fr = new FileReader("rute\\inputfile.PNG"); 
BufferedReader br = new BufferedReader(fr); 
String line; 
while ((line= br.readLine()) != null) { 
    content += line; 
} 

byte[] toBytes= content.getBytes(); 
InputStream inputStream = new ByteArrayInputStream(toBytes); 
try { 
    outputStream = new FileOutputStream(new File("rute\\output.PNG")); 
    int read = 0; 
    byte[] bytes = new byte[1024]; 

    while ((read = inputStream.read(bytes)) != -1) { 
     outputStream.write(bytes, 0, read); 
    } 
    outputStream.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
inputStream.close(); 

Если вы спросите меня, почему преобразовать в байты и писать от этой формы, это потому, что мне нужно что-то делать с данными, и мне нужно это преобразование. Если вы скажете мне, что я не могу загрузить изображения на строку, да я могу сделать что-то вроде этого:

File fil = ~~~~; 
FileInputStream fis = null; 
fis = new FileInputStream(fil); 
byte[] bytess = IOUtils.toByteArray(fis); 

Но я не хочу делать это таким образом, потому что, если я хочу загружать большие файлы, размер кучи недостаточно, это можно было бы решить с помощью строки «line per line».

Спасибо за ваши ответы

+0

В чем вопрос? –

+0

Как я могу читать и писать файл без его изменения, или что проблема/причина, по которой выходной файл не совпадает с вводом? –

ответ

2

Я рекомендую прочитать this question раньше. Поскольку вы читаете двоичные данные в String, вы меняете кодировку этих данных. Таким образом, результат будет другим.

Лучший подход - чтение двоичных файлов в виде массивов байтов. Но я буду зависеть от того, какой тип трансформации/редакции/изменений вам нужно сделать с ними.

UPDATE

И, конечно же, вы редактируете контент, прежде чем писать

while ((line= br.readLine()) != null) { 
    content += line + "\n"; 
} 

поэтому ваш выходной файл будет отличаться всегда.

UPDATE 2

Поскольку вопрос/проблема заключается в том, чтобы прочитать большой двоичный файл, google, как правило, ваш друг. Или вы можете это проверить question

+0

Но если я читаю как массив байтов, мне нужно загрузить весь файл в массив, не так ли? Я делаю строку в строке, потому что я могу разделить исходный файл и не перезаряжать кучу –

+1

@AlejandroPicosPrieto Что такое «строка» в контексте двоичного файла? – glglgl

+0

@AlejandroPicosPrieto Зачем вам это нужно читать в блоке? Вы всегда можете использовать https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html#read (byte []) или https://docs.oracle.com/javase/8 /docs/api/java/io/InputStream.html#read(byte[],%20int,%20int). – glglgl