[Java] 如何将输入流转换成文件

本文详细介绍了如何使用Java的InputStream将接收到的流数据转换为文件,重点讲解了使用System.arraycopy()进行高效数据复制的方法。通过实例代码演示了流到文件的转换过程,并探讨了arraycopy在提高效率中的作用。
摘要由CSDN通过智能技术生成

使用场景: 之前用HttpClient做了一个文件下载模块,但是请求来的数据是流形式,因此需要将流还原成文件,于是用到以下方法;

原理: 本方法原理是先用固定字节数读取输入流,再将其写入文件输出流,先读后写完成流到文件的转换,顺便研究了下arraycopy()的用法;

代码: 输入流转化成文件

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class StreamToFile {

    /**
     * 流转换成文件
     * @param inputStream
     */
    public void inputStreamToFile(InputStream inputStream){
        try{
            //新建文件
            File file = new File("D:/demo/demo.zip");
            if (file.exists()){
                file.createNewFile();
            }
            OutputStream os = new FileOutputStream(file);
            int read = 0;
            byte[] bytes = new byte[1024 * 1024];
            //先读后写
            while ((read = inputStream.read(bytes)) > 0){
                byte[] wBytes = new byte[read];
                System.arraycopy(bytes, 0, wBytes, 0, read);
                os.write(wBytes);
            }
            os.flush();
            os.close();
            inputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

arraycopy() 方法

功能:将指定源数组从指定位置复制到目标数组的指定位置

参数:源数组(src),源数组读出的位置(srcPos),目标数组(dest),目标数组写入的位置(destPos),需要赋值数据的长度(length)

用法:System.arraycopy()

*************************************源码********************************************
* Copies an array from the specified source array, beginning at the
* specified position, to the specified position of the destination array.
* @param      src      the source array.  // 源数组
* @param      srcPos   starting position in the source array. // 源数组读出的位置
* @param      dest     the destination array. // 目标数组,往里写的
* @param      destPos  starting position in the destination data. // 目标数组写入的位置
* @param      length   the number of array elements to be copied. // 需要赋值数据的长度

public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一般来说,Ajax 是用来异步传输数据的,而文件传输需要使用的是同步传输。因此,使用 Ajax 接收文件流并转换成文件可能会有一些困难。 不过,如果你的需求是通过 Ajax 提交表单,包括文件上传,然后在服务器端将文件存储起来,那么可以使用 FormData 对象来实现。具体来说,可以将表单数据和文件数据一起封装到 FormData 对象中,然后使用 XMLHttpRequest 对象发送请求,并且设置 `processData` 和 `contentType` 为 false,这样就可以将文件上传到服务器了。以下是一个简单的示例代码: ```javascript var formData = new FormData(); formData.append('file', $('#fileInput')[0].files[0]); // 将文件添加到 FormData 对象中 formData.append('name', $('#nameInput').val()); // 将表单数据添加到 FormData 对象中 $.ajax({ url: 'upload.php', type: 'POST', data: formData, processData: false, contentType: false, success: function(data) { // 文件上传成功后的处理 } }); ``` 在服务器端,可以使用相应的编程语言来处理接收到的文件流并将其保存到服务器上。例如,使用 PHP 可以使用 `move_uploaded_file` 函数来将上传的文件保存到指定的目录中: ```php if($_FILES['file']['error'] == UPLOAD_ERR_OK) { $tmp_name = $_FILES['file']['tmp_name']; $name = $_FILES['file']['name']; $path = 'uploads/' . $name; move_uploaded_file($tmp_name, $path); } ``` 在上述示例代码中,`$_FILES['file']` 是上传的文件信息,`$tmp_name` 是上传文件的临时文件名,`$name` 是上传文件的原始文件名,`$path` 是上传文件存储的路径。使用 `move_uploaded_file` 函数将上传的文件从临时目录移动到指定的路径中,这样就完成了文件上传的过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值