2016-09-28 2 views
0

У меня есть класс, который копирует один файл из одной папки в другую:Получить позицию в канале файла

public class Foo extends JFrame{ 
    Timer t; 
    FileChannel inp = null, 
       outp= null; 
    File sourceFile = new File("C:/movies/movie.mkv"), 
      destFile = new File("C:/test/movie.mkv"); 
    long rec = 0; 
    long size; 
    LayoutManager manager = new MigLayout(); 
    public void createUI(){ 
     JPanel panel = new JPanel(); 
     JButton copyFile = new JButton("Copy file"); 
     JButton btn = new JButton("Start function"); 
     JButton stop = new JButton("Stop function"); 
     panel.setLayout(manager); 
     panel.add(btn); 
     panel.add(copyFile,"wrap"); 
     panel.add(stop); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setContentPane(panel); 
     this.setVisible(true); 
     this.setSize(400,400); 
     this.pack(); 
     btn.addActionListener((e)->{ 

      try { 
       inp = new FileInputStream(sourceFile).getChannel(); 
       outp = new FileOutputStream(destFile).getChannel(); 
       size = inp.size(); 
       outp.transferFrom(inp,0,size); 
      } catch (Exception e2) { 
       // TODO Auto-generated catch block 
       System.out.println("FIle not found"); 
       return; 
      } 
      t = new Timer(100,i->{ 
       try { 
        rec = outp.position(); 
       } catch (Exception e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
        rec = 0;     
       } 
       finally{ 
        System.out.println("Position in file:"+rec); 
       } 
      }); 
      t.start(); 
     }); 

    } 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(()->new Foo().createUI()); 
    } 
} 

Теперь у меня есть таймер Swing, что каждые 100 мс выводит на позицию в файле.

То, что я на самом деле пытаюсь сделать, это дать пользователю знать, сколько из файла было скопировано. Проблема в том, что каждые 100 мс число, которое выводится на моей консоли, это «Позиция в файле: 126089692».

Я хотел бы получить объяснение если возможно.

Спасибо за ваше время

ответ

0

Это происходит потому, что вы сначала скопировать весь файл (outp.transferFrom(inp,0,size);), а затем запускает таймер - в то время как работа делается уже. Попробуйте запустить таймер перед фактической передачей данных.

+0

я попробовал, но был один и тот же результат –

0

Метод transferFrom не выполняется асинхронно. Он уже завершен, когда запускается ваш таймер.

Рассмотрите возможность перемещения части try..catch (передача файла) в собственный поток, сначала запустите таймер, а затем передающую нить.

И BTW: интервал 100 мс слишком много для графического интерфейса. Увеличение его на все секунды или половину секунды более чем достаточно.

+0

Спасибо за ваш point.I попробовал то, что вы сделали, но без отсутствия вообще –

1

я нашел в https://docs.oracle.com/javase/8/docs/api/:

public abstract long transferFrom(ReadableByteChannel src, 
           long position, 
           long count) 
         throws IOException- 

«... Этот метод не изменяет положение этого канала ...»

Может быть, именно поэтому вы видите то же самое значение (я не сделал Проверь это).

Попробуйте заменить:

rec = outp.position(); 

по

rec = inp.position(); 
+0

звучит разумно – Antoniossss

Смежные вопросы