怎么把org.apache.commons.net.ftp.FTPFile转换成String?

时间:2014-05-23 16:10:36

标签: java apache-commons-net

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

我试图从文件中读取内容,但只有ftpClient.retrieveFileStream(fileName)可用于此目的。它在读取第一个文件后以某种方式中断并返回null。

有没有办法将FTPFile直接转换为String?

    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());
        }
    }

1 个答案:

答案 0 :(得分:0)

3提示

1)您可以使用retrieveFile

使用ByteArrayOutputStream作为第二个参数。 从中获取一个String只是“new String(baos.toByteArray(),[你使用的Charset]);”

2)检查ftpClient.completePendingCommand();

如果某些命令仍处于待处理状态

3)我曾经遇到类似问题设置ftp.enterLocalPassiveMode()帮助