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

问题描述 投票:0回答:1

我正在阅读SWIFT消息(MT103)并将它们加载到数据库。之后我需要删除该文件,以避免在下一个周期中进行第二次解析。但它的接缝prowide不会在解析消息后自动关闭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());
            }
        }
    }
}
java inputstream fileinputstream swift-mt
1个回答
1
投票

试试这个:

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()
}
© www.soinside.com 2019 - 2024. All rights reserved.