用Java写一个备份文件的程序!

用Java写一个备份文件的程序!

  • 核心项目
    -1.将文件夹压缩成zip文件
    -2.将文件复制至备份文件夹(这里是我的个人U盘)

目标文件:
在这里插入图片描述
Java文件
在这里插入图片描述
AutoBackup:

package program_2;

import java.awt.Color;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

//简单的txt文件复制
public class Autobackup {
	private static final int  BUFFER_SIZE = 2 * 1024;
    /**
     * 压缩成ZIP 方法1
     * @param srcDir 压缩文件夹路径 
     * @param out    压缩文件输出流
     * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构; 
     *                          false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
     * @throws RuntimeException 压缩失败会抛出运行时异常
     */
    public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)
            throws RuntimeException{    
        long start = System.currentTimeMillis();
        ZipOutputStream zos = null ;
        try {
            zos = new ZipOutputStream(out);
            File sourceFile = new File(srcDir);
            compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);
            long end = System.currentTimeMillis();
            System.out.println("压缩完成,耗时:" + (end - start)/1000 +" s.");

        } catch (Exception e) {
            throw new RuntimeException("zip error from ZipUtils",e);
        }finally{
            if(zos != null){
                try {
                    zos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
	private static void compress(File sourceFile, ZipOutputStream zos, String name,
            boolean KeepDirStructure) throws Exception{
        byte[] buf = new byte[BUFFER_SIZE];
        if(sourceFile.isFile()){
            // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
            zos.putNextEntry(new ZipEntry(name));
            // copy文件到zip输出流中
            int len;
            FileInputStream in = new FileInputStream(sourceFile);
            while ((len = in.read(buf)) != -1){
                zos.write(buf, 0, len);
            }
            // Complete the entry
            zos.closeEntry();
            in.close();
        } else {
            File[] listFiles = sourceFile.listFiles();
            if(listFiles == null || listFiles.length == 0){
                // 需要保留原来的文件结构时,需要对空文件夹进行处理
                if(KeepDirStructure){
                    // 空文件夹的处理
                    zos.putNextEntry(new ZipEntry(name + "/"));
                    // 没有文件,不需要文件的copy
                    zos.closeEntry();
                }
            }else {
                for (File file : listFiles) {
                    // 判断是否需要保留原来的文件结构
                    if (KeepDirStructure) {
                        // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
                        // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
                        compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
                    } else {
                        compress(file, zos, file.getName(),KeepDirStructure);
                    }  
                }
            }
        }
    }
}

Main文件:

package program_2;
import java.awt.Color;
import java.awt.Desktop;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

class Thread_1 extends Thread {
	private String title;
	public Thread_1(String title) {
		this.title = title;
	}
	@Override
	public void run() {
		{
			JFrame jf = new JFrame("备份网站至U盘");
			jf.setSize(515, 500);
			jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			JPanel jp = new JPanel();
			jp.setBackground(Color.black);
			jp.setLayout(null);
			JTextArea ja = new JTextArea();
			ja.setLineWrap(true);
			ja.setBackground(Color.white);
			ja.setForeground(Color.black);
			//这个表示,自动换行,也就是说,你不加水平滚动条的情况下,一行写满会自动跳转到下一行。
			JScrollPane js = new JScrollPane(ja);
			js.setSize(500, 500);
			js.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
			js.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
			jp.add(js);
			jf.setContentPane(jp);
			jf.setVisible(true);
			long start = System.currentTimeMillis();
			File file = new File("D:\\YaoBoYu\\backups\\wwwyaoserveronline.zip");
			file.delete();
			File file1 = new File("E:\\2Website");
			File result[] = file1.listFiles();
			int x = result.length + 1; 
			Date date = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd");
			ja.setText("\n开始压缩...");
			String str = sdf.format(date);
			System.out.println("开始压缩...");
			try {
			FileOutputStream fos1 = new FileOutputStream(new File("D:\\YaoBoYu\\backups\\wwwyaoserveronline.zip"));
	        Autobackup.toZip("D:\\YaoBoYu\\wwwyaoserveronline", fos1, true);
			} catch (IOException ioe) {
				System.out.println("压缩失败!");
			}
			ja.append("\n压缩完成,即将开始复制...");
			ja.append("\n开始复制...");
	        System.out.println("开始复制...");
			try (
					// 创建字节输入流
					FileInputStream fis = new FileInputStream("D:\\YaoBoYu\\backups\\wwwyaoserveronline.zip");
					// 创建字节输出流
					FileOutputStream fos = new FileOutputStream("E:\\2Website\\wwwyaoserveronline" + str + "type"+ x +".zip")) {
				byte[] bbuf = new byte[32];
				int hasRead = 0;
				// 循环从输入流中取出数据
				while ((hasRead = fis.read(bbuf)) > 0) {
					// 每读取一次,即写入文件输出流,读了多少,就写多少。
					fos.write(bbuf, 0, hasRead);
				}	
				
			} catch (IOException ioe) {
				ioe.printStackTrace();
				ja.append("\n复制失败,可能是检测不到U盘!");
				System.err.println("复制失败,可能是检测不到U盘!");
			}
			long end = System.currentTimeMillis();
			ja.append("\n复制备份完成(目标地址:E:\\2Website),总花费时间:" + (end - start)/1000 + "s.");
			System.out.println("复制备份完成(目标地址:E:\\2Website),总花费时间:" + (end - start)/1000 + "s.");
		   try {
			   Desktop.getDesktop().open(new File("E:\\2Website"));
		   } catch (IOException e) {
			   e.printStackTrace();
		   }
		}
	}
}
public class Main {
	public static void main(String[] args) throws Exception {
		new Thread_1("A0001").start();
		
	}
}

运用GUI,使其更加人性化,
为了满足以后可能会添加其他功能所以这里用的是java多线程。

源码下载

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java文件夹复制(远程复制(网络传输),用于远程备份文件)(支持文件夹,嵌套子文件夹) import java.io.*; import java.util.*; public class FileSelection { private File rootDirectory;//根目录 private File[] fileList;//文件目录下面的文件列表(包括目录,用于多次判断) private ArrayList fileArrayList; // 用于存储文件(只是文件)列表 //初始化参数 public FileSelection() { fileArrayList=new ArrayList(); rootDirectory = new File("Test"); rootDirectory.mkdir(); } //获得文件(不包括目录)的列表 public void initFileArrayList() { if (rootDirectory.isDirectory()) { //遍历目录下面的文件和子目录 fileList = rootDirectory.listFiles(); for (int i = 0; i < fileList.length; i++) { //如果是文件,添加到文件列表中 if(fileList[i].isFile()){ fileArrayList.add(fileList[i]); } //否则递归遍历子目录 else if (fileList[i].isDirectory()) { fileList[i].mkdir(); rootDirectory=fileList[i]; initFileArrayList(); } } } } //将文件信息添加到列表中 public void addFiles(File f){ fileArrayList.add(f); } //访问器返回文件列表 public ArrayList getFileArrayList() { return fileArrayList; } } -------------------- BackupClient.java package com.xinxin.Client; import java.io.*; import java.net.*; /** * * @author Administrator *@version 1.0 *BackupClient类实现文件的传输到服务器 */ public class BackupClient implements Runnable{ private int port;//服务器端口 private InetAddress ipAddress;//服务器IP地址 private Socket clientSocket;//客户端套接字 private InputStream inputStream;//网络输入流 private OutputStream outputStream;//网络输出流 private File file; //构造函数(获得服务器端IP地址和监听端口号) public BackupClient(InetAddress ipAddress,int port,File file){ this.ipAddress=ipAddress; this.port=port;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spasol

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值