`

多线程文件复制(界面)1

    博客分类:
  • java
阅读更多
package netWorkMoreThreadCopy;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;

public class CopyFile implements Runnable {
//来源文件
private String sourceFileName;
//目标文件
private String targetFileName;
//分块总数
private int blockCount;
//开始COPY的块序号
private int blockNo;
//缓存大小
private int maxBuffSize=1024*1024;
/**
* 将sourceFileName文件分blockCount块后的第blockNo块复制至sourceFileName
* @param sourceFileName 来源文件全名
* @param targetFileName 目标文件全名
* @param blockCount 文件分块COPY数
* @param blockNo 开始COPY的块序号
*/
public CopyFile(String sourceFileName,String targetFileName,int blockCount,int blockNo)
{
this.sourceFileName=sourceFileName;
this.targetFileName=targetFileName;
this.blockCount=blockCount;
this.blockNo=blockNo;
}
public void run() {
//得到来源文件
File file=new File(sourceFileName);
//得到来源文件的大小
long size=file.length();
//根据文件大小及分块总数算出单个块的大小
long blockLenth=size/blockCount;
//算出当前开始COPY的位置
long startPosition=blockLenth*blockNo;
//实例化缓存
byte[] buff=new byte[maxBuffSize];
try{
//从源文件得到输入流
InputStream inputStream=new FileInputStream(sourceFileName);
//得到目标文件的随机访问对象
RandomAccessFile raf=new RandomAccessFile(targetFileName,"rw");
//将目标文件的指针偏移至开始位置
raf.seek(startPosition);
//当前读取的字节数
int curRedLength;
//累计读取字节数的和
int totalRedLength=0;
//将来源文件的指针偏移至开始位置
inputStream.skip(startPosition);
//依次分块读取文件
while((curRedLength=inputStream.read(buff))>0 && totalRedLength<blockLenth)
{
//将缓存中的字节写入文件?目标文件中
raf.write(buff, 0, curRedLength);
//累计读取的字节数
totalRedLength+=curRedLength;
}
//关闭相关资源
raf.close();
inputStream.close();
}catch(Exception ex)
{
ex.printStackTrace();
}
}
}
package netWorkMoreThreadCopy;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SwingForFun extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private Test test;
JPanel jp;
JTextField sourceFileName;
JTextField targetFileName;
JTextField blockCount; //分块数
JButton startCopy;
JTextField endTime;//显示所用的时间

JButton jb1=new JButton("浏览");
JButton jb2=new JButton("浏览");

public void setEndTime(JTextField endTime) {
this.endTime = endTime;
}
public JTextField getEndTime() {
return endTime;
}
int bb;

/*public static void main(String[] args) throws Exception {
new SwingForFun();
}*/

SwingForFun(Test test) throws Exception {
this.test=test;

this.setTitle("复制界面");
jp = new JPanel();
jp.setLayout(new GridLayout(4, 3,5,5));
addComponents(); //初始化面板!
this.setLayout(new BorderLayout());
this.add(new JLabel(" "), BorderLayout.NORTH);
this.add(new JLabel(" "), BorderLayout.SOUTH);
this.add(new JLabel(" "), BorderLayout.WEST);
this.add(new JLabel(" "), BorderLayout.EAST);
this.add(jp);
this.setVisible(true);
this.setLocation(300,300);
this.setSize(500, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void addComponents() {
JLabel jbsourceFile = new JLabel("源文件路径:", JLabel.CENTER);
JLabel jbtargetFile = new JLabel("目标文件路径:", JLabel.CENTER);
JLabel jbEndTime = new JLabel("进程数量:", JLabel.CENTER);
sourceFileName = new JTextField();
targetFileName = new JTextField();
blockCount=new JTextField();

endTime=new JTextField("共用时:__________");
endTime.setEditable(false);

/*jb1.setPreferredSize(new Dimension(20,20));
jb2.setPreferredSize(new Dimension(20,20));*/

startCopy = new JButton("开始复制");
jp.add(jbsourceFile);
jp.add(sourceFileName);
jp.add(jb1);
jp.add(jbtargetFile);
jp.add(targetFileName);
jp.add(jb2);
jp.add(jbEndTime);
jp.add(blockCount);
jp.add(new JLabel(""));

jp.add(startCopy);
jp.add(endTime);

jb1.addActionListener(this);
jb2.addActionListener(this);
startCopy.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==jb1){
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
sourceFileName.setText(chooser.getSelectedFile().getAbsolutePath());
}
}
if(e.getSource()==jb2){
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
targetFileName.setText(chooser.getSelectedFile().getAbsolutePath());
}
}

if (e.getSource() == startCopy) {
String sc = sourceFileName.getText().trim();
//返回字符串的副本,忽略前导空白和尾部空白
String tg =targetFileName.getText().trim();
//需对错误的路径填写进行判断。
System.out.println(sc+tg);
if(sc.compareTo("")==0||tg.compareTo("")==0||blockCount.getText().compareTo("")==0){
System.out.println("dd");
}else{
int num=Integer.parseInt(blockCount.getText());
test.getValues(sc, tg, num);
}
}
}
}
package netWorkMoreThreadCopy;
public class Test {
//来源文件
private static String sourceFile;
//目标文件
private static String targetFile;
//分块数
private static int blockCount;
//界面
private static SwingForFun sff;

public static void main(String[] args) {
Test t=new Test();
try {
sff=new SwingForFun(t);
} catch (Exception e1) {
e1.printStackTrace();
}
}
//取到界面中所填的值
public void getValues(String sc,String tg,int m){
sourceFile=sc;
targetFile=tg;
blockCount=m;

//记录开始时间
long beginTime=System.currentTimeMillis();
//依次分块进行文件COPY
for(int i=0;i<blockCount;i++)
{
//实例化文件复制对象
CopyFile copyFile=new CopyFile(sourceFile,targetFile,blockCount,i);
//实例化线程
Thread thread=new Thread(copyFile);
//开始线程
thread.start();
try
{
//加入线程
thread.join();
}
catch (Exception e) {
e.printStackTrace();
}
}
//计算耗时
long endTime=System.currentTimeMillis();
//输出耗时
//System.out.println("共用时:"+(endTime-beginTime)+"ms");
String str="共用时:"+(endTime-beginTime)+"ms";
sff.getEndTime().setText(str);
}
}
分享到:
评论

相关推荐

    FileCopy2.rar_MFC文件复制_mfc cwinthread_多线程复制_多线程类_文件复制MFC

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库中的CWinThread类来实现多线程文件复制。MFC是微软提供的一种C++类库,它为Windows API提供了一种面向对象的封装,使开发者可以更容易地创建...

    Delphi多线程实现文件拷贝

    本文将深入探讨如何使用Delphi这一强大的RAD(快速应用开发)工具来实现多线程文件拷贝的功能。 Delphi是Embarcadero Technologies开发的一种面向对象的 Pascal 编程语言和集成开发环境,广泛用于桌面应用开发。多...

    Java多线程文件复制器

    Java实现多线的文件复制(界面)。 可以选择复制文件的路径,和复制到某处的路径。可以选择线程数量。

    Qt + qml 多线程 实现文件复制 进度条显示复制进度

    在本文中,我们将深入探讨如何使用Qt和QML结合实现多线程的文件复制功能,并在复制过程中通过进度条实时显示进度。Qt是一个强大的C++框架,广泛用于开发跨平台的桌面、移动和嵌入式应用程序。QML是Qt的一个组成部分...

    多线程操作共享文件.zip

    在IT领域,多线程操作共享文件是一项关键的技术,尤其在并发编程中。Delphi作为一款强大的面向对象的 Pascal 编程环境,提供了丰富的工具和类库来支持这样的任务。本压缩包“多线程操作共享文件.zip”显然是一个关于...

    mfc文件浏览器实现文件拷贝功能多线程

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 框架来实现一个文件浏览器,并且重点讲解如何在其中实现文件拷贝功能,同时利用多线程技术提高程序性能。MFC 是 Microsoft 提供的一个C++库,它...

    qt 多线程实现样例,实现文件的拷贝

    在处理耗时操作如大文件复制时,为了保持UI的响应性和避免阻塞主线程,多线程技术显得尤为重要。本项目以"qt 多线程实现样例,实现文件的拷贝"为主题,通过使用 Qt 的 QThread 类来创建和管理后台线程,从而实现在...

    c++多线程文件分割

    总的来说,实现“C++多线程文件分割”需要理解C++的多线程编程、文件I/O操作以及适当的同步机制。通过合理地分配任务给多个线程,可以显著提高文件处理的速度。而文件合并则可以利用文件系统的顺序读写优势,无需...

    基于MFC多线程的CopyFile

    首先,我们需要创建一个MFC对话框类,这个类将作为我们的文件复制界面。在MFC中,可以使用`CDialog`或`CDialogEx`基类来创建自定义对话框。对话框上可能包含一些控件,如文本框显示复制进度,按钮启动和取消复制操作...

    基于多线程的文件传输系统

    1. **多线程技术**:多线程是操作系统提供的一个核心特性,允许程序同时执行多个独立的执行路径。在文件传输系统中,每个线程可以负责一个文件的上传或下载,这样多个文件可以同时传输,显著提高了系统的吞吐量。...

    Android多线程文件夹下载及断点续传

    在Android开发中,进行大文件下载时,为了提高效率并充分利用设备资源,通常会采用多线程下载技术。此外,为了提升用户体验,断点续传功能也显得尤为重要,尤其是在网络不稳定或者用户中断下载后,可以从上次停止的...

    文件复制过程显示进度条

    总之,"文件复制过程显示进度条"是一个涉及文件操作、用户界面反馈和进程管理的综合问题。通过VC++和MFC,我们可以创建一个能够实时显示复制进度的应用,从而提高用户在等待文件复制时的体验。这样的技术在日常的...

    MFC线程复制文件程序

    在编程领域,MFC(Microsoft ...总的来说,MFC线程复制文件程序充分利用了多线程的优势,实现了非阻塞式的文件操作,提高了用户体验。理解和掌握MFC中的线程管理对于编写高效且响应迅速的Windows应用程序至关重要。

    多线程文件管理器(SpeedRunner) v6.1 官方版.zip

    【标题】"多线程文件管理器(SpeedRunner) v6.1 官方版" 是一款专为提升文件管理效率而设计的应用程序。这款软件以其高效和易用性著称,尤其适合需要频繁处理大量文件的用户。通过利用多线程技术,SpeedRunner能够...

    MFC用户界面线程的创建示例

    本示例聚焦于MFC用户界面线程的创建,这是一个关键的技术,尤其是在需要进行长时间运行操作(如文件复制)同时保持用户界面响应性的场景。我们将探讨如何通过工作线程来执行耗时任务,并通过消息机制与用户界面线程...

    文件复制及进度条 android 文件复制 进度条 progressdialog

    最后,为了在用户界面中正确地处理这些操作,你需要在一个子线程(例如AsyncTask)中执行文件复制和进度更新,因为Android UI操作必须在主线程中进行。 总结起来,Android中的文件复制可以通过Java的I/O流实现,而`...

    易语言多线程下载源码

    多线程下载的基本原理是将文件分割成若干个部分,每个部分由一个独立的线程负责下载,这样可以充分利用网络带宽,加快下载速度。 在易语言中,实现多线程下载主要涉及以下几个知识点: 1. **线程管理**:易语言...

    在复制文件时显示进度条,用线程实现的

    使用多线程进行文件复制和进度显示,可以确保用户界面的响应性和流畅性,因为文件复制的耗时操作不会阻塞UI更新。这种方式在大型文件复制或者需要实时反馈的场合尤其有用。 在提供的压缩包文件`CopyFileByThread`中...

    多线程编程详解

    - **后台任务**:大批量文件复制时,一个线程处理复制操作,另一个线程更新进度条,防止阻塞用户界面。 三、Win32线程函数 Windows操作系统提供了丰富的API函数来管理和控制线程。例如`CreateThread`函数用于创建...

Global site tag (gtag.js) - Google Analytics