异常java.lang.IllegalStateException: File has been moved - cannot be read again

本文探讨了解析Excel文件过程中遇到的multipartFile.getInputStream()方法引发的java.lang.IllegalStateException异常问题,并提供了两种解决方案:调整配置文件中的maxInMemorySize值或通过临时文件读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做的功能涉及到解析excel,解析文件时,每次调用multipartFile.getInputStream(),就会出异常java.lang.IllegalStateException: File has been moved - cannot be read again。

 

SpringMVC上传文件时,需要配置MultipartResolver处理器

maxUploadSize:单个请求的最大上传大小。这意味着所有上传文件的总大小不能超过这个配置的最大值。默认值是无限的(值为-1)。但是我们可以通过maxUploadSize及其value属性来设置它。

maxInMemorySize:小于这个值的文件存储在内存中,否则它们将直接存储在磁盘中。默认值是10 KB(10240字节)。或者你可以通过maxInMemorySize和它的值属性对它进行定制。

 

<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> 
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">   
    <property name="defaultEncoding" value="UTF-8"/> 
    <!-- 指定所上传文件的总大小不能超过1M。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 --> 
    <property name="maxUploadSize" value="1000000"/>
    <!-- 最大内存大小 (40960)--> 
    <property name="maxInMemorySize" value="40960" />
</bean>

我的配置中,maxInMemorySize =40960b ,也就是40Kb,为了验证是不是配置的问题,分别上传不同的文件,结果发现,当我上传的文件大于40kb时,multipartFile调用getInputStream()方法就会抛出异常。

 

我理解的意思是,文件小于40kb时,在内存中读取,文件存在。大于40kb是,就不能从内存中读取了,需要从硬盘直接读取,内存中没有数据,这时候调用getInputStream()必然要抛异常了。

 

对于这个问题,我尝试了两种解决方案,均是可行的:

 

一是改配置文件,设置文件的最大内存大小为大的值

<!-- 最大内存大小 (4096000)--> 
<property name="maxInMemorySize" value="4096000" />

 

二是将multipartFile转换为file,通过new FileInputStream(file) 获取inputstream

 

public String parseFile(MultipartFile mulfile){
    // 获取文件名
    String fileName = mulfile.getOriginalFilename();
    // 获取文件后缀
    String prefix = fileName.substring(fileName.lastIndexOf("."));
    // 创建文件
    File excelFile = File.createTempFile(fileName, prefix);
    // MultipartFile 转换 File:mulfile ---->File
    mulfile.transferTo(excelFile);
    ......
 } // MultipartFile 转换 File:mulfile ---->File
    mulfile.transferTo(excelFile);
    ......
 }

 

### 关于 Java 中 `java.lang.IllegalStateException` 异常的解决方案 当遇到 `java.lang.IllegalStateException: Unable to read meta-data for class` 这类错误时,通常意味着 Spring Boot 应用程序在尝试读取某个配置类或组件的元数据时遇到了问题。这类问题可能由多种原因引起。 #### 可能的原因分析 1. **依赖冲突** 如果项目中有多个版本不兼容的库,则可能导致此类异常。应检查项目的依赖树并解决任何潜在的冲突[^1]。 2. **自动配置类路径缺失** 当自定义 Starter 或者某些特定配置未被正确识别时也会抛出此异常。确保所有必要的包都已加入到扫描路径下,并且这些包中的类文件可以正常访问[^3]。 3. **META-INF 文件夹下的 spring.factories 配置不当** 对于基于 Spring Boot 的应用程序来说,在 META-INF/spring.factories 文件中指定的自动装配类列表如果书写有误(比如拼写错误),同样会触发该异常。确认这个文件的内容格式无误是非常重要的[^4]。 4. **编译器设置问题** 使用不同的构建工具(Maven/Gradle)可能会因为插件配置不同而影响最终打包的结果。特别是对于一些特殊场景如多模块工程而言,更要注意各子模块间的相互关系以及它们各自的资源处理方式[^2]。 #### 推荐的操作步骤 为了有效排查和解决问题: - 审查日志信息以获取更多上下文线索; - 清理本地仓库缓存重新下载所需依赖项; - 检验是否存在重复引入相同功能却来自不同源的情况; - 尝试更新至最新稳定版框架及其扩展来获得更好的支持与修复; - 查看官方文档了解是否有针对当前环境的具体指导说明; 通过上述方法往往能够帮助定位具体成因从而采取相应措施加以修正。 ```xml <!-- Maven pom.xml 示例 --> <dependencyManagement> <dependencies> <!-- 统一管理Spring Boot 版本号 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- Gradle build.gradle 示例 --> plugins { id 'org.springframework.boot' version '${springBootVersion}' } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值