通过Java套接字发送大文件的例外

时间:2015-06-28 13:41:05

标签: java arrays image file sockets

我正在为大学项目创建一个Java聊天,其中一个要求是每个用户必须有一个图像关联,这可以通过注册窗口和数据修改窗口完成,在注册中一切都很好,但是修改窗口,当我尝试发送大文件时,程序抛出异常,两个代码(注册和修改)基本相同,只更改变量和路径,但仍然只在修改时提出我的问题

这是我的代码:

客户端:

BufferedImage image = ImageIO.read(new    File(usuario.getImagen().getCanonicalPath()));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", byteArrayOutputStream);
byte[] size = ByteBuffer.allocate(4).putInt(byteArrayOutputStream.size()).array();
salida.write(size);
salida.write(byteArrayOutputStream.toByteArray());
salida.flush();

服务器:

dir = new File ("." + "/Documentos/Imagenes de Verificacion/" +
                    usuarioRegistro.getNombreDeUsuario() + ".jpg");
sizeAr = new byte[4];
entrada.read(sizeAr);
size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();
imageAr = new byte[size];
entrada.readFully(imageAr);
image = ImageIO.read(new ByteArrayInputStream(imageAr));
ImageIO.write(image, "jpg", new File(dir.getCanonicalPath()));
usuarioRegistro.setImagen(dir.getCanonicalFile());

例外是:

Exception in thread "Thread-0" java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at javax.imageio.ImageIO.getWriter(ImageIO.java:1591)
at javax.imageio.ImageIO.write(ImageIO.java:1520)
at com.ucab.javachat.Servidor.model.ServidorModel.run(ServidorModel.java:198)

ServiorModel.java:198行是:ImageIO.write(image,“jpg”,new File(dir.getCanonicalPath()));

在我的测试中,我可以发送20,30,80,200 Kb的图像,但是当我尝试发送2.1mb文件时会出错。

我认为这与byteArray上的一些数据相关(可能是头数据?)但是我不知道如何解决它,我的寄存器窗口方法使用相同的套接字和OutputStream来发送数据,我成功发送了一个24mb图像。

1 个答案:

答案 0 :(得分:1)

根据文件:

  

返回一个BufferedImage作为解码提供的File的结果   从当前的那些中自动选择的ImageReader   注册。 File包含在ImageInputStream中。 如果没有   注册ImageReader声称能够读取结果流,   返回null 。来自getUseCacheand的当前缓存设置   getCacheDirectory将用于控制缓存   创建的ImageInputStream。

     

请注意,没有将文件名作为String的read方法;   在从文件名创建文件后使用此方法。

     

此方法不会尝试查找可以读取的ImageReader   直接来自文件;可以使用IIORegistry和   的ImageReaderSpi。

确保您注册ImageReader或将您的文件包装在FileInputStream上,但由于您的实现有效,我打赌这是导致问题的图像,

确保您的图片类型为:GIF,PNG,JPEG,BMP和WBMP,因为这些是该类支持的类型。