Skip to content

Commit eec4d57

Browse files
committed
添加文件编码转换工具
1 parent c5b56c6 commit eec4d57

3 files changed

Lines changed: 212 additions & 0 deletions

File tree

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.xwintop.xJavaFxTool.controller.codeTools;
2+
3+
import com.xwintop.xJavaFxTool.services.codeTools.FileUnicodeTransformationToolService;
4+
import com.xwintop.xJavaFxTool.view.codeTools.FileUnicodeTransformationToolView;
5+
import com.xwintop.xcore.util.javafx.FileChooserUtil;
6+
import javafx.event.ActionEvent;
7+
import javafx.fxml.FXML;
8+
import lombok.Getter;
9+
import lombok.Setter;
10+
import lombok.extern.slf4j.Slf4j;
11+
12+
import java.io.File;
13+
import java.net.URL;
14+
import java.nio.charset.Charset;
15+
import java.util.ResourceBundle;
16+
17+
/**
18+
* @ClassName: FileUnicodeTransformationToolController
19+
* @Description: 文件编码转换工具
20+
* @author: xufeng
21+
* @date: 2019/10/9 15:01
22+
*/
23+
24+
@Getter
25+
@Setter
26+
@Slf4j
27+
public class FileUnicodeTransformationToolController extends FileUnicodeTransformationToolView {
28+
private FileUnicodeTransformationToolService fileUnicodeTransformationToolService = new FileUnicodeTransformationToolService(this);
29+
30+
@Override
31+
public void initialize(URL location, ResourceBundle resources) {
32+
initView();
33+
initEvent();
34+
initService();
35+
}
36+
37+
private void initView() {
38+
oldFileUnicodeComboBox.getItems().add("自动检测");
39+
oldFileUnicodeComboBox.getItems().addAll(Charset.availableCharsets().keySet());
40+
oldFileUnicodeComboBox.setValue("UTF-8");
41+
newFileUnicodeComboBox.getItems().addAll(Charset.availableCharsets().keySet());
42+
newFileUnicodeComboBox.setValue(Charset.defaultCharset().name());
43+
}
44+
45+
private void initEvent() {
46+
FileChooserUtil.setOnDrag(detectPathTextField, FileChooserUtil.FileType.FILE);
47+
}
48+
49+
private void initService() {
50+
}
51+
52+
@FXML
53+
private void detectPathAction(ActionEvent event) {
54+
File file = FileChooserUtil.chooseFile();
55+
if (file != null) {
56+
detectPathTextField.setText(file.getPath());
57+
}
58+
}
59+
60+
@FXML
61+
private void transformationAction(ActionEvent event) {
62+
try {
63+
fileUnicodeTransformationToolService.transformationAction();
64+
} catch (Exception e) {
65+
log.error("文件编码转换失败!", e);
66+
}
67+
}
68+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package com.xwintop.xJavaFxTool.services.codeTools;
2+
3+
import com.xwintop.xJavaFxTool.controller.codeTools.FileUnicodeTransformationToolController;
4+
import com.xwintop.xJavaFxTool.utils.DirectoryTreeUtil;
5+
import com.xwintop.xcore.util.javafx.TooltipUtil;
6+
import lombok.Getter;
7+
import lombok.Setter;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.apache.commons.io.FileUtils;
10+
import org.apache.commons.lang3.StringUtils;
11+
12+
import java.io.File;
13+
import java.nio.file.Files;
14+
import java.nio.file.Path;
15+
import java.util.Iterator;
16+
import java.util.regex.Pattern;
17+
18+
/**
19+
* @ClassName: FileUnicodeTransformationToolService
20+
* @Description: 文件编码转换工具
21+
* @author: xufeng
22+
* @date: 2019/10/9 15:00
23+
*/
24+
25+
@Getter
26+
@Setter
27+
@Slf4j
28+
public class FileUnicodeTransformationToolService {
29+
private FileUnicodeTransformationToolController fileUnicodeTransformationToolController;
30+
31+
public FileUnicodeTransformationToolService(FileUnicodeTransformationToolController fileUnicodeTransformationToolController) {
32+
this.fileUnicodeTransformationToolController = fileUnicodeTransformationToolController;
33+
}
34+
35+
public void transformationAction() throws Exception {
36+
String watchPath = fileUnicodeTransformationToolController.getDetectPathTextField().getText();
37+
if (StringUtils.isEmpty(watchPath)) {
38+
TooltipUtil.showToast("检测目录不能为空!");
39+
return;
40+
}
41+
File file = new File(watchPath);
42+
if (file.isDirectory()) {
43+
Path path = file.toPath();
44+
Iterator<Path> iterator = null;
45+
if (fileUnicodeTransformationToolController.getIncludeSubdirectoryCheckBox().isSelected()) {
46+
iterator = Files.walk(path).iterator();
47+
} else {
48+
iterator = Files.newDirectoryStream(path).iterator();
49+
}
50+
boolean sRegex = fileUnicodeTransformationToolController.getFileNameSupportRegexCheckBox().isSelected();
51+
String fileNameContains = fileUnicodeTransformationToolController.getFileNameContainsTextField().getText();
52+
String fileNameNotContains = fileUnicodeTransformationToolController.getFileNameNotContainsTextField().getText();
53+
Pattern fileNameCsPattern = null;
54+
Pattern fileNameNCsPattern = null;
55+
if (sRegex) {
56+
fileNameCsPattern = Pattern.compile(fileNameContains, Pattern.CASE_INSENSITIVE);
57+
fileNameNCsPattern = Pattern.compile(fileNameNotContains, Pattern.CASE_INSENSITIVE);
58+
}
59+
while (iterator.hasNext()) {
60+
Path nextPath = iterator.next();
61+
if (Files.isRegularFile(nextPath) && DirectoryTreeUtil.ifMatchText(nextPath.getFileName().toString(), fileNameContains, fileNameNotContains, sRegex, fileNameCsPattern, fileNameNCsPattern)) {
62+
File newFile = nextPath.toFile();
63+
String showHideFile = fileUnicodeTransformationToolController.getShowHideFileChoice().getValue();
64+
if ("非隐藏".equals(showHideFile) && file.isHidden()) {
65+
return;
66+
} else if ("隐藏文件".equals(showHideFile) && !file.isHidden()) {
67+
return;
68+
}
69+
fileUnicodeTransformation(newFile);
70+
}
71+
}
72+
} else if (file.isFile()) {
73+
fileUnicodeTransformation(file);
74+
}
75+
}
76+
77+
private void fileUnicodeTransformation(File file) throws Exception {
78+
String oldFileUnicode = fileUnicodeTransformationToolController.getOldFileUnicodeComboBox().getValue();
79+
if ("自动检测".equals(oldFileUnicode)) {
80+
oldFileUnicode = CharsetDetectToolService.detectFileCharset(file, 51200);
81+
}
82+
String newFileUnicode = fileUnicodeTransformationToolController.getNewFileUnicodeComboBox().getValue();
83+
String newFilePath = fileUnicodeTransformationToolController.getNewFilePathTextField().getText();
84+
String fileConcel = FileUtils.readFileToString(file, oldFileUnicode);
85+
if (StringUtils.isNotEmpty(newFilePath)) {
86+
newFilePath = StringUtils.removeEnd(newFilePath, "/");
87+
newFilePath = StringUtils.removeEnd(newFilePath, "\\");
88+
String watchPath = fileUnicodeTransformationToolController.getDetectPathTextField().getText();
89+
watchPath = StringUtils.removeEnd(watchPath, "/");
90+
watchPath = StringUtils.removeEnd(watchPath, "\\");
91+
File watchPathFile = new File(watchPath);
92+
String subPath = "";
93+
if (watchPathFile.isDirectory()) {
94+
subPath = file.getParent().replace(watchPath, "");
95+
}
96+
file = new File(newFilePath + "/" + subPath, file.getName());
97+
}
98+
FileUtils.writeByteArrayToFile(file, fileConcel.getBytes(newFileUnicode));
99+
fileUnicodeTransformationToolController.getResultTextArea().appendText(file.getAbsolutePath() + " 转换完成\n");
100+
}
101+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.xwintop.xJavaFxTool.view.codeTools;
2+
3+
import javafx.fxml.FXML;
4+
import javafx.fxml.Initializable;
5+
import javafx.scene.control.*;
6+
import lombok.Getter;
7+
import lombok.Setter;
8+
/**
9+
* @ClassName: FileUnicodeTransformationToolView
10+
* @Description: 文件编码转换工具
11+
* @author: xufeng
12+
* @date: 2019/10/9 15:01
13+
*/
14+
15+
@Getter
16+
@Setter
17+
public abstract class FileUnicodeTransformationToolView implements Initializable {
18+
@FXML
19+
protected TextField detectPathTextField;
20+
@FXML
21+
protected Button detectPathButton;
22+
@FXML
23+
protected CheckBox includeSubdirectoryCheckBox;
24+
@FXML
25+
protected Button transformationButton;
26+
@FXML
27+
protected ChoiceBox<String> showHideFileChoice;
28+
@FXML
29+
protected TextField fileNameContainsTextField;
30+
@FXML
31+
protected TextField fileNameNotContainsTextField;
32+
@FXML
33+
protected CheckBox fileNameSupportRegexCheckBox;
34+
@FXML
35+
protected ComboBox<String> oldFileUnicodeComboBox;
36+
@FXML
37+
protected ComboBox<String> newFileUnicodeComboBox;
38+
@FXML
39+
protected TextField newFilePathTextField;
40+
@FXML
41+
protected TextArea resultTextArea;
42+
43+
}

0 commit comments

Comments
 (0)