diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF index 59499bc..680a1e2 100644 --- a/META-INF/MANIFEST.MF +++ b/META-INF/MANIFEST.MF @@ -1,2 +1,3 @@ Manifest-Version: 1.0 +Main-Class: com.company.Main diff --git a/src/com/company/FileVisitCounter.java b/src/com/company/FileVisitCounter.java index c36e9a8..f116b27 100644 --- a/src/com/company/FileVisitCounter.java +++ b/src/com/company/FileVisitCounter.java @@ -18,7 +18,10 @@ public long getCount() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (!MyThreads.isRun())return FileVisitResult.TERMINATE; + else { count++; - return FileVisitResult.CONTINUE; + return FileVisitResult.CONTINUE;} + } } diff --git a/src/com/company/KeyboardObserver.java b/src/com/company/KeyboardObserver.java new file mode 100644 index 0000000..b3e157a --- /dev/null +++ b/src/com/company/KeyboardObserver.java @@ -0,0 +1,82 @@ +package com.company; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.util.Queue; +import java.util.concurrent.ArrayBlockingQueue; + +/** + * Created by senior on 20.06.15. + */ +public class KeyboardObserver extends Thread { + private Queue keyEvents = new ArrayBlockingQueue(100); + + private JFrame frame; + + @Override + public void run() + { + frame = new JFrame("KeyPress Observer"); + frame.setTitle("JFrame"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + frame.setUndecorated(true); + frame.setSize(400, 400); + frame.setExtendedState(JFrame.MAXIMIZED_BOTH); + frame.setLayout(new GridBagLayout()); + + frame.setOpacity(0.0f); + frame.setVisible(true); + + frame.addFocusListener(new FocusListener() + { + @Override + public void focusGained(FocusEvent e) + { + //do nothing + } + + @Override + public void focusLost(FocusEvent e) + { + System.exit(0); + } + }); + + + frame.addKeyListener(new KeyListener() + { + + public void keyTyped(KeyEvent e) + { + //do nothing + } + + public void keyReleased(KeyEvent e) + { + //do nothing + } + + public void keyPressed(KeyEvent e) + { + keyEvents.add(e); + } + }); + } + + + public boolean hasKeyEvents() + { + return !keyEvents.isEmpty(); + } + + public KeyEvent getEventFromTop() + { + return keyEvents.poll(); + } + +} diff --git a/src/com/company/Main.java b/src/com/company/Main.java index 4e3ff2b..c1d2915 100644 --- a/src/com/company/Main.java +++ b/src/com/company/Main.java @@ -1,14 +1,16 @@ package com.company; +import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; public class Main { @@ -16,6 +18,9 @@ public class Main { public static void main(String[] args) throws IOException, InterruptedException { File fileR = new File(args[0]); File fileW = new File(args[1]); + KeyboardObserver keyboardObserver = new KeyboardObserver(); + keyboardObserver.start(); + boolean isDone = false; BufferedReader reader = new BufferedReader(new FileReader(fileR)); @@ -28,19 +33,48 @@ public static void main(String[] args) throws IOException, InterruptedException } ThreadGroup threadGroup = new ThreadGroup("myGroup"); + for (int i = 0; i < strings.size(); i++) { threads.add(new Thread(threadGroup,new MyThreads(strings.get(i), new FileVisitCounter(), fileW.getName()),String.valueOf(i+1))); } + ExecutorService pool = Executors.newFixedThreadPool(threads.size()); + List futures = new ArrayList<>(); + for (Thread t : threads) { - t.start(); + if (MyThreads.isRun()){ + futures.add(pool.submit(t)); + } + else{ + pool.shutdownNow(); + break; + } } - while (threadGroup.activeCount() > 0) { - Thread.sleep(1); - } - new MyCSVWriter(fileW.getName()).writerToCSV(); + while (!pool.isTerminated()) { + if (keyboardObserver.hasKeyEvents()) { + KeyEvent event = keyboardObserver.getEventFromTop(); + if (event.getKeyCode() == KeyEvent.VK_ESCAPE) { + pool.shutdownNow(); + new MyCSVWriter(fileW.getName()).writerToCSV(); + System.out.println("Запись завершена"); + break; + } + } + if (isDone) { + new MyCSVWriter(fileW.getName()).writerToCSV(); + System.out.println("Запись завершена"); + break; + } + for (Future f : futures) { + if (!f.isDone()) { + isDone = false; + break; + } + isDone = true; + } + } } diff --git a/src/com/company/MyThreads.java b/src/com/company/MyThreads.java index 9eb1a6a..3c2d16a 100644 --- a/src/com/company/MyThreads.java +++ b/src/com/company/MyThreads.java @@ -10,11 +10,16 @@ */ public class MyThreads implements Runnable { + private static boolean flag = true; private String path; private FileVisitCounter fileVisitor; private String fileForWrite; private long count; + public static boolean isRun() { + return flag; + } + public String getPath() { return path; } @@ -30,17 +35,25 @@ public MyThreads(String path, FileVisitCounter fileVisitor, String fileForWrite) } - @Override public void run() { Path p = new File(path).toPath(); try { Files.walkFileTree(p, fileVisitor); count = fileVisitor.getCount(); - System.out.println(Thread.currentThread().getName() + "\t" + this.getCount() + "\t" + this.getPath()); - new MyCSVWriter(fileForWrite).putResults(path,count); - } catch (IOException e) { + if (!Thread.currentThread().isInterrupted()) { + + System.out.println(Thread.currentThread().getName().charAt(Thread.currentThread().getName().length()-1) + "\t" + this.getCount() + "\t" + this.getPath()); + new MyCSVWriter(fileForWrite).putResults(path,count); + } + else { + flag = false; + System.out.println("Подсчет прерванн!"); + } + + + } catch (Exception e) { e.printStackTrace(); } diff --git a/src/com/company/test.txt b/src/com/company/test.txt index 78ea387..7ba8293 100644 --- a/src/com/company/test.txt +++ b/src/com/company/test.txt @@ -3,3 +3,6 @@ /home/senior/Видео /home/senior/Загрузки /lib +/media/senior/yyy/Windows +/media/senior/yyy/Program Files +/media/senior/yyy/Users \ No newline at end of file