轉帖|使用教程|編輯:龔雪|2014-06-20 09:52:46.000|閱讀 577 次
概述:Stream在Java 8中無處不在。你隨便看一下肯定就會發現它的身影。此文用示例講解如何用Java 8的流接口解析文件。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
Stream在Java 8中無處不在。你隨便看一下肯定就會發現它的身影。java.io.BufferedReader也不例外。在Java 8中使用Stream API來解析文件簡直太小兒科了。
我這有一個CSV文件要讀取。示例如下:
username;visited jdoe;10 kolorobot;4
我的讀取器會按照這樣的協議來讀取:文件頭是一個字符串列表,而記錄集是一個字符串列表的列表。讀取器接受一個java.io.Reader對象用為讀取來源。 先從讀取文件頭開始。讀取文件頭的算法如下: - 打開資源準備讀取。 - 讀取第一行然后解析 - 將行按分隔符分割。 - 將該行轉化成一個字符串列表后返回 下面是它的實現。
class CsvReader { private static final String SEPARATOR = ";"; private final Reader source; CsvReader(Reader source) { this(source); } List<String> readHeader() { try (BufferedReader reader = new BufferedReader(source)) { return reader.lines() .findFirst() .map(line -> Arrays.asList(line.split(SEPARATOR))) .get(); } catch (IOException e) { throw new UncheckedIOException(e); } } }
相當簡單,自我解釋型的。類似的,我創建了一個方法來讀取所有的記錄。讀取記錄的算法如下:
下面是它的實現:
class CsvReader { List<List<String>> readRecords() { try (BufferedReader reader = new BufferedReader(source)) { return reader.lines() .substream(1) .map(line -> Arrays.asList(line.split(separator))) .collect(Collectors.toList()); } catch (IOException e) { throw new UncheckedIOException(e); } } } 沒什么特別的。你會注意到兩個方法中的map是幾乎一樣的。事實上,它可以提取到一個變量里面: Function<String, List<String>> mapper = line -> Arrays.asList(line.split(separator)); 我寫了個測試來完成整個過程。 public class CsvReaderTest { @Test public void readsHeader() { CsvReader csvReader = createCsvReader(); List<String> header = csvReader.readHeader(); assertThat(header) .contains("username") .contains("visited") .hasSize(2); } @Test public void readsRecords() { CsvReader csvReader = createCsvReader(); List<List<String>> records = csvReader.readRecords(); assertThat(records) .contains(Arrays.asList("jdoe", "10")) .contains(Arrays.asList("kolorobot", "4")) .hasSize(2); } private CsvReader createCsvReader() { try { Path path = Paths.get("src/test/resources", "sample.csv"); Reader reader = Files.newBufferedReader( path, Charset.forName("UTF-8")); return new CsvReader(reader); } catch (IOException e) { throw new UncheckedIOException(e); } } }
原文出處:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網