操作步驟 先設置輸入路徑與輸出路徑 輸入路徑:需要被轉換的文件路徑 輸出路徑:轉換後的文件儲存路徑 我沒有寫這個屬性的交互操作,只是在第一行用字面量進行設置 如果輸出路徑的目錄不存在,則就會進行交互,是否創建該目錄,如果不創建就退出程式 再是選擇字元集轉換的類型,是全部文件預設使用同一套字元集轉換, ...
操作步驟
- 先設置輸入路徑與輸出路徑
- 輸入路徑:需要被轉換的文件路徑
- 輸出路徑:轉換後的文件儲存路徑
- 我沒有寫這個屬性的交互操作,只是在第一行用字面量進行設置
- 如果輸出路徑的目錄不存在,則就會進行交互,是否創建該目錄,如果不創建就退出程式
- 再是選擇字元集轉換的類型,是全部文件預設使用同一套字元集轉換,還是一個一個文件的設置字元集類型轉換
- 接著運行即可
代碼如下
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class charsetConversion {
public static void main(String[] args) throws IOException {
//輸入路徑
String inputPath = "C:\\Users\\hhhhh\\Desktop\\data";
//輸出路徑
String outputPath = "C:\\Users\\hhhhh\\Desktop\\data_out";
File output = new File(outputPath);
if (!output.exists()){
System.out.println("指定的目錄不存在是否要創建它? y/n:");
Scanner scanner = new Scanner(System.in);
String YN = scanner.next();
//如果輸入y或Y九創建,否則不創建並退出程式
if (YN.equalsIgnoreCase("y")){
output.mkdir();
}else {
System.exit(-1);
}
}
String charset1=null;
String charset2=null;
System.out.println("要指定預設字元集嗎? y/n");
Scanner yn = new Scanner(System.in);
String YN = yn.next();
//如果輸入y或Y九創建,否則不創建並退出程式
if (YN.equalsIgnoreCase("y")){
System.out.print("原字元集:");
Scanner scanner1 = new Scanner(System.in);
charset1 = scanner1.nextLine();
System.out.print("\n要轉換為:");
Scanner scanner2 = new Scanner(System.in);
charset2 = scanner2.nextLine();
}
//創建輸入路徑的File對象作為ergodic()方法的參數,用於遍歷輸入路徑中要複製的文件。
File input = new File(inputPath);
//List,用於儲存輸入路徑中的所有File對象。
List<File> list = new ArrayList<>();
ergodic(input,list);
//將輸入路徑中的File對象,安裝相應的路徑複製到輸出路徑中,例如(A\a1\a2\a.txt --> B\a1\a2\a.txt)
for (File f:list){
if (charset1!=null && charset2!=null){
createFile(f,inputPath,outputPath,charset1,charset2);
}else {
createFile(f,inputPath,outputPath);
}
}
}
/**
用來判斷當前File(文件或目錄)是否存在,如果不存在就創建它,如果是文件則在創建後寫入轉換後的內容
*/
public static void createFile(File file,String inputPath,String outputPath,String... charset) throws IOException {
//對輸入路徑的文件路徑做處理 例如輸入路徑為:input\a1\a2\a.txt
//獲取輸入路徑文件與指定目錄的相對路徑, 獲取:a1\a2\a.txt
String output = file.getPath().substring(inputPath.length()+1);
//用於拼接輸出路徑
StringBuilder sb = new StringBuilder();
//切割 例如:上一步獲取到 a1\a2\a.txt ,就需要對目錄a1、a2進行判斷是否存在,然後創建目錄,否則會報錯:找不到指定系統位置
String[] str = output.split("\\\\");
//拼接路徑並判斷是否存在,然後創建目錄與文件
for (int i=0;i<str.length;i++){
//output\a1 是否存在,不存在就創建該目錄;output\a1\a2是否存在,不存在就創建......
sb.append("\\").append(str[i]);
File dir = new File(outputPath+sb);
System.out.println(dir.getPath());
if (dir.exists()){
System.out.println("existed");
}else {
//如果是有尾碼名的文件,就創建文件並寫進內容
if (str[i].contains(".")){
dir.createNewFile();
//寫出內容
if (charset.length==2){
//如果傳入了字元集參數就預設全部以此為標準
outputWriterByte(file,dir,charset[0],charset[1]);
}else {
//如果沒有,就挨個輸入字元集
outputWriterByte(file,dir);
}
System.out.println("Create a file"+dir.getPath());
}else {
dir.mkdir();
System.out.println("Create a directory"+dir.getPath());
}
}
}
}
/**
遍歷輸入路徑中,需要被轉換的文件,並將它們(File對象)儲存在由用戶提供的Liset<File>對象的ergodicResult里。
*/
public static List<File> ergodic(File file, List<File> ergodicResult) {
File[] files = file.listFiles();
if (files == null){
return ergodicResult;
}
for (File f : files) {
if (f.isDirectory()) {
ergodic(f, ergodicResult);
} else
ergodicResult.add(f);
}
return ergodicResult;
}
/**
普通的轉換流,添加了緩衝流優化。
*/
public static void outputWriterByte(File input,File output,String... charset){
FileInputStream fis;
FileOutputStream fos;
InputStreamReader isr = null;
OutputStreamWriter osw = null;
BufferedOutputStream bufferedOutputStream;
BufferedInputStream bufferedInputStream;
try {
fis = new FileInputStream(input);
fos = new FileOutputStream(output);
bufferedInputStream = new BufferedInputStream(fis);
bufferedOutputStream = new BufferedOutputStream(fos);
String charsetName1;
String charsetName2;
if (charset.length==2){
charsetName1=charset[0];
charsetName2=charset[1];
}else {
System.out.print("轉換之前的字元集:");
Scanner scanner1 = new Scanner(System.in);
charsetName1 = scanner1.nextLine();
System.out.print("\n轉換之後的字元集:");
Scanner scanner2 = new Scanner(System.in);
charsetName2 = scanner2.nextLine();
System.out.println("---------------------------");
}
isr = new InputStreamReader(bufferedInputStream, charsetName1);
osw = new OutputStreamWriter(bufferedOutputStream,charsetName2);
//讀多少寫多少
char[] cbuf = new char[20];
int len;
while ((len = isr.read(cbuf)) != -1){
osw.write(cbuf,0,len);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (isr!=null){
isr.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
if (osw!=null){
osw.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}