如何将org.apache.commons.net.ftp.FTPFile转换为String?

3

我正在使用ftpClient.listFiles()从FTPClient检索文件列表,它返回一个带有正确文件名和适当数量的数组。

我试图从文件中读取内容,但只有ftpClient.retrieveFileStream(fileName)可用于此目的。而且它在读取第一个文件后会出现问题,并返回null。

是否有一种方法可以直接将FTPFile转换为字符串?

    ftp.connect();
            ftp.changeWorkingDirectoryToFrom();

            List<String> idsList = new ArrayList<String>();

            List<String> names = ftp.listFileNames();
            for (String fileName : names) {
                String content = fromFTPFileToString(fileName);
                Matcher matcher = FILES_PATTERN.matcher(content);
                String id = extractId(content);

                if (matcher.find()) {
                    boolean duplicate = idsList.contains(id);
                    LOG.info("MATCHED: " + fileName);
                    if (!duplicate) {
                        ftp.moveFileFromTo(fileName);
                        idsList.add(id);
                    } else {
                        LOG.info("DUPLICATE: " + fileName);
                        duplicated++;
                        ftp.deleteFileOnFromFtp(fileName);
                    }
                }
                processed++;
            }
            ftp.disconnect();

    private String fromFTPFileToString(String fileName) {
            String content = "";
            try {
                InputStream is = ftp.readContentFromFTPFile(fileName);
                StringWriter writer = new StringWriter();
                IOUtils.copy(is, writer, ENCODING);
                content = writer.toString();

                IOUtils.closeQuietly(is);
                IOUtils.closeQuietly(writer);
            } catch (Exception ex) {
                LOG.error(ex);
            }

            return content;
        }

void deleteFileOnFromFtp(String fileName) {
        changeWorkingDirectory(properties.getProperty(PropertiesType.FOLDER_FROM.toString()));
        deleteFile(fileName);
    }

    InputStream readContentFromFTPFile(String fileName) {
        changeWorkingDirectory(properties.getProperty(PropertiesType.FOLDER_FROM.toString()));
        InputStream inputStream = null;
        try {
            inputStream = ftpClient.retrieveFileStream(fileName);
        } catch (IOException ex) {
            LOG.error("Unable to extract content from file:" + O_Q + fileName + C_Q);
        }
        return inputStream;
    }

    void moveFileFromTo(String fileName) {
        String from = FORWARD_SLASH + properties.getProperty(PropertiesType.FOLDER_FROM.toString()) + FORWARD_SLASH + fileName;
        String to = FORWARD_SLASH + properties.getProperty(PropertiesType.FOLDER_TO.toString()) + FORWARD_SLASH + fileName;

        try {
            ftpClient.rename(from, to);
        } catch (IOException ex) {
            LOG.error("Unable to move file file from:" + O_Q + from + C_Q + " to: " + O_Q + to + C_Q);
            throw new RuntimeException(ex.getCause());
        }
    }

2
你能分享一下你目前的代码吗? - Mureinik
当我只使用moveFileFromTo时,它可以正常工作,但是当我尝试获取流时,任何第二个文件都会返回null。 - user2508615
如果您使用Java 7或更高版本,则IOUtils.closeQuietly是无用的。您可以使用try with resources语句。 - herau
1个回答

0

3个提示

1) 您可以使用retrieveFile

并将ByteArrayOutputStream用作第二个参数。 要从中获取字符串,只需使用“new String(baos.toByteArray(),[您使用的字符集]);”

2) 检查ftpClient.completePendingCommand();

如果仍有一些命令未完成

3) 我曾经遇到过类似的问题,设置ftp.enterLocalPassiveMode()有所帮助


这个对我有用。谢谢。我认为输入流存在问题,而输出流是正常的。 - user2508615

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接