Я искал ответ на этот вопрос, но ничего не мог найти на Это. Ранее сегодня я спросил, как я могу преобразовать файл в строку с помощью массива байтов, а затем обратно, для последующего извлечения.
Люди говорили мне, что мне нужно просто сохранить массив байтов, чтобы избежать неприятных проблем с кодировкой. Итак, теперь я начал работать над этим, но сейчас я уперся в стену.
По сути, раньше я использовал небуферизованные потоки, чтобы превратить файл в массив байтов. Теоретически это хорошо работает, но требует много памяти, что в конечном итоге приведет к исключению размера кучи. Вместо этого я должен использовать буферизованные потоки (по крайней мере, мне так сказали), и проблема, с которой я столкнулся сейчас, заключается в переходе от BufferedInputStream к byte[]. Я попытался скопировать и использовать методы, описанные в этой документации
Где я обмениваю небуферизованные потоки на буферизованные. Единственная проблема заключается в том, что я не могу напрямую преобразовать буферизованный поток вывода в массив байтов, как я могу с небуферизованным потоком.
Помочь? :)
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public final class BufferedByteStream {
private static final int BUF_SIZE = 1024000;
public static long copy(BufferedInputStream from, BufferedOutputStream to) throws IOException {
byte[] buf = new byte[BUF_SIZE];
long total = 0;
while(true) {
int r = from.read(buf);
if(r == -1) {
break;
}
to.write(buf, 0, r);
total += r;
}
return total;
}
public static byte[] toByteArray(BufferedInputStream in) throws IOException {
BufferedOutputStream out = new BufferedOutputStream(new ByteArrayOutputStream());
copy(in, out);
return out. // <--- Problem is here
}
}
РЕДАКТИРОВАТЬ:
Я все еще получаю ошибки Heap Space. Итак, теперь я опубликую весь код:
main.java
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import jserver.io.BufferedByteStream;
/**
*
* @author Vipar
*/
public class main {
public static void main(String[] args) {
File f = new File("");
try {
byte[] buf;
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f))) {
buf = BufferedByteStream.toByteArray(bis);
bis.close();
}
File f2 = new File("");
try (FileOutputStream fos = new FileOutputStream(f2)) {
fos.write(buf);
fos.close();
}
} catch (FileNotFoundException ex) {
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
BufferedByteStream.java
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public final class BufferedByteStream {
private static final int BUF_SIZE = 1024000;
public static long copy(BufferedInputStream from, BufferedOutputStream to) throws IOException {
byte[] buf = new byte[BUF_SIZE];
long total = 0;
while(true) {
int r = from.read(buf);
if(r == -1) {
break;
}
to.write(buf, 0, r);
total += r;
}
return total;
}
public static byte[] toByteArray(BufferedInputStream in) throws IOException {
ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
BufferedOutputStream out = new BufferedOutputStream(bytesOut);
copy(in, out);
return bytesOut.toByteArray();
}
}