操作步骤
- 先设置输入路径与输出路径
- 输入路径:需要被转换的文件路径
- 输出路径:转换后的文件储存路径
- 我没有写这个属性的交互操作,只是在第一行用字面量进行设置
- 如果输出路径的目录不存在,则就会进行交互,是否创建该目录,如果不创建就退出程序
- 再是选择字符集转换的类型,是全部文件默认使用同一套字符集转换,还是一个一个文件的设置字符集类型转换
- 接着运行即可
代码如下
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 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对象的ergodicResult里。*/ public static List ergodic(File file, List 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); } } }}
其中的判断是否要创建的步骤如下: