2017-09-09 12 views
0

ここで示唆しているように、parallelStream()を使用してHTMLリンクを解析しています: Jsoup parsing - parsing multiple links simultaneouslyparallelStream()現在のインデックスを取得する方法

public static void createPageListByObject(String urlsFileName, int Y) throws IOException { 
     //List<String> URLs = new ArrayList<>(); 
     int indx = 1; 

     URLs.parallelStream().forEach(URL-> { 
     try { 
      Page page = Page.Generate(URL, Y); 
      FileUtils.writePageToFile(page, indx++); 
     }catch (Exception e){ 
      System.out.println(e.getMessage() + ". Skipping to next url"); 
     } 
    }); 

    public static Page Generate(String URL, int Y) throws IOException, InstantiationException, IllegalAccessException, NoSuchFieldException, URISyntaxException { 
    Connection.Response res = Jsoup.connect(URL).userAgent("Chrome/5.0").timeout(10 * 1000).execute(); 
    Page tutorialPage = new Page(URL); 
    return tutorialPage; 
} 

public static void writePageToFile(Page page, int i) throws IOException{ 
    String directoryName = getDirectory(page.vectorXY().Y); 
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(directoryName + "//page" + i)); 

    os.writeObject(page); 
    os.close(); 
} 

問題は、parallelStream()を使用すると時々同じインデックスが2回取得され、ファイルが上書きされることです。私は何らかの理由で現在のインデックスを取得する必要がありますparallelStreamが動作しています。 提案がありますか?

答えて

0

Javaイテレータの実装では、現在のインデックスが非表示になります。実際にはイテレータはインデックスなしで反復するために使用されます。

本当にインデックスが必要な場合は、URLとインデックスを含むオブジェクトのリストを作成します。これはサンプルを正しくカプセル化したものです。

だから、
class UrlObject { 
    private String url; 
    private Integer index; 
    public UrlObject(String url, Integer index){ 
    ..... 
    } 
    // getter and setter 
} 

あなたは

List<UrlObject> URLs = new ArrayList<>(); 
URLS.add(new URLObject("url here", <index here>)); 

URLs.parallelStream().forEach(url-> { 
    // code here url.getUrl() and url.getIndex() 
}); 

を使用して追加したり、あなたが他の方法を使用することができますリストに項目を追加します。

関連する問題