我使用this accepted answer提供的代码通过Java中的套接字发送文件列表。我的目标是接收图像列表。我想要做的是将这些图像作为BufferedImages
直接读入内存,然后再将它们写入磁盘。但是,我第一次尝试使用ImageIO.read(bis)
(再次看到附带的问题)失败了,因为它试图继续读取第一个图像文件的末尾。
我目前的想法是将数据从套接字写入新的输出流,然后从传递给ImageIO.read()
的输入流中读取该流。这样,我可以像程序当前那样逐字节地写它,但是把它发送到BufferedImage
而不是文件。但是我不确定如何将输出流链接到输入流。
有人可以推荐对上面的代码进行简单的编辑,或者提供另一种方法吗?
答案 0 :(得分: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();