給定目標的環境不是當前可用的,因此,我無法嘗試這些東西,只能依靠分析!使用網絡應用程序上傳大文件
我的目標可以分爲以下不同的步驟:
- 上傳大文件(高達100GB)用一個愚蠢的「上傳文件」頁 - 沒有逃離這是用戶希望(愚蠢的)前端,並不願意FTP文件等
- 提供上述前端的Web應用程序將託管在低端機器上 - 2GB RAM和40GB HDD,並且此Web應用程序不會存儲在本地機器上的巨大文件的任何部分,但必須「迅速」寫入到一個高端的遠程Linux機器
對於每一步,我強調我的做法,關注和疑問:
我提到this螺紋,其困惑我,因爲我正打算創建一個使用Spring MVC的帶有上傳一個愚蠢的Web應用程序頁面 - 我是否需要進入HTML5等或簡單的Web應用程序就足夠了?
鑑於2GB內存,Web應用程序將獲得小於1GB的內存。恐怕一個「OutOfMemoryError異常」是可能的,如果代碼不嚴格寫 - 我必須確保從流,一小塊,說10MB必須一次讀取和寫入遠程Linux機器的文件。 假設我在控制器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是去的方式,但我不能確定如何我一定要繼續 - 請指導一下。
無論是Sevlet API或標準的java.io.File IO提供無阻塞的API。在大多數O/S平臺的文件IO阻塞,但可以與非阻斷通道,但實際的IO當您執行它阻止使用(這只是太快,通常發現其中的差別,由於O/S高速緩衝存儲器等...)。如果你真的需要一個無阻塞的文件IO的設計外觀在AIO(異步I/O模型)不NIO。但是如果您的數據目的地是使用Socket的網絡,那麼NIO是正確的。 –