- 浏览: 218675 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
zzhyq:
有没有后台是ASHX 的呀
Ext.tree.TreePanel -
693593336:
谢谢作者分享,正好用上
Ext.tree.TreePanel -
greatwqs:
提供一个下载的demo不是更好
基于servlet的 Freemarker Demo
package netWorkMoreThreadCopy;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;
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.*;
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;
}
/**
*
*/
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;
}
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 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);
}
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);
}
}
}
}
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);
}
}
//来源文件
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);
}
}
发表评论
-
Singletons and lazy loading
2011-09-26 19:47 914The Java Memory Model # ... -
JVM blogs
2011-09-14 21:40 470话说是 【JVM详解的专题】,很多文章的差不多的,有的详 ... -
effective Java _Generic
2011-09-12 12:03 0#23 -
Class Loader
2011-08-28 16:47 774专栏合集(一):Java深度历险 pdf已上传1 ... -
Study Linkinginginginginginginging
2011-08-27 10:42 730#1 java 工程和类等路径汇总 #2 让Apac ... -
How to send Email
2011-08-26 15:32 6021.java mail 使用介绍 2.Java ... -
Java_Try_Finally
2011-07-18 11:51 641public class TestTryCatch { ... -
Java Class ClassLoader
2011-07-15 17:05 1027下午在看《Java 深度历险》,对Class & ... -
关键字 final & transient
2011-06-08 16:49 965final 详见: http://java.chinaitl ... -
课程设计3
2010-01-04 14:09 779题目3:动态分区式存储管理的存储分配和回收 一、设计目的 ... -
课程设计1
2010-01-04 14:24 748采用的是C++语言编写的,但PCB的数据结构是符合要求的。 ... -
os课程设计后感
2010-01-04 14:48 540今天终于把操作系统的实验给终结了。基本要求算是符合了,可能表 ... -
java作业01
2010-03-06 16:02 663package homework01; public cla ... -
Java作业02
2010-03-11 14:22 789package homework02; import jav ... -
File函数返回当前路径
2010-03-12 19:37 671package netWorkMoreThreadCopy; ... -
Java IO 转摘
2010-03-15 00:26 510java中的io中的(input/output)str ... -
java作业03
2010-03-17 00:59 696package homework03; import jav ... -
Java作业
2010-03-17 01:19 640package homework03;import java. ... -
java作業3
2010-03-18 18:36 592package homework03;/** 首先编写一个抽象 ... -
java作业04(第六章 字符串和正则表达式)
2010-03-20 00:01 1082有点无聊就先把第六章的两道贼简单的题目给做了。 packa ...
相关推荐
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库中的CWinThread类来实现多线程文件复制。MFC是微软提供的一种C++类库,它为Windows API提供了一种面向对象的封装,使开发者可以更容易地创建...
本文将深入探讨如何使用Delphi这一强大的RAD(快速应用开发)工具来实现多线程文件拷贝的功能。 Delphi是Embarcadero Technologies开发的一种面向对象的 Pascal 编程语言和集成开发环境,广泛用于桌面应用开发。多...
Java实现多线的文件复制(界面)。 可以选择复制文件的路径,和复制到某处的路径。可以选择线程数量。
在本文中,我们将深入探讨如何使用Qt和QML结合实现多线程的文件复制功能,并在复制过程中通过进度条实时显示进度。Qt是一个强大的C++框架,广泛用于开发跨平台的桌面、移动和嵌入式应用程序。QML是Qt的一个组成部分...
在IT领域,多线程操作共享文件是一项关键的技术,尤其在并发编程中。Delphi作为一款强大的面向对象的 Pascal 编程环境,提供了丰富的工具和类库来支持这样的任务。本压缩包“多线程操作共享文件.zip”显然是一个关于...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 框架来实现一个文件浏览器,并且重点讲解如何在其中实现文件拷贝功能,同时利用多线程技术提高程序性能。MFC 是 Microsoft 提供的一个C++库,它...
在处理耗时操作如大文件复制时,为了保持UI的响应性和避免阻塞主线程,多线程技术显得尤为重要。本项目以"qt 多线程实现样例,实现文件的拷贝"为主题,通过使用 Qt 的 QThread 类来创建和管理后台线程,从而实现在...
总的来说,实现“C++多线程文件分割”需要理解C++的多线程编程、文件I/O操作以及适当的同步机制。通过合理地分配任务给多个线程,可以显著提高文件处理的速度。而文件合并则可以利用文件系统的顺序读写优势,无需...
首先,我们需要创建一个MFC对话框类,这个类将作为我们的文件复制界面。在MFC中,可以使用`CDialog`或`CDialogEx`基类来创建自定义对话框。对话框上可能包含一些控件,如文本框显示复制进度,按钮启动和取消复制操作...
1. **多线程技术**:多线程是操作系统提供的一个核心特性,允许程序同时执行多个独立的执行路径。在文件传输系统中,每个线程可以负责一个文件的上传或下载,这样多个文件可以同时传输,显著提高了系统的吞吐量。...
在Android开发中,进行大文件下载时,为了提高效率并充分利用设备资源,通常会采用多线程下载技术。此外,为了提升用户体验,断点续传功能也显得尤为重要,尤其是在网络不稳定或者用户中断下载后,可以从上次停止的...
总之,"文件复制过程显示进度条"是一个涉及文件操作、用户界面反馈和进程管理的综合问题。通过VC++和MFC,我们可以创建一个能够实时显示复制进度的应用,从而提高用户在等待文件复制时的体验。这样的技术在日常的...
在编程领域,MFC(Microsoft ...总的来说,MFC线程复制文件程序充分利用了多线程的优势,实现了非阻塞式的文件操作,提高了用户体验。理解和掌握MFC中的线程管理对于编写高效且响应迅速的Windows应用程序至关重要。
【标题】"多线程文件管理器(SpeedRunner) v6.1 官方版" 是一款专为提升文件管理效率而设计的应用程序。这款软件以其高效和易用性著称,尤其适合需要频繁处理大量文件的用户。通过利用多线程技术,SpeedRunner能够...
本示例聚焦于MFC用户界面线程的创建,这是一个关键的技术,尤其是在需要进行长时间运行操作(如文件复制)同时保持用户界面响应性的场景。我们将探讨如何通过工作线程来执行耗时任务,并通过消息机制与用户界面线程...
最后,为了在用户界面中正确地处理这些操作,你需要在一个子线程(例如AsyncTask)中执行文件复制和进度更新,因为Android UI操作必须在主线程中进行。 总结起来,Android中的文件复制可以通过Java的I/O流实现,而`...
多线程下载的基本原理是将文件分割成若干个部分,每个部分由一个独立的线程负责下载,这样可以充分利用网络带宽,加快下载速度。 在易语言中,实现多线程下载主要涉及以下几个知识点: 1. **线程管理**:易语言...
使用多线程进行文件复制和进度显示,可以确保用户界面的响应性和流畅性,因为文件复制的耗时操作不会阻塞UI更新。这种方式在大型文件复制或者需要实时反馈的场合尤其有用。 在提供的压缩包文件`CopyFileByThread`中...
- **后台任务**:大批量文件复制时,一个线程处理复制操作,另一个线程更新进度条,防止阻塞用户界面。 三、Win32线程函数 Windows操作系统提供了丰富的API函数来管理和控制线程。例如`CreateThread`函数用于创建...