最近写了一个有关文件拷贝,删除,添加,以及关键字替换。
图形如下:
其中需要注意几点:
- 文件操作与文件夹操作略有不同。文件可以直接处理,而文件夹需要遍历它的子文件(file.listFiles())。
- 流不能帮我们创建根文件夹。我们自己创建(file.mkdirs())。
- 一个文件夹的路径不能用来创建一个文件(后缀名不一样)。我们可以选择在文件夹路径末端添加要创建的文件的名字,即根据文件夹路径创建它的子文件(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, "文件已成功保存");
}
}
}