IO文件管理

来源:互联网 发布:淘宝怎么看确认收货 编辑:程序博客网 时间:2024/04/30 11:55

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

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

其中需要注意几点:

  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