java - 读取 Swift Message Prowide (WIFE) 后关闭 fileInputStream

标签 java inputstream fileinputstream swift-mt

我正在读取 SWIFT 消息 (MT103) 并将其加载到数据库中。之后我需要删除该文件,以避免在下一个周期中进行第二次解析。但它接缝全范围不会自动关闭InputStream解析消息后。如何关闭InputStream以便文件能够成功归档?当我尝试使用 FileUtils 存档文件时我收到错误:Failed to delete original file '\home\swift\991904100973103097.out' after copy to '\home\Outswift\991904100973103097.out'

public static void loadMessageInformationToDatabase(String sourceDir, File archiveDir) {
    log.debug("Listening to Incoming SWIFT Messages");
    File[] files = new File(sourceDir).listFiles();
    log.debug("Found " + files.length + " SWIFT Files for Processing");
    if (files.length > 0) {
        for (int i = 0; i < files.length; i++) {
            log.debug("Attepting to process file " + files[i].getAbsolutePath());
            int swiftSerialNumner = 0;
            try {
                MtSwiftMessage msg = MtSwiftMessage.parse(files[i]);
                String mtNumber = msg.getMessageType();
                String receiver = msg.getReceiver();
                String sender = msg.getSender();
                byte[] message = IOUtils.toByteArray(new FileInputStream(files[i]));
                String pde = msg.getPde();
                String instructedCurrency = "";
                double instructedAmount = 0.00;
                String inOutIndicator = "";
                if (msg.isIncoming()) {
                    inOutIndicator = "I";
                } else if (msg.isOutgoing()) {
                    inOutIndicator = "O";
                }
                String senderReference = "";
                if (mtNumber.equalsIgnoreCase("103")) {
                    MT103 model = MT103.parse(files[i]);
                    List<Field> fields = model.getFields();
                    for (Field field : fields) {
                        if (field.getName().equalsIgnoreCase("20")) {
                            senderReference = field.getValue();
                        }
                        if (field.getName().equalsIgnoreCase("33B")) {
                            instructedCurrency = field.getValue().substring(0, 3);
                            instructedAmount = Double.parseDouble(field.getValue().substring(3).replace(",", "."));
                        }
                    }
                }
                swiftSerialNumner = Swift.addSwiftMessage(mtNumber, receiver, message, "N", null, null, null, null, "S", "SYSTEM", new Date(), "Y", new Date(), "SYSTEM", new Date(), "SYSTEM", null, inOutIndicator, null, null, null, pde, "Y", receiver, sender, null, senderReference, null, instructedAmount, instructedCurrency, null, null, null, null, null, "N", "Y", "N", Gct.getBankId(), "Y");
                if (swiftSerialNumner > 0) {
                    log.debug("File " + files[i].getAbsolutePath() + " Parsed Successfully");
                    if (Swift.isDuplicateReference(senderReference)) {
                        Swift.markSwiftMessageAsDuplicate(swiftSerialNumner);
                        log.warn("SWIFT Serial " + swiftSerialNumner + " Marked as Duplicate");
                    }
                } else {
                    log.error("Error in Parsing File Name " + files[i].getAbsolutePath());
                }

                FileUtils.moveFileToDirectory(files[i], archiveDir, true);//Error comes on this line
                log.debug("SWIFT File " + files[i] + " archived in " + archiveDir.getAbsolutePath());
            } catch (IOException | NumberFormatException asd) {
                log.error("SWIFT Processing Error: " + asd.getMessage());
            }
        }
    }
}

最佳答案

试试这个:

FileInputStream fis = new FileInputStream(files[i])
byte[] message = IOUtils.toByteArray(fis);

并添加带有 fis 结尾的 finally 子句:

} catch (IOException | NumberFormatException asd) {
    log.error("SWIFT Processing Error: " + asd.getMessage());
} finally {
    fis.close()
}

关于java - 读取 Swift Message Prowide (WIFE) 后关闭 fileInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55607612/

相关文章:

java - 如何使 2 个服务器线程与 2 个客户端线程通信?

java - 输入流的skip方法总是返回0

java - 来自 Java 的 Oracle 轮询

java - 包含依赖项的 ClassNotFoundException

java - 使用 nextInt() 和 nextLine() 进行解析的区别

JAVA NullpointerException FileInputStream(文件文件)

java - 运行读取文件并对文件中的字符进行计数的程序会导致 FileNotFoundException

java - 在 Leiningen 项目的 Google Maven 存储库中找不到 Firebase jar

将文本文件的内容放入数组然后显示和操作数组内容的 Java 问题

java - BitmapFactory.decodeStream(stream, null, options) 时重用InputStream