Java教程

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

本文主要是介绍用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多线程。

源码下载

在这里插入图片描述

这篇关于用Java写一个备份文件的程序!的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!