2015-03-02 24 views

Trả lời

10

DirectoryStream không phải là một Stream (nó đã ở đó kể từ Java 7, trước khi con suối api đã được giới thiệu trong Java 8) nhưng nó thực hiện các giao diện Iterable<Path> vì vậy bạn có thể viết:

try (DirectoryStream<Path> ds = ...) { 
    Stream<Path> s = StreamSupport.stream(ds.spliterator(), false); 
} 
+5

Lưu ý rằng 'List' tồn tại trước suối là tốt, tuy nhiên họ đã thêm 'asStream()' để đó;) – Thirler

+1

Note @ câu trả lời Holger của dưới đây - bạn có thể tránh chuyển đổi nếu bạn nhận được một dòng suối trực tiếp với 'tập tin .newDirectoryStream (Đường dẫn) '. –

2

DirectoryStream có một phương pháp mà trả về một spliterator. Vì vậy, chỉ cần làm:

Stream<Path> stream = StreamSupport.stream(myDirectoryStream.spliterator(), false); 

Bạn có thể muốn xem câu hỏi này, về cơ bản vấn đề của bạn giảm xuống: How to create a Stream from an Iterable.

22

Mặc dù có thể chuyển đổi DirectoryStream thành Stream bằng phương pháp spliterator của mình, không có lý do nào để làm như vậy. Chỉ cần tạo một số Stream<Path> ngay từ đầu.

Ví dụ: thay vì gọi Files.newDirectoryStream(Path) chỉ cần gọi Files.list(Path).

Các tình trạng quá tải của newDirectoryStream mà chấp nhận thêm một Filter có thể được thay thế bằng Files.list(Path).filter(Predicate) và có những hoạt động bổ sung như Files.findFiles.walk trả lại một Stream<Path>, tuy nhiên, tôi không tìm thấy một sự thay thế cho trường hợp bạn muốn sử dụng “glob pattern”. Điều đó có vẻ là trường hợp duy nhất khi dịch DirectoryStream thành Stream có thể hữu ích (tôi thích sử dụng cụm từ thông dụng hơn nữa)…

0

Dưới đây là một ví dụ khác chạy thành công trên nền tảng Windows.

import java.nio.file.DirectoryStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

//Using compiler java ver 1.7 
class A { 
    public static void main(String[] args) throws Exception 
    { 
     //Tested on dos directory system 
     Path dir = Paths.get("c:\\a\\b\\"); 

     /** 
     * 
     * This try with exceptions block attempts to open the specified 
     * directory. 
     * 
     */ 
     try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) 
     { 
      // This enhanced for loop block iterates through the specified 
      // directory and outputs each filename 
      for(Path p: stream) 
      { 
       System.out.println(p.getFileName()); 
      } 

     } 
     catch(Exception e) 
     { 
      System.out.println("problems locating directory"); 
     } 
    } 
} 
Các vấn đề liên quan