Chương trình copy file đơn giản[Console]

DucMjnh1992

Thành viên BQT
Staff member
Chương trình này chỉ đơn giản là copy 1 file từ nơi này sang nơi khác thôi không có gì cả, có thể hơi dài dòng và gà nên mong các bạn thông cảm, góp ý cho mình. Dưới đây là các class:

Class List lưu các byte đọc được từ 1 file lên Queue:

PHP:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package copyfile;

import java.util.LinkedList;
import java.util.Queue;

/**
 *
 * @author DucMjnh1992
 */
public class List
{
    private Queue list;
    private boolean check;

    public List()
    {
        this(new LinkedList<String>());
    }

    public List(LinkedList<String> list)
    {
        this.list = list;
        this.check = false;
    }

    public boolean getCheck()
    {
        return list.isEmpty() && check;
    }

    public void setCheck(boolean check)
    {
        this.check = check;
    }

    public synchronized byte getByte()
    {
        try
        {
            while(list.isEmpty())
            {
                wait();
            }
        }
        catch(Exception ex)
        {
        }

        return Byte.parseByte(list.poll().toString());
    }

    public synchronized void setByte(byte b)
    {
        this.list.offer(String.valueOf(b));
        
        notify();
    }
}
Class ReadĐọc 1 file và add các byte đó và List:

PHP:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package copyfile;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.File;

/**
 *
 * @author DucMjnh1992
 */
public class Read extends Thread
{
    private List list;
    private String path;

    public Read(String path)
    {
        list = new List();
    }

    public Read(List list, String path)
    {
        this.list = list;
        this.path = path;
    }

    @Override
    public void run()
    {
        readFile();
    }

    public void readFile()
    {
        try
        {
            File file = new File(path);

            if(file.exists())
            {
                DataInputStream dis = new DataInputStream(new FileInputStream(file));
                int n = dis.available();

                for(int i = 0; i < n; i++)
                {
                    list.setByte(dis.readByte());
                }

                list.setCheck(true);

                dis.close();
            }
            else
            {
                System.out.println("File not found!");
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
Class Write lấy các byte từ List ra để ghi:

PHP:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package copyfile;

import java.io.DataOutputStream;
import java.io.FileOutputStream;

/**
 *
 * @author DucMjnh1992
 */
public class Write extends Thread
{
    private List list;
    private String path;

    public Write(String path)
    {
        this(new List(), path);
    }

    public Write(List list, String path)
    {
        this.list = list;
        this.path = path;
    }

    @Override
    public void run()
    {
        writeFile();
    }
    
    public void writeFile()
    {
        try
        {
            DataOutputStream dos = new DataOutputStream(new FileOutputStream(path));

            while(!list.getCheck())
            {
                dos.writeByte(list.getByte());
            }

            dos.close();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
Class Main cho phép nhập đường dẫn và viết các hàm để copy:

PHP:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package copyfile;

import java.util.Scanner;

/**
 *
 * @author DucMjnh1992
 */
public class Main
{
    /**
     * @param args the command line arguments
     */

    public static String changePath(String pathStart)
    {
        return pathStart.substring(0, pathStart.lastIndexOf("\\") + 1);
    }

    public static String changePath(String path, String pathStart, String pathEnd)
    {
        return path.replace(pathStart, pathEnd);
    }

    public static void copy(String pathStart, String pathEnd)
    {
        List list = new List();
        Read read = new Read(list, pathStart);
        Write write = new Write(list, changePath(pathStart, changePath(pathStart), pathEnd));

        read.start();
        write.start();
    }
    
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        String pathStart = "";
        String pathEnd = "";

        System.out.print("Nhập đường đãn file: ");
        pathStart = input.nextLine();

        System.out.print("Nhập đường dẫn cần copy tới: ");
        pathEnd = input.nextLine();

        copy(pathStart, pathEnd);
    }
}
Trên đây là chương trình copy file dùng Thread để đọc và ghi đồng thời 1 file còn chương trình copy 1 thư mục thì mình sẽ post sau.
 
  • Like
Reactions: manhvv99

@Q_Q@

Member
22/3/11
200
4
18
DaNang
Ðề: Chương trình copy file đơn giản[Console]

Có vẻ hay đó down xem thử.
 

kirasasaki

New Member
14/7/11
22
0
0
Ðề: Chương trình copy file đơn giản[Console]

Ai giải thích cho mình đoạn code này đc k :< .
Mình ngâm nhiều r` nhưng vẫn chưa hiểu đc hết :( .
 

kirasasaki

New Member
14/7/11
22
0
0
Ðề: Chương trình copy file đơn giản[Console]

Thực ra do hiểu biết về lập trình của mình còn kém nên mình k hiểu nhiều thứ lắm .
Bạn cho mình yahoo đc không , để tiện hỏi cho dễ :D .
Với cả mình muốn hỏi là khi mình copy 1 file từ file này đến 1 chỗ khác thì nó tự động thêm tên của chính file vừa copy vào cuối cùng , bỏ cái đấy đi đc k bạn ? mình muốn tự rename hẳn cho nó luôn mà toàn bị thêm tên ở cuối cùng :)) . Bạn chỉ cho mình sửa ở đoạn nào với nhé :D
 

DucMjnh1992

Thành viên BQT
Staff member
Ðề: Chương trình copy file đơn giản[Console]

Thực ra do hiểu biết về lập trình của mình còn kém nên mình k hiểu nhiều thứ lắm .
Bạn cho mình yahoo đc không , để tiện hỏi cho dễ :D .
Với cả mình muốn hỏi là khi mình copy 1 file từ file này đến 1 chỗ khác thì nó tự động thêm tên của chính file vừa copy vào cuối cùng , bỏ cái đấy đi đc k bạn ? mình muốn tự rename hẳn cho nó luôn mà toàn bị thêm tên ở cuối cùng :)) . Bạn chỉ cho mình sửa ở đoạn nào với nhé :D
Khi copy hay move 1 tập tin thì tên của nó không thay đổi nên mình đã viết method để lấy lại tên của tập tin cũ vì thế bạn sẽ không đổi tên được. Nếu bạn muốn đổi tên khi copy thì bạn bỏ 2 phương thức changePath đi là được. Nhưng bạn phải kiểm tra tên của file ở đường dẫn thứ 2 và đuôi của nó nhé. :D
 

PhanVinh

New Member
29/9/11
8
2
3
Quận 7
Ðề: Chương trình copy file đơn giản[Console]

Mình có ý kiến . Sao không vừa đọc vừa ghi theo kiểu hàng đợi (queue) mà đọc hết tất cả vào 1 list rồi mới ghi ? nếu copy 1 file với dung lượng lớn cỡ vài trăm Gigabyte thì sẽ như thế nào bạn :(
 

DucMjnh1992

Thành viên BQT
Staff member
Ðề: Chương trình copy file đơn giản[Console]

Mình có ý kiến . Sao không vừa đọc vừa ghi theo kiểu hàng đợi (queue) mà đọc hết tất cả vào 1 list rồi mới ghi ? nếu copy 1 file với dung lượng lớn cỡ vài trăm Gigabyte thì sẽ như thế nào bạn :(
Bạn xem lại nhé! Có thể bạn chưa đọc kỹ chương trình đọc và ghi file đồng thời chứ đâu phải đọc xong mới ghi? Mình dùng 2 thread để vừa đọc vừa ghi mà. Chỉ có điều minh viết chương trình này từ khi mới học AJava chưa biết gì về GUI nên chạy trên Console hơi bất tiện. Mong bạn góp ý thêm, cảm ơn bạn.
 
  • Like
Reactions: manhvv99

tieutu_ht

New Member
24/3/11
6
0
1
Ðề: Chương trình copy file đơn giản[Console]

Có vẻ hay đây......
mình đang làm chương trình cắt ghép file...
Có thể dựa vào bài của bạn quá :-h
Thanks nhìu....
 
19/9/13
58
23
8
Bỏ class List đi bạn ah, rườm rà quá, và synchronize ở 2 hàm getByte và setByte cũng chẳng có ý nghĩa gì, vì chẳng có xung đột ở đây (có 2 tiến trình tranh nhau hàm setByte hoặc getByte), thay vào đó bạn tạo ra một mảng cho dễ nhìn.

Khi viết một chương trình copy file thì các bạn có thể kết hợp sử dụng bath script vói ưu điểm siêu tốc độ, không giới hạn file size.
ví dụ:
Code:
rem copyfile.bat
@echo off
Echo Giai phuong trinh bac 2
set /p src=Nhap duong dan file nguon:
set /p des=Nhap duong dan thu muc dich:
copy %src% %des%