gpt4 book ai didi

java - 通过java套接字发送大文件的异常

转载 作者:行者123 更新时间:2023-12-01 11:22:12 24 4
gpt4 key购买 nike

我正在为一个大学项目创建一个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)是:

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 上松散的一些数据有关(也许是 header 数据?),但我不知道如何修复它,我的寄存器窗口方法使用相同的套接字和 OutputStream 来发送数据,并且我成功发送了24mb 图像。

最佳答案

根据文档:

Returns a BufferedImage as the result of decoding a supplied File with an ImageReader chosen automatically from among those currently registered. The File is wrapped in an ImageInputStream. If no registered ImageReader claims to be able to read the resulting stream, null is returned. The current cache settings from getUseCacheand getCacheDirectory will be used to control caching in the ImageInputStream that is created.

Note that there is no read method that takes a filename as a String; use this method instead after creating a File from the filename.

This method does not attempt to locate ImageReaders that can read directly from a File; that may be accomplished using IIORegistry and ImageReaderSpi.

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

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

关于java - 通过java套接字发送大文件的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31100481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com