java完成在復制文件時應用進度條(java完成進度條)。本站提示廣大學習愛好者:(java完成在復制文件時應用進度條(java完成進度條))文章只能為提供參考,不一定能成為您想要的結果。以下是java完成在復制文件時應用進度條(java完成進度條)正文
思緒剖析:
由於既要有操作面板又要有進度條,所以確定要湧現兩個繼續JFrame類的窗體。
先看被挪用的進度條窗體,它不須要手動操作,所以類的外部完成一個辦法便可以了。由於設計文件操作,所以要捕捉異常。起首依據要復制的文件創立File對象,和依據復制後文件的保留地址創立File對象,然後創立FileOutputStream對象,再創立FileInputStream對象,以後是ProgressMonitorInputStream對象,然後讀取文件,假如總耗時跨越2秒,將會主動彈出一個進度監督窗口。接上去界說byte數組,再應用while輪回讀取文件,應用FileOutputStream類的write()辦法經由過程流寫數據,再應用FileOutputStream類的close()辦法封閉輸入流,最初應用ProgressMonitorInputStream類的close()辦法封閉輸出流。可見該辦法須要三個參數:彈出它的父窗口、要復制的文件地址和要復制到的文件夾。
代碼以下:
ProgressMonitorTest.java:
package cn.edu.xidian.crytoll;
import java.io.FileInputStream;
import java.io.*;
import javax.swing.JFrame;
import javax.swing.ProgressMonitorInputStream;
public class ProgressMonitorTest {
public void useProgressMonitor(JFrame frame, String copyPath, String newPath) {
try {
File file = new File(copyPath); // 依據要復制的文件創立File對象
File newFile = new File(newPath); // 依據復制後文件的保留地址創立File對象
FileOutputStream fop = new FileOutputStream(newFile); // 創立FileOutputStream對象
InputStream in = new FileInputStream(file);
// 讀取文件,假如總耗時跨越2秒,將會主動彈出一個進度監督窗口。
ProgressMonitorInputStream pm = new ProgressMonitorInputStream(
frame, "文件讀取中,請稍後...", in);
int c = 0;
byte[] bytes = new byte[1024]; // 界說byte數組
while ((c = pm.read(bytes)) != -1) { // 輪回讀取文件
fop.write(bytes, 0, c); // 經由過程流寫數據
}
fop.close(); // 封閉輸入流
pm.close(); // 封閉輸出流
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
3. 再看主窗體。JLabel、JTextField神馬的就不消說了,選擇文件和選擇文件夾這兩個按鈕也是陳詞濫調了,最主要的是“開端復制”按鈕,將由它來擔任彈出這個進度條,這就須要開拓一個新的線程,所以主窗體不只要繼續JFrame類,還要完成Runnable接口。他年夜爺的。
4. 在開端復制按鈕的詳細辦法裡,起首創立一個Thread對象作為新的線程,然後挪用該對象的start()辦法,重載履行run()辦法,在該辦法中創立一個進度條對象,應用JTextField類的getText()辦法獲得要復制的文件地址和要復制到的途徑,然後挪用進度條類裡的辦法。
代碼以下:
package cn.edu.xidian.crytoll;
import java.awt.BorderLayout;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
public class UserMonitorFrame extends JFrame implements Runnable{
/**
*
*/
private static final long serialVersionUID = 8674569541853793419L;
private JPanel contentPane;
private JTextField fileField;
private JTextField searchTextField;
private JTextField replaceTextField;
private File file;
private JTextField textField;
private JTextField textField_1;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UserMonitorFrame frame = new UserMonitorFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public UserMonitorFrame() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 501, 184);
setTitle("在讀取文件時應用進度條");
getContentPane().setLayout(null);
JLabel label = new JLabel("\u6587\u4EF6\u5730\u5740\uFF1A");
label.setBounds(10, 10, 70, 15);
getContentPane().add(label);
textField = new JTextField();
textField.setBounds(90, 7, 300, 21);
getContentPane().add(textField);
textField.setColumns(10);
JButton button = new JButton("\u9009\u62E9\u6587\u4EF6");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_button_actionPerformed(e);
}
});
button.setBounds(400, 6, 93, 23);
getContentPane().add(button);
JLabel label_1 = new JLabel("\u590D\u5236\u5730\u5740\uFF1A");
label_1.setBounds(10, 40, 70, 15);
getContentPane().add(label_1);
textField_1 = new JTextField();
textField_1.setBounds(90, 38, 300, 21);
getContentPane().add(textField_1);
textField_1.setColumns(10);
JButton button_1 = new JButton("\u9009\u62E9\u5730\u5740");
button_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_button_1_actionPerformed(e);
}
});
button_1.setBounds(400, 39, 93, 23);
getContentPane().add(button_1);
JButton button_2 = new JButton("\u5F00\u59CB\u590D\u5236");
button_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_copyButton_actionPerformed(e);
}
});
button_2.setBounds(182, 69, 93, 23);
getContentPane().add(button_2);
}
protected void do_button_actionPerformed(ActionEvent e){
JFileChooser chooser=new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
// 顯示文件翻開對話框
int option = chooser.showOpenDialog(this);
// 肯定用戶按下翻開按鈕,而非撤消按鈕
if (option != JFileChooser.APPROVE_OPTION)
return;
// 獲得用戶選擇的文件對象
file = chooser.getSelectedFile();
// 顯示文件信息到文本框
textField.setText(file.toString());
}
protected void do_button_1_actionPerformed(ActionEvent e){
JFileChooser chooser=new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int option=chooser.showOpenDialog(this);
if(option!=JFileChooser.APPROVE_OPTION)
return;
file=chooser.getSelectedFile();
textField_1.setText(file.toString());
}
//肯定復制按鈕單擊事宜
protected void do_copyButton_actionPerformed(ActionEvent arg0) {
Thread thread = new Thread(this);
thread.start();
}
//運用多線程技巧完成讀取操作
@Override
public void run() {
ProgressMonitorTest test = new ProgressMonitorTest();
String path = textField.getText();
String save = textField_1.getText();
test.useProgressMonitor(this,path,save+path.substring(path.lastIndexOf("."),path.length()));
}
}