FTPClient and BufferedReader

4

我有一段代码,应该从FTP目录中的每个文本文档中读取每一行,但是只能对第一个文件起作用,因为当它处理第二个文件时,日志显示第二个文件也被列出,但是在尝试读取时就会崩溃。以下是代码:

public void getComments(){
        final FTPClient ftpClient = new FTPClient();
        BufferedReader reader = null;

        new Thread(new Runnable() {
            public void run() {
        try {
            ftpClient.connect(InetAddress.getByName("31.220.17.2"));
            ftpClient.login("mopedsho", "neppi1");
            int imageNr = sharedPreferences.getInt("ImageNrCross", 1);
            ftpClient.makeDirectory("/public_ftp/Comments/Cross/" + imageNr);
                    ftpClient.changeWorkingDirectory("/public_ftp/Comments/Cross/" + imageNr);
            String[] names = ftpClient.listNames();
            if (names == null) {


            } else {
                BufferedReader reader = null;
                for (String name : names) {
                    if (!name.equals(".") && !name.equals("..")) {
                        InputStream in = null;
                        try {
                            Log.e("File namer", name + "");

                            in = ftpClient.retrieveFileStream(name);
                            if (in != null) {
                                reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
                                String firstLine;
                                while ((firstLine = reader.readLine()) != null) {
                                    final String line = firstLine;
                                    Handler handler = new Handler(Looper.getMainLooper());
                                    handler.post(new Runnable() {

                                        @Override
                                        public void run() {
                                            adapter.add("" + line);

                                        }

                                    });

                                }
                            }
                            in.close();

                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
            }} catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }}
        }).start();}

错误代码:

07-14 13:50:27.739  20152-20298/com.emiliogaines.mopedshowcase E/File namer﹕ EmilioGaines4663767201961631433982.txt
07-14 13:50:28.166  20152-20298/com.emiliogaines.mopedshowcase E/File namer﹕ EmilioGaines4663767201961631535180.txt
07-14 13:50:28.306  20152-20298/com.emiliogaines.mopedshowcase E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-6657
    Process: com.emiliogaines.mopedshowcase, PID: 20152
    java.lang.NullPointerException: lock == null
            at java.io.Reader.<init>(Reader.java:64)
            at java.io.InputStreamReader.<init>(InputStreamReader.java:77)
            at com.emiliogaiines.mopedshowcase.commentLayout$2.run(commentLayout.java:140)
            at java.lang.Thread.run(Thread.java:818)
07-14 13:50:28.431  20152-20152/com.emiliogaines.mopedshowcase I/Ti

错误指向这一行。
reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));

我猜测你的输入流已经关闭了... - Anoop M Maddasseri
@AnoopM 嗯,我可以检索文件并从第一个开始阅读,不是吗?或者你的意思是什么? - Emilio Gaines
也许第二次? - Anoop M Maddasseri
请在您的代码中将该语句注释掉,这样我们就能看到您放置它的位置。您显然放错了位置。 - greenapps
差不多可以了。把它放在 } 的前面。作为 if (in != null) {} 块的最后一条语句。那应该就可以了。 - greenapps
显示剩余5条评论
1个回答

1
in = ftpClient.retrieveFileStream(name);

这行代码返回一个输入流,可能为null或未正确实例化。请检查该方法,并始终使用null检查,例如:

if(in != null)

如果您仍然遇到相同的异常,请提供上述方法的代码,以便我们找出问题所在。

我不再收到异常,但仍未读取第二个文件。 - Emilio Gaines
看起来你提到的代码没有问题。但是我怀疑**retrieveFileStream(name)**方法可能存在一些问题。请再次检查该方法,或者告诉我这个方法是做什么的,这样我可以帮助你。 - Manindar
它可以从FTP服务器中检索文件内容,而无需下载该文件。 - Emilio Gaines
在从流中读取时,您正在下载内容。否则,您如何在Android应用程序中查看它?您只是没有将内容保存到文件中。 - greenapps
我这里也遇到了同样的问题,你修复好了吗? - visionix visionix

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