2012-12-21 128 views
-1
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.nio.MappedByteBuffer; 
import java.nio.channels.FileChannel; 
import java.nio.charset.Charset; 
import java.util.ArrayList; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class Test6 implements Runnable { 

    private File file; 
    private int totalNumberOfFiles = 0; 
    private static int nextFile = -1; 
    private static ArrayList<String> allFilesArrayList = new ArrayList<String>(); 
    private static ExecutorService executorService = null; 

    public Test6(File file) { 
     this.file = file; 
    } 

    private String readFileToString(String fileAddress) { 
     FileInputStream stream = null; 
     MappedByteBuffer bb = null; 
     String stringFromFile = ""; 
     try { 
      stream = new FileInputStream(new File(fileAddress)); 
      FileChannel fc = stream.getChannel(); 
      bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()); 
      /* Instead of using default, pass in a decoder. */ 
      stringFromFile = Charset.defaultCharset().decode(bb).toString(); 
     } catch (IOException e) { 
      System.out.println("readFileToString IOException"); 
      e.printStackTrace(); 
     } finally { 
      try { 
       stream.close(); 
      } catch (IOException e) { 
       System.out.println("readFileToString IOException"); 
       e.printStackTrace(); 
      } 
     } 
     return stringFromFile; 
    } 

    private void toFile(String message, String fileName) { 
     try { 
      FileWriter fstream = new FileWriter("C:/Users/Nomi/Desktop/Workspace2/Test6/TestWritten/" + fileName); 
      System.out.println("printing to file: ".concat(fileName)); 
      BufferedWriter out = new BufferedWriter(fstream); 
      out.write(message); 
      out.close(); 
     } catch (Exception e) { 
      System.out.println("toFile() Exception"); 
      System.err.println("Error: " + e.getMessage()); 
     } 
    } 

// private void listFilesForFolder(final File fileOrFolder) { 
//  String temp = ""; 
//  if (fileOrFolder.isDirectory()) { 
//   for (final File fileEntry : fileOrFolder.listFiles()) { 
//    if (fileEntry.isFile()) { 
//     temp = fileEntry.getName(); 
//     toFile(readFileToString(temp), "Copy".concat(temp)); 
//    } 
//   } 
//  } 
//  if (fileOrFolder.isFile()) { 
//   temp = fileOrFolder.getName(); 
//   toFile(readFileToString(temp), "Copy".concat(temp)); 
//  } 
// } 

    public void getAllFilesInArrayList(final File fileOrFolder) { 
     String temp = ""; 
     System.out.println("getAllFilesInArrayList fileOrFolder.getAbsolutePath()" + fileOrFolder.getAbsolutePath()); 
     if (fileOrFolder.isDirectory()) { 
      for (final File fileEntry : fileOrFolder.listFiles()) { 
       if (fileEntry.isFile()) { 
        temp = fileEntry.getAbsolutePath(); 
        allFilesArrayList.add(temp); 
       } 
      } 
     } 
     if (fileOrFolder.isFile()) { 
      temp = fileOrFolder.getAbsolutePath(); 
      allFilesArrayList.add(temp); 
     } 
     totalNumberOfFiles = allFilesArrayList.size(); 
     for (int i = 0; i < allFilesArrayList.size(); i++) { 
      System.out.println("getAllFilesInArrayList path: " + allFilesArrayList.get(i)); 
     } 
    } 

    public synchronized String getNextFile() { 
     nextFile++; 
     if (nextFile < allFilesArrayList.size()) { 
//   File tempFile = new File(allFilesArrayList.get(nextFile)); 
      return allFilesArrayList.get(nextFile); 
     } else { 
      return null; 
     } 
    } 

    @Override 
    public void run() { 
     getAllFilesInArrayList(file); 
     executorService = Executors.newFixedThreadPool(allFilesArrayList.size()); 
     while(nextFile < totalNumberOfFiles) 
     { 
      String tempGetFile = getNextFile(); 
      File tempFile = new File(allFilesArrayList.get(nextFile)); 
      toFile(readFileToString(tempFile.getAbsolutePath()), "Copy".concat(tempFile.getName())); 
     } 
    } 

    public static void main(String[] args) { 
     Test6 test6 = new Test6(new File("C:/Users/Nomi/Desktop/Workspace2/Test6/Test Files/")); 
     Thread thread = new Thread(test6); 
     thread.start(); 
//  executorService.execute(test6); 
//  test6.listFilesForFolder(new File("C:/Users/Nomi/Desktop/Workspace2/Test6/")); 
    } 
} 

程序正在做預期的工作。它進入文件夾,抓取文件,將其讀入字符串,然後將內容寫入新文件。 我想這樣做多線程。如果文件夾有N個文件,我需要N個線程。如果可能的話,我也想使用執行器框架。我認爲可以沿着這條線有一個方法:多線程,讀取多個文件並寫入新文件

public synchronized void getAllFilesInArrayList() { 
     return nextFile; 
    } 

因此,每個新的線程可以選擇下一個文件。 謝謝你的幫助。

錯誤:

Exception in thread "Thread-0" java.lang.IllegalArgumentException 
    at java.util.concurrent.ThreadPoolExecutor.<init>(ThreadPoolExecutor.java:589) 
    at java.util.concurrent.ThreadPoolExecutor.<init>(ThreadPoolExecutor.java:480) 
    at java.util.concurrent.Executors.newFixedThreadPool(Executors.java:59) 
    at Test6.run(Test6.java:112) 
    at java.lang.Thread.run(Thread.java:662) 
+2

那麼,使其成爲多線程。有什麼問題?似乎你已經知道你應該做什麼。 –

+0

不,我不這樣做,所以我在這裏發佈。 –

+2

你說你需要N個線程,你說你想用executor框架。如果你不知道如何使用這些東西,請將它們放到Google上。您使用synchronized關鍵字的想法是正確的。繼續嘗試一下,看看你能做什麼,你可能會感到驚訝。如果您遇到新發現的知識有任何問題,請回來。 –

回答

2

首先,你的解決問題的方法將導致更多的同步和競爭狀況的擔憂比似乎有必要。一個簡單的策略,以防止你的線程競賽將是這樣的:

1)有一個調度線程讀取您的目錄中的所有文件名。

2)對於每一個文件,具有調度線程產生一個工作者線程和手頭寬裕的文件引用

3)有工作線程處理文件

4)請確保您有一些理智的命名約定你的輸出文件名,這樣你就不會讓線程覆蓋對方。

至於使用執行程序,ThreadPoolExecutor可能會正常工作。去看看javadoc:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

+0

我想我更喜歡你的方法。一些代碼會很好,請。謝謝。 –

+0

雖然我不需要gui。 –

+4

@NomanArain你已經有一些代碼了,Aurand基本上給了你四段僞代碼。不要總是期待一個完整的解決方案。這是StackOverflow,而不是「請爲我做我的工作」。 –