我正在为一个大学项目创建一个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的图像。
根据文档:
返回一个BufferedImage,作为解码提供的文件的结果从当前已注册。该文件被包装在ImageInputStream中如果否注册的ImageReader声称能够读取得到的流,返回null。getUseCache和getCacheDirectory将用于控制创建的ImageInputStream。
请注意,没有将文件名作为字符串的读取方法;请在从文件名创建文件后使用此方法。
此方法不尝试定位可以读取的ImageReaders直接从文件;可以使用IIORegistry和ImageReaderSpi。
确保您注册了ImageReader或将文件包装在FileInputStream上,但由于您的实现有效,我敢打赌是图像导致了问题,因此
请确保您的图像类型为:GIF、PNG、JPEG、BMP和WBMP,因为这些都是类支持的类型。