【发布时间】: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