2011-02-26 58 views
4

我目前正在對用Java做,在谷歌AppEngine上的項目。寫入CSV文件,然後在AppEngine上(JAVA)荏苒它

AppEngine上不允許文件存儲,因此任何磁盤上表示對象不能被使用。其中一些包括File類。

我想寫的數據並將其導出到幾個CSV文件,然後壓縮它,並允許用戶下載。

如何我可以做到這一點不使用任何文件類?我在文件處理方面不是很有經驗,所以我希望你們能夠給我提供建議。

謝謝。

回答

3

如果你的數據不是巨大的,意義可以留在內存中,然後出口到CSV和壓縮和解並進行流式傳輸下載都可以上他們即時完成。緩存可以在任何這些步驟中完成,這些步驟很大程度上取決於應用程序的業務邏輯。

9

您可以創建一個zip文件,並添加到它,而用戶下載。如果您使用的是servlet,這是straigthforward:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    // ..... process request 

    // ..... then respond 
    response.setContentType("application/zip"); 
    response.setStatus(HttpServletResponse.SC_OK); 

    // note : intentionally no content-length set, automatic chunked transfer if stream is larger than the internal buffer of the response 
    ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream()); 

    byte[] buffer = new byte[1024 * 32]; 
    try { 
      // case1: already have input stream, typically ByteArrayInputStream from a byte[] full of previoiusly prepared csv data 

      InputStream in = new BufferedInputStream(getMyFirstInputStream()); 
      try { 
       zipOut.putNextEntry(new ZipEntry("FirstName")); 

       int length; 
       while((length = in.read(buffer)) != -1) { 
        zipOut.write(buffer, 0, length); 
       } 

       zipOut.closeEntry(); 
      } finally { 
       in.close(); 
      } 

      // case 2: write directly to output stream, i.e. you have your raw data but need to create csv representation 

      zipOut.putNextEntry(new ZipEntry("SecondName")); 

      // example setup, key is to use the below outputstream 'zipOut' write methods 
      Object mySerializer = new MySerializer(); // i.e. csv-writer 
      Object myData = getMyData(); // the data to be processed by the serializer in order to make a csv file 

      mySerizalier.setOutput(zipOut); 

      // write whatever you have to the zipOut 
      mySerializer.write(myData); 

      zipOut.closeEntry(); 

      // repeat for the next file.. or make for-loop 

     } 
    } finally { 
     zipOut.close(); 
    } 
} 

沒有理由來存儲文件數據,除非你有內存限制。文件爲你提供了InputStream和OutputStream,它們都有內存中的等價物。

請注意,創建一個csv編寫器通常意味着要做一些類似於this的操作,其中要點是獲取一段數據(數組列表或映射,無論您擁有什麼)並將其設置爲byte []部分。使用DataOutputStream(如果你喜歡的話)或OutputStreamWriter工具將字節[]部分追加到OutputStream中。

+0

嗨,謝謝你的幫助!這真的很有幫助。但你能告訴我你如何使用條紋框架來做到這一點嗎?另外,我怎樣才能專門完成這部分? Object mySerializer = new MySerializer(); //即csv-writer Object myData = getMyData(); – Adrian 2011-02-26 19:28:43

+0

不,我沒有使用Strips框架,但可以隨時在論壇中提出另一個問題;如果你可以找到帶狀輸出流,這可能是你想要的。請參閱其他評論。 – ThomasRS 2011-02-27 04:17:55