IO文件管理

最近写了一个有关文件拷贝,删除,添加,以及关键字替换。

图形如下:
这里写图片描述

其中需要注意几点:

  1. 文件操作与文件夹操作略有不同。文件可以直接处理,而文件夹需要遍历它的子文件file.listFiles())。
  2. 流不能帮我们创建根文件夹。我们自己创建(file.mkdirs())。
  3. 一个文件夹的路径不能用来创建一个文件(后缀名不一样)。我们可以选择在文件夹路径末端添加要创建的文件的名字,即根据文件夹路径创建它的子文件new File(destFile, name))。
public void copyFolder(File srcFile, File destFile) {
        if (srcFile != null && srcFile.exists()) { // 保证了数据的合法性
            if (srcFile.isDirectory()) { // 判断是文件还是目录
                if (!destFile.exists()) { // 流不能帮我们创建根文件夹
                    destFile.mkdirs(); // 可能不存在的根文件夹有多个
                } else {
                    File[] listFiles = srcFile.listFiles(); // 遍历文件夹底下的目录,得到他的子文件
                    for (File file : listFiles) {
                        String name = file.getName();
                        File newFile = new File(destFile, name); // 目标文件路径发生变化,因为源文件已经开始遍历走向底层
                        copyFolder(newFile, destFile); // 一定是调用用自己
                    }
                }
            } else {
                copyFile(srcFile, destFile);
            }
        }
    }

4.文件读取可能会出现乱码问题(BufferedReader),因为我的ecl文件是gbk的 ,所以项目也应该对应是gbk。

BufferedReader br = new BufferedReader(new InputStreamReader(fis, "gbk"));

5.源码:

package io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class copy_file {

    /**
     * 文件的拷贝 函数的重载
     * 
     * @param src
     *            源路径
     * @param dec
     *            目的路径
     */
    public void copyFile(String src, String dec) {
        copyFolder(new File(src), new File(dec)); // 把路径变成文件
    }

    /**
     * 文件拷贝
     * 
     * @param srcFile
     *            源文件
     * @param decFile
     *            目的文件
     */
    public void copyFile(File srcFile, File decFile) {
        FileInputStream fis = null; // 定义
        FileOutputStream bis = null;
        try {
            fis = new FileInputStream(srcFile); // 初始化
            bis = new FileOutputStream(decFile);

            byte[] re = new byte[1024]; // 数组长度最好为1024,2048,(即1024的倍数)
            int sum = fis.read(re); // 返回的是有效的字节数,当读到文件末尾,返回-1

            while (sum != -1) {
                bis.write(re, 0, sum); // 防止写入非有效的字节
                sum = fis.read(re); // sum一定要重新赋值 不然死循环了
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally { // 各种异常导致的无法关流,正确的关流操作
            try {
                if (bis != null) { // 避免了空指针异常
                    bis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                bis = null; // 赋值为null,交给gc处理
            }
            try {
                if (fis != null) { // 避免了空指针异常
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                fis = null; // 赋值为null,交给gc处理
            }
        }
    }

    /**
     * 拷贝文件夹
     * 
     * @param srcFile
     *            源文件
     * @param destFile
     *            目的文件
     */
    public void copyFolder(File srcFile, File destFile) {
        if (srcFile != null && srcFile.exists()) { // 保证了数据的合法性
            if (srcFile.isDirectory()) { // 判断是文件还是目录
                if (!destFile.exists()) { // 流不能帮我们创建根文件夹
                    destFile.mkdirs(); // 可能不存在的根文件夹有多个
                } else {
                    File[] listFiles = srcFile.listFiles(); // 遍历文件夹底下的目录,得到
                                                            // 他的子文件
                    for (File file : listFiles) {
                        String name = file.getName();
                        File newFile = new File(destFile, name); // 目标文件路径发生变化,因为源文件已经开始遍历走向底层
                        copyFolder(newFile, destFile); // 一定是调用用自己
                    }
                }
            } else {
                copyFile(srcFile, destFile);
            }
        }
    }

}

package io;

import java.io.File;

import javax.swing.JOptionPane;

public class DeleteFile {

    /**
     * 函数重载 删除源文件
     * 
     * @param srcPath
     *            源路径
     */
    public void delete(String srcPath) {
        File file = new File(srcPath); // 把路径变成文件
        delete(file);
    }

    /**
     * 文件夹删除
     * 
     * @param srcFile
     *            源文件
     */
    public void delete(File srcFile) {
        if (srcFile != null && srcFile.exists()) {
            if (srcFile.isDirectory()) {
                File[] listFiles = srcFile.listFiles(); // 文件夹遍历,得到他的子文件夹
                if (listFiles.length != 0) {
                    for (int i = 0; i < listFiles.length; i++) {
                        File file = listFiles[i];
                        delete(file);
                    }
                }
                srcFile.delete();
            } else {
                srcFile.delete();
            }
            JOptionPane.showMessageDialog(null, "文件已成功删除");
        } else {
            JOptionPane.showMessageDialog(null, "此文件不存在");
        }
    }
}

package io;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;

public class Jframe extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;

    JFrame frame = new JFrame("io");

    JLabel copyLabel = new JLabel("文件拷贝:");
    JLabel srcPathLabel = new JLabel("源路径:");
    JTextArea srcText = new JTextArea();
    JLabel desPathLabel = new JLabel("目标路径:");
    JTextArea desText = new JTextArea();
    JTextArea keyText1 = new JTextArea();
    JLabel exchangeLabel = new JLabel("     转成");
    JTextArea keyText2 = new JTextArea();
    JButton copyButton = new JButton("拷贝");

    JButton choseBtn1 = new JButton("选择");
    JButton choseBtn2 = new JButton("选择");
    JButton choseBtn3 = new JButton("选择");

    JLabel deleteLabel = new JLabel("文件删除:");
    JLabel pathLabel = new JLabel("路径");
    JTextArea deleteText = new JTextArea();
    JButton deleteButton = new JButton("删除");

    JLabel saveLabel = new JLabel("文件保存:");
    JLabel srcLabel = new JLabel("目的路径:");
    JTextArea saveText = new JTextArea();
    JLabel messageLabel = new JLabel("添加内容:");
    JTextArea messageText = new JTextArea();
    JButton saveButton = new JButton("保存");

    /**
     * 画界面
     */
    private void init() {
        frame.setSize(405, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);

        copyLabel.setLocation(5, 5);
        copyLabel.setSize(60, 20);
        frame.add(copyLabel);

        srcPathLabel.setLocation(5, 30);
        srcPathLabel.setSize(60, 20);
        frame.add(srcPathLabel);

        srcText.setLocation(70, 30);
        srcText.setSize(250, 20);
        frame.add(srcText);

        choseBtn1.setLocation(325, 30);
        choseBtn1.setSize(60, 20);
        frame.add(choseBtn1);
        choseBtn1.addActionListener(this);

        desPathLabel.setLocation(5, 55);
        desPathLabel.setSize(60, 20);
        frame.add(desPathLabel);

        desText.setLocation(70, 55);
        desText.setSize(250, 20);
        frame.add(desText);

        choseBtn2.setLocation(325, 55);
        choseBtn2.setSize(60, 20);
        frame.add(choseBtn2);
        choseBtn2.addActionListener(this);

        keyText1.setLocation(45, 80);
        keyText1.setSize(120, 20);
        frame.add(keyText1);

        exchangeLabel.setLocation(170, 80);
        exchangeLabel.setSize(60, 20);
        frame.add(exchangeLabel);

        keyText2.setLocation(235, 80);
        keyText2.setSize(120, 20);
        frame.add(keyText2);

        copyButton.setLocation(170, 105);
        copyButton.setSize(60, 20);
        frame.add(copyButton);
        copyButton.addActionListener(this);

        deleteLabel.setLocation(5, 130);
        deleteLabel.setSize(60, 20);
        frame.add(deleteLabel);

        pathLabel.setLocation(5, 135);
        pathLabel.setSize(60, 20);
        frame.add(copyLabel);

        deleteText.setLocation(70, 135);
        deleteText.setSize(250, 20);
        frame.add(deleteText);

        deleteButton.setLocation(170, 160);
        deleteButton.setSize(60, 20);
        frame.add(deleteButton);
        deleteButton.addActionListener(this);

        saveLabel.setLocation(5, 185);
        saveLabel.setSize(60, 20);
        frame.add(saveLabel);

        srcLabel.setLocation(5, 210);
        srcLabel.setSize(60, 20);
        frame.add(srcLabel);

        saveText.setLocation(70, 210);
        saveText.setSize(250, 20);
        frame.add(saveText);

        choseBtn3.setLocation(325, 210);
        choseBtn3.setSize(60, 20);
        frame.add(choseBtn3);
        choseBtn3.addActionListener(this);

        messageLabel.setLocation(5, 235);
        messageLabel.setSize(60, 20);
        frame.add(messageLabel);

        messageText.setLocation(70, 235);
        messageText.setSize(250, 20);
        frame.add(messageText);

        saveButton.setLocation(325, 235);
        saveButton.setSize(60, 20);
        frame.add(saveButton);
        saveButton.addActionListener(this);

        frame.setVisible(true);

    }

    /**
     * 程序入口
     * 
     * @param args
     */
    public static void main(String[] args) {
        Jframe frame = new Jframe();
        frame.init();
    }

    /**
     * 所有的按钮的监听
     */
    public void actionPerformed(ActionEvent arg0) {
        if (arg0.getSource() == copyButton) { // 。getSource()表示按钮上你给他起的名字
            copy_file copy = new copy_file();
            KeyExchange change = new KeyExchange();
            copy.copyFile(srcText.getText(), desText.getText());
            change.exchange(keyText1.getText(), keyText2.getText(),
                    srcText.getText(), desText.getText());
        }
        if (arg0.getSource() == deleteButton) {
            DeleteFile delete = new DeleteFile();
            delete.delete(deleteText.getText());
        }
        if (arg0.getSource() == saveButton) {
            SaveFile save = new SaveFile();
            save.save(saveText.getText(), messageText.getText());
        }
        if (arg0.getSource() == choseBtn1) {
            JFileChooser fileChooser = new JFileChooser(
                    "C:\\Users\\Administrator\\Desktop\\123.txt");
            fileChooser
                    .setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            fileChooser.showDialog(null, "选择");
            File selectFile = fileChooser.getSelectedFile();
            if (selectFile != null) {
                srcText.setText(selectFile.getPath());
            }
        }
        if (arg0.getSource() == choseBtn2) {
            JFileChooser fileChooser = new JFileChooser(
                    "C:\\Users\\Administrator\\Desktop\\456.txt");
            fileChooser
                    .setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            fileChooser.showDialog(null, "选择");
            File selectFile = fileChooser.getSelectedFile();
            if (selectFile != null) {
                desText.setText(selectFile.getPath());
            }
        }
        if (arg0.getSource() == choseBtn3) {
            JFileChooser fileChooser = new JFileChooser(
                    "C:\\Users\\Administrator\\Desktop\\456.txt");
            fileChooser
                    .setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            fileChooser.showDialog(null, "选择");
            File selectFile = fileChooser.getSelectedFile();
            if (selectFile != null) {
                saveText.setText(selectFile.getPath());
            }
        }
    }

}

package io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import javax.swing.JOptionPane;

public class KeyExchange {

    /**
     * 文件中关键字替换
     * 
     * @param src
     *            原关键字
     * @param des
     *            目的关键字
     * @param srcPath
     *            源路径
     * @param desPath
     *            目的路径
     */
    public void exchange(String src, String des, String srcPath, String desPath) {
        File desfile = new File(desPath);
        File srcfile = new File(srcPath);
        exchangeFolder(src, des, srcfile, desfile);
    }

    /**
     * 文件中关键字替换
     * 
     * @param src
     *            原关键字
     * @param des
     *            目的关键字
     * @param srcfile
     *            源路径
     * @param desfile
     *            目的路径
     */
    private void exchange(String src, String des, File srcfile, File desfile) {
        BufferedReader br = null;
        BufferedWriter os = null;
        try {
            FileInputStream fis = new FileInputStream(srcfile);
            FileOutputStream fos = new FileOutputStream(desfile);
            br = new BufferedReader(new InputStreamReader(fis, "gbk")); // 防止乱码,因为我文件是gbk的
                                                                        // ,
                                                                        // 所有此处用gbk
            os = new BufferedWriter(new OutputStreamWriter(fos, "gbk"));
            String line = null;
            while ((line = br.readLine()) != null) {
                if (line.contains(src)) {
                    line = line.replaceAll(src, des);
                    os.write(line); // 替换后的字符串还需要out流写到别的地方
                    os.newLine(); // 每写完一行就要换一次行
                    os.flush(); // 刷新一下
                    // System.out.println(line);
                }
            }
            JOptionPane.showMessageDialog(null, "文件已成功更改");
        } catch (Exception e) {
            e.printStackTrace();
        } finally { // 优秀的关流操作
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                br = null;
            }
            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                os = null;
            }
        }
    }

    /**
     * 文件夹中关键字替换
     * 
     * @param src
     *            原关键字
     * @param des
     *            目的关键字
     * @param srcFile
     *            源文件
     * @param desfile
     *            目的文件
     */
    public void exchangeFolder(String src, String des, File srcFile,
            File desfile) {
        try {
            if (srcFile != null && srcFile.exists()) { // 保证数据的合法性
                if (srcFile.isDirectory()) {
                    File[] list = srcFile.listFiles();
                    for (File f : list) {
                        String name = f.getName();
                        File file = new File(desfile, name);
                        exchangeFolder(src, des, f, file);
                    }
                } else {
                    exchange(src, des, srcFile, desfile);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

package io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.swing.JOptionPane;

public class SaveFile {
    /**
     * 编写文件内容
     * 
     * @param srcPath
     *            源路径
     * @param message
     *            录入信息
     */
    public void save(String srcPath, String message) {
        File file = new File(srcPath);
        saveFolder(file, message);
    }

    /**
     * 文件夹保存
     * 
     * @param file
     *            源文件
     * @param message
     *            录入内容
     */
    public void saveFolder(File file, String message) {
        if (file != null) {
            File parentFile = file.getParentFile();
            if (!parentFile.exists()) {
                parentFile.mkdirs();
            }
            OutputStream out = null;
            try {
                out = new FileOutputStream(file);
                out.write(message.getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                } catch (IOException e) {
                    out = null;
                }
            }
            JOptionPane.showMessageDialog(null, "文件已成功保存");
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值