[英]InputStream for CSV exporter
我有以下方法:
public String exportAsCsv(CqlQuery query) {
Iterator<String> result = queryService.execute(.....);
StringBuilder buf = new StringBuilder();
for (String nextLine : result) {
buf.append(nextLine);
}
return buf.toString();
}
它執行一些返回Iterator<String>
查詢-它包含千兆字節的數據,因此將其附加到StringBuilder
並不是最好的主意...
我想更改我的方法,使其改為返回InputStream
。
這可能是一種可能的實現(偽代碼):
public InputStream exportAsCsv(CqlQuery query) {
final Iterator<String> result = queryService.execute(query,false);
return new MagicalInputStream(){
@Overwrite
byte[] readNext() {
if(!result.hasNext()) {
return null;
} else {
return result.next().getBytes();
}
}
}
}
我正在尋找InputStream
,我必須在其中實現抽象方法(例如byte[] readNext()
),該方法將用於讀取數據塊-一對一。 因此,此輸入流必須緩沖讀取的塊,然后將其流回,並且當其緩沖區為空時,它應該讀取下一個塊。 這個想法是,只有當“客戶端”從輸入流中獲取下一個字節時,我才從Iterator中讀取next元素。
或者有可能是另一種可能改變我的方法,因此,它並返回InputStream
而不是String
-任何想法?
如果允許您的方法接受java.io.Writer
則可以避免整個InputStream
實現。 無需將字符串附加到內存中的StringBuilder
,而是將它們附加到提供的Writer中。
public void exportAsCsv(CqlQuery query, Writer writer) {
Iterator<String> result = queryService.execute(.....);
for (String nextLine : result) {
writer.append(nextLine);
}
}
但是,如果您確實需要InputStream,可以嘗試執行以下操作:
public InputStream exportAsCsv(CqlQuery query) {
Iterator<String> result = queryService.execute(.....);
return new SequenceInputStream(asStreamEnum(result));
}
private Enumeration<InputStream> asStreamEnum(final Iterator<String> it) {
return new Enumeration<InputStream>() {
@Override
public boolean hasMoreElements() {
return it.hasNext();
}
@Override
public InputStream nextElement() {
try {
return new ByteArrayInputStream(it.next().getBytes("UTF-8"));
} catch (UnsupportedEncodingException ex) {
throw new RuntimeException(ex);
}
}
};
}
我尚未實際測試過這種方法,因此請注意。 不過,從概念上講,我認為這就是您所追求的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.