【问题标题】:What is the accurate way to read/download a file from the server (in Java)?从服务器(Java)读取/下载文件的准确方法是什么?
【发布时间】:2015-05-13 10:26:08
【问题描述】:

在我的客户端-服务器应用程序中,我使用命令 (GET filename) 将文件下载到客户端。我已经使用read() 方法中的构建来读取文件。我的老师说实施这种read 方法不是一个很好的做法。原因是它不能告诉文件从服务器读取的准确程度,或者它无法下载动态(大)文件大小。但目前我看到它工作正常。由于我仍处于 Java 中级水平,因此我需要学习完成这项工作的最佳方法。如何在编码方面进行改进?那就是我想改进ClientSide中的while looping部分。

我已经粘贴了相关代码:

客户端:

                         ............
                         ............
                        if (request.startsWith("GET")) {
                        File file = new File(request.substring(4));
                        is = socket.getInputStream();
                        fos = new FileOutputStream(file);

                        byte[] buffer = new byte[socket.getReceiveBufferSize()];
                        int bytesReceived = 0;

                        while ((bytesReceived = is.read(buffer)) >=0) {
                            //while ((bytesReceived = is.read(buffer))>=buffer) {
                            fos.write(buffer, 0, bytesReceived);
                        }
                        request = "";
                        fos.close();
                        is.close();
                    }
                       .................
                       .................

服务器端:

                          .................
                          .................
else if (request.startsWith("GET")) {
                        System.out.println("");
                        String filename = request.substring(4);
                        File file = new File(System.getProperty("user.dir"));
                        File[] files = file.listFiles();

                        if (fileExists(files, filename)) {
                            file = new File(filename);
                            int fileSize = (int) file.length();
                            outputToClient.print("Status OK\r\n"
                                    + "Size " + fileSize + "KB" + "\r\n"
                                    + "\r\n"
                                    + "File " + filename + " Download was successfully\r\n");
                            outputToClient.flush();
                            // reading files
                            fis = new FileInputStream(file);
                            os = socket.getOutputStream();
                            byte[] buffer = new byte[2^7-1];
                            int bytesRead = 0;
                            while ((bytesRead = fis.read(buffer))!= -1) {
                                os.write(buffer, 0, bytesRead);
                            }
                            os.close();
                            fis.close();
                        } else {
                            outputToClient.print("Status 400\r\n"
                                    + "File " + filename + " not found\r\n"
                                    + "\r\n");
                            outputToClient.flush();
                        }
                    }
                    outputToClient.flush();
                }
                           .................
                           .................

【问题讨论】:

  • 你在谷歌上搜索过这个问题吗?
  • 兰吉特,是的。但没有找到任何相关信息。如果您有更好的建议,请帮助我,特别是在客户端的 while 循环中。
  • 您知道 java 中如何处理客户端-服务器通信吗?
  • 兰吉特,是的。我是。
  • 你的代码对我来说看起来不错,但你知道你的老师为什么这么说......你问过原因吗

标签: java file-io while-loop client-server bufferedreader


【解决方案1】:

如果你还没有这样做的话,你需要通过阅读直到你得到一个空行来消耗其余的 HTTP 响应头。

除此之外,您的代码在我看来还不错,只是我会使用比 127 大得多的缓冲区,至少 8192,可能是它的倍数。

问问你的老师他到底在说什么。

【讨论】:

  • EJP,感谢您的关注。他的意思是不要有内置的读取方法,而是我应该手动创建一个读取方法。
  • 嗯?您迟早必须调用内置的 read() 方法。关于“无法下载大型(动态)文件大小”的部分也是 BS。我看不出重点。告诉他读我的书。
  • EJP,非常好。你说的对。但我对这个问题感到沮丧。我真的不知道如何以另一种方式完成循环。我想这就是我老师想要的。好的,我需要你的书。
  • Pitt,Java 基础网络, Springer 2005 (?)。有许多方法可以编写复制循环,但我一直更喜欢你这样做的方式。我希望你的老师对如何编写循环有更高层次的关注,但我不知道它可能是什么。迟早你还是要写这个循环,或者它的另一种形式。请注意,“它不能准确说明文件是如何从服务器读取的”的说法也是废话,或者毫无意义,除非他在谈论某种形式的进度指示器,这很容易构建 到 这个循环。
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 2013-02-03
  • 2011-09-28
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多