1

给定目标的环境当前不可用,因此,我无法尝试,只能依靠分析!

我的目标可以分为以下不同的步骤:

  1. 使用愚蠢的“上传文件”页面上传巨大的文件(最大100GB) - 由于用户想要一个(愚蠢的)前端并且不愿意 ftp 文件等,因此无法逃脱。
  2. 提供上述前端的 Web 应用程序将托管在低端机器上 - 2GB RAM 和 40GB HDD,并且此 Web 应用程序不会在本地机器上存储大文件的任何部分,但必须“快速”将其写入高端远程Linux机器

对于每一步,我都会强调我的方法、关注点和疑问:

  • 我提到了这个让我感到困惑的线程,因为我计划使用带有上传页面的 Spring MVC 创建一个愚蠢的 Web 应用程序 - 我需要进入 HTML5 等还是一个简单的 Web 应用程序就足够了?

  • 给定 2GB RAM,Web 应用程序将获得少于 1GB 的内存。如果代码没有严格编写,我担心可能会出现“OutOfMemoryError” - 我必须确保从流中,一次必须读取一个小块,比如 10MB 并将其写入远程 Linux 机器的文件。假设我在 Controller Servlet 的 doPost(...) 中,我读了一些关于如何进行的阅读并感到困惑:

          /**
             * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
             *      response)
             */
            protected void doPost(HttpServletRequest request,
                    HttpServletResponse response) throws ServletException, IOException {
                // TODO Auto-generated method stub
    
                InputStream fis = request.getInputStream();
                int i = 0;
    
                /* Approach - 1 : Plain old byte-by-byte method */
                Socket socket = new Socket("192.168.90.20", 22);
                OutputStream remoteOpStream = socket.getOutputStream();
    
                while ((i = fis.read()) != -1) {
                    remoteOpStream.write(i);
                }
    
                /* clean-up */
    
                /* Approach - 2 : NIO */
                ByteBuffer byteBuff = ByteBuffer.allocate(10000);/* read 10MB of data */
    
                ReadableByteChannel rdbyc = Channels.newChannel(request
                        .getInputStream());
    
                File remoteFile = new File("192.168.90.20/Remote_Linux_Folder");/*
                                                                                 * Dunno
                                                                                 * how
                                                                                 * to
                                                                                 * create
                                                                                 * a
                                                                                 * File
                                                                                 * on a
                                                                                 * remote
                                                                                 * Linux
                                                                                 * machine
                                                                                 */
                FileOutputStream remoteFos = new FileOutputStream(remoteFile);
                FileChannel writableChannel = remoteFos.getChannel();
    
                while (true/* dunno how to loop till all the data is read! */) {
                    rdbyc.read(byteBuff);
                    writableChannel.write(byteBuff);
                }
    
                /* clean-up */
    
            }
    

我需要某种方式,其中本地机器上的数据存储最少 - 代码只是从输入流中读取 n 个字节并将其写入远程机器

我相信 NIO 是要走的路,但我无法确定我必须如何进行 - 请指导一下。

4

1 回答 1

0

我会实现一个 FixedSizeQueue 和 popAll() 数据从 QueueStream 到另一台计算机。可能有它双缓冲,只是为网络/带宽问题提供缓冲。

于 2012-09-19T17:55:46.057 回答