私はこれに対する答えを探していましたが、実際には何も見つかりませんでした。今日の初めに、バイト配列を使用してファイルを文字列に変換し、後で取得するために再度戻す方法を尋ねました。
人々が私に言ったことは、厄介なエンコーディングの問題を避けるために、バイト配列を格納するだけでよいということでした。だから今、私はそれに取り組み始めました、しかし私は今壁にぶつかりました。
基本的に、以前はバッファなしのストリームを使用して、ファイルをバイト配列に変換していました。これは理論的にはうまく機能しますが、多くのメモリを消費し、最終的にヒープサイズの例外が発生します。代わりにバッファリングされたストリームを使用する必要があります(またはそう言われています)。現在の問題は、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
}
}
編集:
まだヒープスペースエラーが発生しています。だから私は今すべてのコードを投稿します:
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("<doesn't matter>");
try {
byte[] buf;
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f))) {
buf = BufferedByteStream.toByteArray(bis);
bis.close();
}
File f2 = new File("<doesn't matter>");
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();
}
}