4

我的要求是从不同目录获取所需文件扩展名的文件列表,在获取文件本身时,我应该获取输入流并进行一些处理....我正在尝试获取具有所需文件扩展名的文件列表,然后我正在尝试从该列表中的所有选定文件中获取输入流。对于第一次迭代,我得到了所需的文件,并且我得到了一个文件的流,但是对于下一个文件,我得到一个空指针异常。我也无法从第二次迭代中获取文件列表

我用来测试的示例代码:

        System.out.println(ftp.printWorkingDirectory());
        boolean status = ftp
                .changeWorkingDirectory("mydirectory");
        System.out.println("Status of Change Directory:" + status);
        System.out.println(ftp.printWorkingDirectory());
        InputStream is = null;

        System.out.println(ftp.printWorkingDirectory());
        System.out.println(ftp.isConnected());

        FTPFile[] list2 = ftp.listFiles();
        System.out.println("Number of files in this directory:"
                + list2.length);
        for (int i = 0; i < list2.length; i++) {
            System.out.println("-------[" + list2[i].getName()
                    + "]---------------------");
            is = ftp.retrieveFileStream(list2[i].getName());
            int bytesRead = 0;
            byte[] buffer = new byte[1024];
            while ((bytesRead = is.read(buffer, 0, buffer.length)) > 0) {
                System.out.println(new String(buffer, 0, bytesRead));
            }
            //is.close();

            System.out.println("-------[END:" + list2[i].getName()
                    + "]---------------------");
        }

文件数显示为 3,并且“mydirectory”中的第一个文件被正确读取,但是当它尝试读取第二个文件时,它说空指针异常....另外,在我使用retrieveFileStream 方法读取流之后,如果我尝试打印当前工作目录,它给出空值但说它仍然连接....

如果我的代码中有一些错误,请告诉我......对我来说唯一的解决方法是连接到每个读取的输入流的 ftp 位置,这不是一件好事......

4

2 回答 2

7
  System.out.println(ftp.printWorkingDirectory());
        boolean status = ftp
                .changeWorkingDirectory("mydirectory");
        System.out.println("Status of Change Directory:" + status);
        System.out.println(ftp.printWorkingDirectory());
        InputStream is = null;

        System.out.println(ftp.printWorkingDirectory());
        System.out.println(ftp.isConnected());

        FTPFile[] list2 = ftp.listFiles();
        System.out.println("Number of files in this directory:"
                + list2.length);
        for (int i = 0; i < list2.length; i++) {
            System.out.println("-------[" + list2[i].getName()
                    + "]---------------------");
            is = ftp.retrieveFileStream(list2[i].getName());
            int bytesRead = 0;
            byte[] buffer = new byte[1024];
            while ((bytesRead = is.read(buffer, 0, buffer.length)) > 0) {
                System.out.println(new String(buffer, 0, bytesRead));
            }
            is.close();
            while(!ftpClient.completePendingCommand());
            System.out.println("-------[END:" + list2[i].getName()
                    + "]---------------------");
        }

while(!ftpClient.completePendingCommand()); 要完成文件传输,您必须调用 completePendingCommand() 并检查其返回值以验证成功。

有一些 FTPClient 方法不能完成整个 FTP 命令序列来完成事务。这些命令需要程序员在接收到肯定的中间命令后采取一些行动。程序员的代码完成其动作后,必须调用该方法来接收服务器的完成回复,并验证整个事务是否成功。这就是公共 API 所说的,http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#retrieveFileStream(java.lang.String)

于 2015-03-20T05:06:21.960 回答
0

我建议有两个优化。首先,我建议使用 FTPClient.listNames。这将返回一个字符串数组。其次,使用 IOUtils.readFully(inputStream) 返回文件中内容的字符串表示形式。

现在谈到手头的问题,我假设您正在 locl 被动模式下执行这些命令。将其包含在 ftp.retreiveFileStream 上方的代码中。

ftp.enterLocalPassiveMode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.setRemoteVerificationEnabled(false);
于 2012-11-12T23:12:14.097 回答