Java 8引入了Lambda表达式,流式的API,这里可以用这个新的东东来遍历文件夹。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import
org.apache.commons.logging.Log
;
import org.apache.commons.logging.LogFactory ; import java.io.IOException ; import java.nio.charset.Charset ; import java.nio.file.FileVisitOption ; import java.nio.file.Files ; import java.nio.file.Path ; import java.nio.file.Paths ; import java.util.ArrayList ; import java.util.List ; import java.util.stream.Stream ; /** * RecursiveFileLineReader * Created by Brian on 2014-05-26. */ public class RecursiveFileLineReader { private transient static final Log LOG = LogFactory. getLog (RecursiveFileLineReader. class ) ; /** * 取得所有指定扩展名的文件的非空行 * @param path the path to start recursion * @param extension the file extension * @return list of lines */ public static List <String > readAllLineFromAllFilesRecursively ( final String path, final String extension ) { final List <String > lines = new ArrayList <> ( ) ; //对于所有的文件 try ( final Stream <Path > pathStream = Files. walk (Paths. get (path ), FileVisitOption. FOLLOW_LINKS ) ) { //过滤出文件以及给定的扩展名 pathStream . filter ( (p ) -> !p. toFile ( ). isDirectory ( ) && p. toFile ( ). getAbsolutePath ( ). endsWith (extension ) ) //对每一个文件 读取每行的内容 . forEach (p -> fileLinesToList (p, lines ) ) ; } catch ( final IOException e ) { LOG. error (e. getMessage ( ), e ) ; } return lines ; } private static void fileLinesToList ( final Path file, final List <String > lines ) { try (Stream <String > stream = Files. lines (file, Charset. defaultCharset ( ) ) ) { //只读取非空行,加入到lines中 stream . map ( String ::trim ) . filter (s -> !s. isEmpty ( ) ) . forEach (lines ::add ) ; } catch ( final IOException e ) { LOG. error (e. getMessage ( ), e ) ; } } } |