我目前正在對用Java做,在谷歌AppEngine上的項目。寫入CSV文件,然後在AppEngine上(JAVA)荏苒它
AppEngine上不允許文件存儲,因此任何磁盤上表示對象不能被使用。其中一些包括File類。
我想寫的數據並將其導出到幾個CSV文件,然後壓縮它,並允許用戶下載。
如何我可以做到這一點不使用任何文件類?我在文件處理方面不是很有經驗,所以我希望你們能夠給我提供建議。
謝謝。
我目前正在對用Java做,在谷歌AppEngine上的項目。寫入CSV文件,然後在AppEngine上(JAVA)荏苒它
AppEngine上不允許文件存儲,因此任何磁盤上表示對象不能被使用。其中一些包括File類。
我想寫的數據並將其導出到幾個CSV文件,然後壓縮它,並允許用戶下載。
如何我可以做到這一點不使用任何文件類?我在文件處理方面不是很有經驗,所以我希望你們能夠給我提供建議。
謝謝。
如果你的數據不是巨大的,意義可以留在內存中,然後出口到CSV和壓縮和解並進行流式傳輸下載都可以上他們即時完成。緩存可以在任何這些步驟中完成,這些步驟很大程度上取決於應用程序的業務邏輯。
您可以創建一個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中。
嗨,謝謝你的幫助!這真的很有幫助。但你能告訴我你如何使用條紋框架來做到這一點嗎?另外,我怎樣才能專門完成這部分? Object mySerializer = new MySerializer(); //即csv-writer Object myData = getMyData(); – Adrian 2011-02-26 19:28:43
不,我沒有使用Strips框架,但可以隨時在論壇中提出另一個問題;如果你可以找到帶狀輸出流,這可能是你想要的。請參閱其他評論。 – ThomasRS 2011-02-27 04:17:55