0

この受け入れられた回答で提供されるコードを使用して、Java のソケットを介してファイルのリストを送信しています。私の目標は、画像のリストを受け取ることです。私がやりたいのは、これらの画像BufferedImagesをディスクに書き込む前に、これらの画像を直接メモリに読み込むことです。ただし、ImageIO.read(bis)最初の画像ファイルの最後を超えて読み取りを続行しようとしたため、(添付の質問を参照してください) を使用する最初の試みは失敗しました。

私の現在のアイデアは、ソケットから新しい出力ストリームにデータを書き込み、次に に渡される入力ストリームからそのストリームを読み取ることですImageIO.read()。このようにして、プログラムが現在行っているようにバイトごとに書き込むことができますBufferedImageが、ファイルではなくに送信します。ただし、出力ストリームを入力ストリームにリンクする方法がわかりません。

上記のコードを簡単に編集することを推奨したり、これを行う別の方法を提供したりできる人はいますか?

4

1 に答える 1

1

イメージをディスクに書き込む前に読み取るには、ByteArrayInputStream を使用する必要があります。http://docs.oracle.com/javase/6/docs/api/java/io/ByteArrayInputStream.html

基本的に、指定されたバイト配列から読み取る入力ストリームを作成します。したがって、画像の長さ、名前、長さのバイト数を読み取り、ByteArrayInputStream を作成し、それを ImageIO.read に渡します。

スニペットの例:

long fileLength = dis.readLong();
String fileName = dis.readUTF();
byte[] bytes = new byte[fileLength];
dis.readFully(bytes);
BufferedImage bimage = ImageIO.read(new ByteArrayInputStream(bytes));

または、引用した他の回答のコードを使用します。

String dirPath = ...;

ServerSocket serverSocket = ...;
Socket socket = serverSocket.accept();

BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
DataInputStream dis = new DataInputStream(bis);

int filesCount = dis.readInt();
File[] files = new File[filesCount];

for(int i = 0; i < filesCount; i++)
{
    long fileLength = dis.readLong();
    String fileName = dis.readUTF();
    byte[] bytes = new byte[fileLength];
    dis.readFully(bytes);
    BufferedImage bimage = ImageIO.read(new ByteArrayInputStream(bytes));

    //do some shit with your bufferedimage or whatever

    files[i] = new File(dirPath + "/" + fileName);

    FileOutputStream fos = new FileOutputStream(files[i]);
    BufferedOutputStream bos = new BufferedOutputStream(fos);

    bos.write(bytes, 0, fileLength);

    bos.close();
}

dis.close();
于 2012-07-11T14:54:14.173 に答える