错误
java.lang.RuntimeException: java.io.IOException: Permission denied
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:662)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:650)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:90)
at com.cdeledu.yunqi.common.utils.ExcelUtils.createSheet(ExcelUtils.java:676)
at com.cdeledu.yunqi.common.utils.ExcelUtils.exportExcel(ExcelUtils.java:248)
at com.cdeledu.yunqi.common.utils.ExcelUtils.exportExcel(ExcelUtils.java:222)
at com.cdeledu.yunqi.biz.service.impl.BizCourseEduIncomeServiceImpl.export(BizCourseEduIncomeServiceImpl.java:150)
at com.cdeledu.yunqi.web.controller.biz.BizCourseEduIncomeController.export(BizCourseEduIncomeController.java:45)
at com.cdeledu.yunqi.web.controller.biz.BizCourseEduIncomeController$$FastClassBySpringCGLIB$$7647406f.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
at com.cdeledu.yunqi.framework.aspectj.SysLogAspect.around(SysLogAspect.java:71)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
现象:本地windows测试没有问题,放到线上linux 系统就会出现io异常
分析: 一般出现这问题都是,存在文件落盘了,根据堆栈信息来看 SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:662) 是在这段代码中存在问题,代码如下:
SXSSFSheet createAndRegisterSXSSFSheet(XSSFSheet xSheet)
{
final SXSSFSheet sxSheet;
try
{
sxSheet=new SXSSFSheet(this,xSheet);
}
catch (IOException ioe)
{
throw new RuntimeException(ioe);
}
registerSheetMapping(sxSheet,xSheet);
return sxSheet;
}
从上面代码看出,在sxSheet=new SXSSFSheet(this,xSheet); 这段代码中有问题,继续跟下去,
public SXSSFSheet(SXSSFWorkbook workbook, XSSFSheet xSheet) throws IOException {
_workbook = workbook;
_sh = xSheet;
_writer = workbook.createSheetDataWriter();
setRandomAccessWindowSize(_workbook.getRandomAccessWindowSize());
_autoSizeColumnTracker = new AutoSizeColumnTracker(this);
}
出现了 workbook.createSheetDataWriter(); 这个,看到了曙光,继续,
public SheetDataWriter(SharedStringsTable sharedStringsTable) throws IOException {
this();
this._sharedStringSource = sharedStringsTable;
}
点击this() 方法:
public SheetDataWriter() throws IOException {
_fd = createTempFile();
_out = createWriter(_fd);
}
看到了创建临时文件的地方,
最后会在这个地方找到在那个目录创建了文件,修改对应文件的目录权限就好 linux目录是 /tmp/pofiles 。windows目录是C:\Users\ADMINI~1\AppData\Local\Temp