java+file+转为byte_byte数组与File文件的转换

本文介绍了一种在异步线程场景下,如何避免主线程与子线程间文件连接断开导致数据丢失的问题。通过将文件转换为byte数组并在子线程中处理,确保了数据完整性和一致性。方法包括file2byte和byte2File的转换函数,以及multipartFile转File的处理。
摘要由CSDN通过智能技术生成

业务场景:

在异步线程中,主线程提交了一个文件,子线程接收文件后出现文件大小变为“0”的情况。

原因:文件从主线程到子线程连接断开,导致文件上传数据丢失

处理方式:在主线程中将文件转为byte数组,在子线程接收该数组后再将数组转为文件。

File与byte数组的相互转换

public class FileUtil {

/**

* file转byte

*/

public static byte[] file2byte(File file){

byte[] buffer = null;

try{

FileInputStream fis = new FileInputStream(file);

ByteArrayOutputStream bos = new ByteArrayOutputStream();

byte[] b = new byte[1024];

int n;

while ((n = fis.read(b)) != -1)

{

bos.write(b, 0, n);

}

fis.close();

bos.close();

buffer = bos.toByteArray();

}catch (FileNotFoundException e){

e.printStackTrace();

}

catch (IOException e){

e.printStackTrace();

}

return buffer;

}

/**

* byte 转file

*/

public static File byte2File(byte[] buf, String filePath, String fileName){

BufferedOutputStream bos = null;

FileOutputStream fos = null;

File file = null;

try{

File dir = new File(filePath);

if (!dir.exists() && dir.isDirectory()){

dir.mkdirs();

}

file = new File(filePath + File.separator + fileName);

fos = new FileOutputStream(file);

bos = new BufferedOutputStream(fos);

bos.write(buf);

}catch (Exception e){

e.printStackTrace();

}

finally{

if (bos != null){

try{

bos.close();

}catch (IOException e){

e.printStackTrace();

}

}

if (fos != null){

try{

fos.close();

}catch (IOException e){

e.printStackTrace();

}

}

}

return file;

}

/**

* multipartFile转File

**/

public static File multipartFile2File(MultipartFile multipartFile){

File file = null;

if (multipartFile != null){

try {

file=File.createTempFile("tmp", null);

multipartFile.transferTo(file);

System.gc();

file.deleteOnExit();

}catch (Exception e){

e.printStackTrace();

log.warn("multipartFile转File发生异常:"+e);

}

}

return file;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值