簡體   English   中英

CSV導出器的InputStream

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM