根据现有file对象生成新的file

博主在项目中遇到APP嵌套H5页面,安卓端拍照上传多张图片时最后一张覆盖前面图片的问题。因相册选图正常,测试未发现问题就上线了。发包解决慢,前端调试发现拍照保存路径相同,通过重新生成文件对象解决了问题。

最近做了个项目,要求app里嵌套个H5页面,主要是图片的上传功能,不过在安卓上遇到了问题,由于采用的是一次性上传多张图片,但在安卓上拍照时,最后一张图片总会把前面的覆盖掉。相册选择图片没有问题,导致测试小哥没有测出来,app就匆匆上线了,发包解决太慢,还要等审核,然后就只能前端想办法处理,悲催。

经过调试发现,

fileObj = document.getElementById('idCard_' + i).files[0]; 

拍照后保存的图片路径是同一个,所以我从input[type=file]取到的文件永远是最后一张,所以就想到重新生成一个文件对象不就能解决了吗?于是有了这样一行代码,

flieArr[i] = new File([fileObj], new Date().getTime() + fileFormat)

成功解决,图片压缩什么的就不说了,网上太多了

<think>好的,用户想知道如何将Java中的InputStream对象写入File对象,我需要提供一个示例。首先,我应该回忆一下相关的Java I/O类和方法。 记得Java中有几种方法可以实现这个功能。传统的方法是使用FileOutputStream,逐字节读取输入流然后写入文件,但这种方法效率可能不高。更高效的方式是使用BufferedInputStream和BufferedOutputStream,或者利用Java NIO的Files.copy方法。 用户可能需要不同的实现方式,比如使用缓冲区,或者更简洁的代码。Apache Commons IO库的FileUtils.copyInputStreamToFile也是一个常用方法,但需要添加依赖库。不过用户可能希望不依赖第三方库,所以应该优先介绍标准库的方法。 接下来,需要检查引用的资料。引用[2]提到了createFileFromInputStream方法,但可能用户需要自己实现类似的功能。引用[4]提到了InputStreamReader和BufferedReader,但这里是写入文件,所以可能更相关的是OutputStream。 然后,分步骤说明不同的方法。例如,方法一使用Files.copy,这是Java 7+的NIO方法,简洁高效。方法二使用传统的循环读取,并提到使用byte数组缓冲区提升性能。方法三可以介绍Apache Commons IO的方法,但需注明需要第三方库。 还需要注意异常处理和资源关闭,使用try-with-resources确保流被正确关闭,避免资源泄漏。在示例代码中展示正确的写法。 用户可能遇到的问题包括文件路径的正确性、权限问题,或者大文件处理时的内存问题,可以简要提及这些注意事项。 最后,生成相关问题,帮助用户进一步了解相关操作,比如处理大文件、转换Reader等。</think>要将Java中的`InputStream`对象写入`File`对象,可以通过以下方法实现: --- ### **方法1:使用Java NIO的`Files.copy`(推荐)** Java 7+提供了`Files.copy`方法,可直接将`InputStream`内容复制到文件: ```java import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; public class InputStreamToFile { public static void main(String[] args) { try (InputStream inputStream = /* 获取输入流,例如网络或文件 */) { Path targetPath = Path.of("output.txt"); Files.copy(inputStream, targetPath, StandardCopyOption.REPLACE_EXISTING); } catch (Exception e) { e.printStackTrace(); } } } ``` - **优点**:代码简洁,性能高效,自动管理资源[^5]。 - **注意**:需Java 7及以上版本支持。 --- ### **方法2:传统IO流逐字节复制** 使用`FileOutputStream`逐字节读取并写入文件: ```java import java.io.InputStream; import java.io.FileOutputStream; public class InputStreamToFile { public static void main(String[] args) { try (InputStream is = /* 输入流 */; FileOutputStream fos = new FileOutputStream("output.txt")) { int byteData; while ((byteData = is.read()) != -1) { fos.write(byteData); } } catch (Exception e) { e.printStackTrace(); } } } ``` - **缺点**:逐字节读写效率低,适用于小文件。 --- ### **方法3:使用缓冲区提升性能** 通过`BufferedInputStream`和`BufferedOutputStream`优化读写速度: ```java import java.io.*; public class InputStreamToFile { public static void main(String[] args) { try (InputStream is = new BufferedInputStream(/* 输入流 */); OutputStream os = new BufferedOutputStream(new FileOutputStream("output.txt"))) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = is.read(buffer)) != -1) { os.write(buffer, 0, bytesRead); } } catch (Exception e) { e.printStackTrace(); } } } ``` - **优点**:通过缓冲区减少IO操作次数,适合大文件[^4]。 --- ### **方法4:使用Apache Commons IO(第三方库)** 若项目中已引入Apache Commons IO库,可用`FileUtils.copyInputStreamToFile`: ```java import org.apache.commons.io.FileUtils; import java.io.InputStream; public class InputStreamToFile { public static void main(String[] args) { try (InputStream is = /* 输入流 */) { FileUtils.copyInputStreamToFile(is, new File("output.txt")); } catch (Exception e) { e.printStackTrace(); } } } ``` - **优点**:代码最简洁,但需依赖第三方库[^2]。 --- ### **注意事项** 1. **资源关闭**:使用`try-with-resources`确保流自动关闭。 2. **异常处理**:捕获`IOException`并合理处理。 3. **大文件优化**:推荐使用缓冲区或`Files.copy`避免内存溢出。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值