inputStream、File、Byte、String等等之间的相互转换

本文总结了InputStream、byte[]及File之间的转换方法,包括InputStream转byte[]、File、String,byte[]转InputStream、File、String,以及File转InputStream的方法。提供了详细的代码实现。

一:inputStream转换

1、inputStream转为byte

//方法一  org.apache.commons.io.IOUtils包下的实现(建议)
IOUtils.toByteArray(inputStream);
//方法二  用java代码实现(其实就是对上面方法一的解析)
public static byte[] toByteArray(InputStream input) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int n = 0;
    while (-1 != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
    }
    return output.toByteArray();
}

2、inputStream转为file

    public static void inputstreamtofile(InputStream ins, File file) throws IOException {
        OutputStream os = new FileOutputStream(file);
        int bytesRead;
        byte[] buffer = new byte[8192];
        while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        os.close();
        ins.close();
    }

3、inputStream转为String

//方法一  使用org.apache.commons.io.IOUtils包下的方法
IOUtils.toString(inputStream);

//方法二
    /**
     * 将InputStream转换成某种字符编码的String
     * 
     * @param in
     * @param encoding
     * @return
     * @throws Exception
     */
    public static String inputStreamToString(InputStream in, String encoding) {
        String string = null;
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] data = new byte[BUFFER_SIZE];
        int count = -1;
        try {
            while ((count = in.read(data, 0, BUFFER_SIZE)) != -1)
                outStream.write(data, 0, count);
        } catch (IOException e) {
            logger.error("io异常", e.fillInStackTrace());
        }

        try {
            string = new String(outStream.toByteArray(), encoding);
        } catch (UnsupportedEncodingException e) {
            logger.error("字符串编码异常", e.fillInStackTrace());
        }
        return string;
    }

二:byte[]转换

1、byte[]转为inputStream

InputStream sbs = new ByteArrayInputStream(byte[] buf); 

2、byte[]转为File

  public static void 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();
                }
            }
        }
    }

3、byte[]转String

//先将byte[]转为inputStream,然后在转为String
InputStream is = new ByteArrayInputStream(byte[] byt);
//然后在根据上文提到的将inputStream转为String的方法去转换

三、File的转换

1、file转inputStream

FileInputStream fileInputStream = new FileInputStream(file);

 

转载于:https://www.cnblogs.com/Amaris-Lin/p/8252948.html

<think>好的,用户现在想了解如何将byte数组和文件名组合成MultipartFile对象。之前他们问过关于Base64字符串和文件名的情况,现在的问题更直接,只需要处理byte数组。我需要先回顾之前的回答,确保这次的回答一致,同时简化掉Base64解码的部分。 用户可能是在处理文件上传,可能已经将Base64解码成byte数组了,现在需要直接使用byte数组和文件名创建MultipartFile。可能他们正在处理文件上传功能,比如在Spring框架中需要模拟文件上传,或者将现有数据转换为MultipartFile对象。 需要确认用户是否使用Spring框架,因为MultipartFile是Spring的接口,所以实现方式可能依赖于Spring的版本。在之前的回答中,我提供了一个自定义的Base64MultipartFile类,这次同样需要类似的实现,但不需要处理Base64解码,直接使用byte数组。 需要确保步骤清晰,首先是如何创建自定义的MultipartFile实现,然后如何实例化它。同时,需要注意异常处理和内存问题,但用户这次的问题可能更关注基本实现。可能需要提醒他们关于内容类型的处理,比如根据文件名后缀设置正确的Content-Type。 另外,用户可能需要知道如何在实际应用中使用这个自定义类,比如在控制器中接收文件,或者进行测试。可能需要给出示例代码,展示如何将byte数组和文件名传入,生成MultipartFile对象。 还要注意可能的常见问题,比如文件名为空或byte数组为空的情况,是否需要处理这些异常。但用户的问题可能只需要基本实现,所以可以后续补充异常处理的建议。 总结,回答的结构应该包括实现步骤,关键注意事项,示例代码,以及应用场景。需要保持与之前的回答一致,但省略Base64解码部分,直接使用现有的byte数组和文件名。</think>要将 `byte[]` 数组和文件名组合成 `MultipartFile` 对象,可以通过以下步骤实现: --- ### **实现步骤** #### 1. **直接使用字节数组和文件名** 无需解码操作,直接使用已有的 `byte[]` 和文件名: ```java byte[] fileContent = ...; // 已有的字节数组 String fileName = "example.png"; ``` #### 2. **实现自定义 `MultipartFile` 类** 创建一个实现 `MultipartFile` 接口的类,适配字节数组和文件名: ```java import org.springframework.web.multipart.MultipartFile; import java.io.*; public class ByteArrayMultipartFile implements MultipartFile { private final byte[] content; private final String fileName; public ByteArrayMultipartFile(byte[] content, String fileName) { this.content = content; this.fileName = fileName; } @Override public String getName() { return "file"; // 字段名(通常对应表单字段名) } @Override public String getOriginalFilename() { return fileName; } @Override public String getContentType() { // 根据文件名后缀设置类型(例如:image/png) return null; // 可自行实现类型推断 } @Override public boolean isEmpty() { return content == null || content.length == 0; } @Override public long getSize() { return content.length; } @Override public byte[] getBytes() { return content; } @Override public InputStream getInputStream() { return new ByteArrayInputStream(content); } @Override public void transferTo(File dest) throws IOException { try (FileOutputStream fos = new FileOutputStream(dest)) { fos.write(content); } } } ``` #### 3. **组合生成 `MultipartFile`** 直接通过构造函数创建对象: ```java MultipartFile multipartFile = new ByteArrayMultipartFile(fileContent, fileName); ``` --- ### **关键注意事项** 1. **内容类型(Content-Type)** - 建议在 `getContentType()` 中根据文件扩展名设置类型(例如 `image/png`)。 - 可借助 `Files.probeContentType(Path.of(fileName))` 或 `URLConnection.guessContentTypeFromName(fileName)` 自动推断。 2. **异常处理** - `transferTo()` 方法需处理 `IOException`。 - 如果字节数组为空,`isEmpty()` 应返回 `true`。 3. **内存优化** - 大文件直接操作字节数组可能导致内存溢出,建议改用 `InputStream` 流式处理。 --- ### **典型使用场景** #### 在Spring控制器中接收文件 ```java @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { // 直接使用 file.getBytes() 或 file.getInputStream() } ``` #### 模拟文件上传(测试场景) ```java // 构造测试用 MultipartFile MultipartFile mockFile = new ByteArrayMultipartFile( Files.readAllBytes(Path.of("test.jpg")), "test.jpg" ); // 在测试中传递给Controller mockMvc.perform(multipart("/upload").file(mockFile)); ``` --- ### **扩展功能** 1. **自动推断内容类型** 完善 `getContentType()` 方法: ```java @Override public String getContentType() { return Optional.ofNullable(fileName) .map(name -> URLConnection.guessContentTypeFromName(name)) .orElse("application/octet-stream"); } ``` 2. **校验文件格式** 添加对文件头的验证: ```java public boolean isImage() throws IOException { String type = getContentType(); return type != null && type.startsWith("image/"); } ``` --- 通过这种方式,可以灵活地将已有的字节数组和文件名封装为 `MultipartFile` 对象,适用于文件上传、测试模拟等场景。如果需要完整代码示例,可以提供具体需求进一步优化!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值