2012-12-21 126 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,而不是“请为我做我的工作”。 –