多个文件在一次循环中写出到本地,但是输入输出流未关闭导致总有一个文件提示被占用

多个文件在一次循环中写出到本地,但是输入输出流未关闭导致总有一个文件提示被占用
在没有这两句代码的时候,因为流未被关闭,所以多文件的时候,总有一个文件显示被流占用了
使用完流之后,一定要马上关闭,而不是等finally来关闭,它只是做最后的检查而已.
os.close();
in.close();

            for (int i = 0; i < fileOfBills.size(); i++) {
                File file = fileList.get(i);
                sb = new StringBuilder();
                sb.append(dirPath + File.separator).append(fileOfBills.get(i).getName() + FileHelper.getSuffixByFileName1(file.getName()));
                os = new FileOutputStream(new File(sb.toString()));
                in = new FileInputStream(file);
                IOUtils.copy(in, os);
                //os.close();
               // in.close();
            }
  @Override
    public List<FileOfBill> saveFileOfBillByBill(Bill bill, List<FileOfBillWrap> list) throws Exception {


        setDestDir();
        //文件清单
        List<File> fileList = new ArrayList<>();
        //订单对应文件表清单
        List<FileOfBill> fileOfBills = new ArrayList<>();
        //订单对应文件表
        FileOfBill fileOfBill;

        if (list.size() > 0) {
            //1:存库
            for (FileOfBillWrap fileOfBillWrap : list) {
                fileOfBill = fileOfBillWrap.getFileOfBill();
                fileOfBill.setBill(bill);
                fileOfBill.setCreateTime(new Date());

                //添加文件清单
                if (null != fileOfBillWrap.getFile()) {
                    File file = fileOfBillWrap.getFile();
                    //获取文件后缀
                    fileOfBill.setSuffix(FileHelper.getSuffixByFileName(file.getName()));
                    //获取文件名
                    String fileName = UUIDUtils.getUUID();
                    fileOfBill.setName(fileName);
                    fileList.add(fileOfBillWrap.getFile());
                }
                //存库
                FileOfBill add = this.add(fileOfBill);
                fileOfBills.add(add);
            }
        }

        //文件存硬盘
        //创建文件存储目录
        //文件存储目录
        String dirPath = DEST_DIR + File.separator + bill.getBillId();
        FileHelper.mkdirs(dirPath);
        OutputStream os = null;
        InputStream in = null;
        StringBuilder sb;
        /**
         * 2:存本地硬盘
         * 根据数据库已经新增的fileOfBills循环
         * 确保数据库操作成功
         */
        try {
            for (int i = 0; i < fileOfBills.size(); i++) {
                File file = fileList.get(i);
                sb = new StringBuilder();
                sb.append(dirPath + File.separator).append(fileOfBills.get(i).getName() + FileHelper.getSuffixByFileName1(file.getName()));
                os = new FileOutputStream(new File(sb.toString()));
                in = new FileInputStream(file);
                IOUtils.copy(in, os);
                os.close();
                in.close();
            }
        } catch (IOException e) {
            throw e;
        } finally {
            if (null != in) {
                in.close();
            }
            if (null != os) {
                os.close();
            }
        }

        //3:上传文件到武仲
        for(int i = 0;i < fileOfBills.size(); i++){
            upLoadFileRemote(fileOfBills.get(i));
        }

        return fileOfBills;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
文件输入输出流(fstream)一次性读取多个文本文件(txt文件),你可以使用`std::ifstream`和循环结构来实现。以下是一个简单的步骤说明: 1. 创建一个文件名列表(vector或字符串数组)包含你要读取的所有txt文件的路径。 ```cpp #include <fstream> #include <vector> #include <string> std::vector<std::string> fileNames = {"file1.txt", "file2.txt", "file3.txt"}; ``` 2. 使用一个循环遍历文件名列表,并对每个文件打开一个ifstream流。 ```cpp for (const auto& fileName : fileNames) { std::ifstream inputFile(fileName); // 检查文件是否成功打开 if (!inputFile.is_open()) { std::cerr << "Failed to open file: " << fileName << std::endl; continue; // 如果失败,跳过这个文件 } ``` 3. 在循环内部,你可以选择一次性读取整个文件内容到一个字符串变量,或者逐行读取并处理每一行。这里以一次性读取为例: ```cpp std::string content; inputFile.seekg(0, std::ios::end); // 获取文件结束位置 content.resize(inputFile.tellg()); inputFile.seekg(0, std::ios::beg); // 重置指针到开始位置 inputFile.read(&content, content.size()); // 一次性读取所有内容 // 对内容进行处理... // inputFile.close(); // 关闭文件流(推荐在循环外面关闭,避免忘记) // 或者逐行读取: // std::string line; // while (std::getline(inputFile, line)) { // // 处理每一行... // } } ``` 4. 完成所有文件的处理后,别忘了关闭输入流。 ```cpp for (auto& inputFile : files) { inputFile.close(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值