Java语言File,String, byte[]及File和MultipartFile相互转化

概述

起因:在使用Selenium实现截图时,发现API有三种方式生成截图:

byte[] img = driver.getScreenshotAs(OutputType.BYTES);
String img = driver.getScreenshotAs(OutputType.BASE64);
File img = driver.getScreenshotAs(OutputType.FILE);

这三种方式有什么区别?我应该用哪一种?

事实上,在之前的开发生涯中,也断断续续会遇到这三种数据类型之间的互转化的需求。每次都是临时Google搜索,于是本文记录整理一下,也算是一个备忘录。

实现

String与byte[]相互转化

这个基本上是最简单的,不需要Google搜索:

// String to byte[]
// 无传参, 默认UTF-8
byte[] a1 = "ss".getBytes();
// 指定Charset,IDEA会提示用第四种写法
byte[] a2 = s.getBytes(Charset.defaultCharset());
// string指定Charset,会抛异常UnsupportedEncodingException,需捕获,IDEA会提示用第四种写法
byte[] a3 = s.getBytes("utf-8");
// 推荐
byte[] a4 = s.getBytes(StandardCharsets.UTF_8);
// byte[] to String
Arrays.toString(a1);

String与File相互转化

File to String

读取File,获取其文件流

@Slf4j
public static String fileToBase64(File file) {
    String base64 = null;
    InputStream in = null;
    try {
        in = new FileInputStream(file);
        byte[] bytes = new byte[(int) file.length()];
        in.read(bytes);
        base64 = Base64.getEncoder().encodeToString(bytes);
    } catch (Exception e) {
        log.error("fileToBase64 failed: ", e);
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                log.error("fileToBase64 close in failed: ", e);
            }
        }
    }
    return base64;
}

String to File

将String形式的字符流转化为File文件:

@Slf4j
public static void base64ToFile(String destPath, String base64, String fileName) {
    File file;
    // 创建文件目录
    File dir = new File(destPath);
    if (!dir.exists() && !dir.isDirectory()) {
        dir.mkdirs();
    }
    BufferedOutputStream bos = null;
    java.io.FileOutputStream fos = null;
    try {
        byte[] bytes = Base64.getDecoder().decode(base64);
        file = new File(destPath + "/" + fileName);
        fos = new java.io.FileOutputStream(file);
        bos = new BufferedOutputStream(fos);
        bos.write(bytes);
    } catch (Exception e) {
        log.error("base64ToFile failed: ", e);
    } finally {
        if (bos != null) {
            try {
                bos.close();
            } catch (IOException e) {
                log.error("base64ToFile close bos failed: ", e);
            }
        }
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
            	log.error("base64ToFile close fos failed: ", e);
            }
        }
    }
}

byte[]与File相互转化

byte[] to File

public static void byte2File(byte[] buf, String filePath, String fileName) {
	BufferedOutputStream bos = null;
    FileOutputStream fos = null;
    File file;
    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) {
	    log.error("byte2File failed: ", e);
    } finally {
        if (bos != null) {
            try {
                bos.close();
            } catch (IOException e) {
                log.error("byte2File close bos failed: ", e);
            }
        }
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                log.error("byte2File close fos failed: ", e);
            }
        }
    }
}

File to 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 (IOException e) {
    	log.error("file2byte failed: ", e);
    }
    return buffer;
}

File和MultipartFile相互转化

File转换成MultipartFile

直接给出解决方案,需引入依赖:

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
</dependency>

实现代码:

FileInputStream fileInputStream = new FileInputStream(file);
// contentType根据需求调整
MultipartFile multipartFile = new MockMultipartFile(file.getName(), file.getName(), ContentType.IMAGE_PNG.toString(), fileInputStream);

由于MultipartFile是一个接口,不能实例化,故而借助于spring-test提供的MockMultipartFile来实例化。

MockMultipartFile源码如下:


public class MockMultipartFile implements MultipartFile {
    private final String name;
    private String originalFilename;
    @Nullable
    private String contentType;
    private final byte[] content;

    public MockMultipartFile(String name, @Nullable byte[] content) {
        this(name, "", (String)null, (byte[])content);
    }

    public MockMultipartFile(String name, InputStream contentStream) throws IOException {
        this(name, "", (String)null, (byte[])FileCopyUtils.copyToByteArray(contentStream));
    }

    public MockMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, @Nullable byte[] content) {
        Assert.hasLength(name, "Name must not be null");
        this.name = name;
        this.originalFilename = originalFilename != null ? originalFilename : "";
        this.contentType = contentType;
        this.content = content != null ? content : new byte[0];
    }

    public MockMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, InputStream contentStream) throws IOException {
        this(name, originalFilename, contentType, FileCopyUtils.copyToByteArray(contentStream));
    }

提供4种实例化方式,最终都是通过byte[]字节流来实现。

其中File转化为byte[]使用spring-core自带的FileCopyUtils工具类。

MultipartFile转换成File

需要引入依赖:

<dependency>
	<groupId>commons-io</groupId>
	<artifactId>commons-io</artifactId>
</dependency>

代码:

File file = new File(path); 
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);  

结论

spring-core,包括其他commons-utils已经提供很多实现好的工具类,而且是经过若干用户验证的,几乎没有问题的代码。

建议不要花精力重复写工具类方法,更不要用于生产项目,不过还是可以自己手写代码模仿及学习。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 将字符串换为MultipartFile需要进行以下步骤: 1. 创建一个临时文件,将字符串内容写入该文件中。 2. 使用JavaMultipartFile类创建一个新的MultipartFile对象,并将临时文件作为参数传递给该对象的构造函数。 3. 最后,删除临时文件。 示例代码如下: ```java import org.springframework.web.multipart.MultipartFile; import org.springframework.util.FileCopyUtils; import java.io.File; import java.io.IOException; public class StringToMultipartFileConverter { public static MultipartFile convert(String content, String filename) throws IOException { // 创建临时文件 File tempFile = File.createTempFile("temp", ".txt"); // 将字符串内容写入临时文件 FileCopyUtils.copy(content.getBytes(), tempFile); // 创建MultipartFile对象 MultipartFile multipartFile = new org.springframework.mock.web.MockMultipartFile(filename, tempFile.getName(), "text/plain", tempFile); // 删除临时文件 tempFile.delete(); return multipartFile; } } ``` 使用示例: ```java String content = "Hello, world!"; String filename = "test.txt"; MultipartFile multipartFile = StringToMultipartFileConverter.convert(content, filename); ``` ### 回答2: 在Java程序开发中,常常会遇到需要将String类型换成MultipartFile类型的需求。在实际开发中,例如前端页面上传文件后将文件内容成字符串传输给后端,再由后端将字符串MultipartFile类型进行文件存储等操作。 下面是一些实现方法: 方法一:使用Base64实现 Base64是一种基于64个可打印字符来表示二进制数据的方法,可将二进制数据成ASCII编码的文本,从而方便字符串传输。 1.前端页面上传文件后,将文件内容成字符串: let file = document.querySelector('input[type="file"]').files[0]; let reader = new FileReader(); reader.onloadend = function() { let base64String = btoa(reader.result); //将base64String传输给后端进行处理 } reader.readAsBinaryString(file); 2.后端将base64StringMultipartFile类型: String base64String = "xxxxx"; //假设base64String为前端传来的字符串 byte[] fileBytes = Base64.getDecoder().decode(base64String); MultipartFile multipartFile = new MockMultipartFile("test.txt", "test.txt", "text/plain", fileBytes); 其中MockMultipartFile是Spring框架提供的一个虚拟MultipartFile实现类,常用于测试环境中构造上传的文件及参数。 方法二:使用ByteArray实现 1.前端页面上传文件后,将文件内容成字符串: let file = document.querySelector('input[type="file"]').files[0]; let reader = new FileReader(); reader.onloadend = function() { let uint8Array = new TextEncoder().encode(reader.result); //将uint8Array传输给后端进行处理 } reader.readAsText(file); 2.后端将uint8ArrayMultipartFile类型: byte[] bytes = uint8Array.getBytes(); MultipartFile multipartFile = new MockMultipartFile("test.txt", "test.txt", "text/plain", bytes); 需要注意的是,这种方式需要使用ES6的TextEncoder方法将字符串成Uint8Array类型,同时也需要参考文献中提供的示例代码进行ByteArray和MultipartFile类型的换。 参考文献: 1. stackoverflow.com/questions/45156633/how-to-convert-string-to-multipartfile 2. developer.mozilla.org/en-US/docs/Web/API/TextEncoder ### 回答3: 在Java中,stringmultipartfile的过程需要经过一些步骤。这个过程需要我们先将字符串数据byte数组,再将其File类型,最后再将File类型换为MultipartFile类型。 首先,我们需要将字符串数据byte数组,可以使用getBytes()方法: ``` String str = "hello world"; byte[] bytes = str.getBytes(); ``` 接下来,我们将byte数组写入文件中,可以使用FileOutputStream类: ``` File file = new File("temp.txt"); FileOutputStream fos = new FileOutputStream(file); fos.write(bytes); fos.close(); ``` 然后,我们可以将File类型换为MultipartFile类型。这里,我们需要使用MockMultipartFile类: ``` MockMultipartFile multipartFile = new MockMultipartFile(file.getName(), new FileInputStream(file)); ``` 最后,我们就得到了MultipartFile类型的数据,可以进行接下来的操作: ``` //使用multipartFile进行操作 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

johnny233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值