【问题标题】:Exception on sending big files through java sockets通过 java 套接字发送大文件的异常
【发布时间】:2015-09-15 00:27:41
【问题描述】:

我正在为一个大学项目创建一个 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 图像。

【问题讨论】:

  • usuario.getImagen().getCanonicalPath())这里返回的值是多少?
  • 好吧,图像为空,如错误消息所示。它是空的,因为 ImageIO.read() 返回空。由于 javadoc 中指出的原因,ImageIO.read() 返回 null:没有阅读器能够读取图像。您的图像文件可能无效,或者是 Java 不支持的格式。
  • 客户端中的@GeorgeD返回文件的本地路径(我电脑上的路径)

标签: java arrays image file sockets


【解决方案1】:

根据文档:

返回一个 BufferedImage 作为解码提供的文件的结果 从当前的图像读取器中自动选择的图像读取器 挂号的。该文件被包装在一个 ImageInputStream 中。 如果没有 注册的 ImageReader 声称能够读取结果流, 返回 null。 getUseCacheand 中的当前缓存设置 getCacheDirectory 将用于控制缓存中的 已创建的 ImageInputStream。

请注意,没有将文件名作为字符串的读取方法; 在从文件名创建文件后使用此方法。

此方法不会尝试定位可以读取的 ImageReader 直接从文件中;可以使用 IIORegistry 和 ImageReaderSpi。

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

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

【讨论】:

  • 是JPG图片,如果我用同一张图片注册完美,问题只出在修改
  • 图像是否有可能损坏?您是否通过相同的方法创建图像?原版和修改版
  • 它的方法不同,但代码相同,指令完全相同,图像是从互联网下载的图像,我认为它不会损坏,因为可以很好地使用寄存器
猜你喜欢
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2017-03-14
  • 2016-12-08
  • 1970-01-01
  • 2011-02-24
相关资源
最近更新 更多