首页 > 其他分享 >批量转换文件字符集

批量转换文件字符集

时间:2022-09-18 21:33:38浏览次数:66  
标签:转换 String 批量 路径 字符集 System File new Scanner

操作步骤

  • 先设置输入路径与输出路径
  1. 输入路径:需要被转换的文件路径
  2. 输出路径:转换后的文件储存路径
  3. 我没有写这个属性的交互操作,只是在第一行用字面量进行设置
  • 如果输出路径的目录不存在,则就会进行交互,是否创建该目录,如果不创建就退出程序
  • 再是选择字符集转换的类型,是全部文件默认使用同一套字符集转换,还是一个一个文件的设置字符集类型转换
  • 接着运行即可

代码如下

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);
            }
        }
    }
}

其中的判断是否要创建的步骤如下:

标签:转换,String,批量,路径,字符集,System,File,new,Scanner
From: https://www.cnblogs.com/hjjbky/p/16705877.html

相关文章

  • Leetcode第8题:字符串转换整数 (atoi)
    /**这题就是要细心,首先要通过循环去掉前面的空格然后看看有没有正号或者负号,或者没有符号再看看数字有没有越界*/classSolution{publicintmyAtoi(Strings)......
  • Postman批量执行接口
    1、NewCollection  填【脚本】【测试】【参数值】三项,主要是参数项。测试可填:pm.test("测试结果成功", function () {    pm.response.to.have.status(200......
  • .mat文件批量转存为.json文件的方法
    记录下.mat文件批量转存为.json文件的方法matlab本身是没有json解析包的,因此需要加载一个jsonlab工具包,可以用git命令下载gitclonehttps://github.com/fangq/jsonlab.g......
  • 将 HTML 转换为 Markdown 的快速 macOS 快捷方式
    将HTML转换为Markdown的快速macOS快捷方式关于如何将HTML转换为Markdown的快速教程。例如,在本教程结束时,您应该能够突出显示下面的文本……<h2>绝对网址</h2......
  • 类型转换
    类型转换由于Java是强类型语言,所以要进行有些运算的时候的,需要用到类型转换。低--------------------------------------------------------->高byte,short,char--->i......
  • 2022解放短视频双手,智能批量一键AI图文成片生成工具。
    文字转视频好用的工具有哪些?文字一键自动朗读转视频文件解放双手,文字转语音短视频制作必备工具。推荐一款2022很火的一款AI批量文本一键生成短视频工具,亲测有效! 这款......
  • pytorch如何批量reshape,如何每batch_size进行reshape
    假设我有一个tensor,它的batch_size是2:tensor=torch.randn([2,6])print(tensor.shape)输出是torch.Size([2,6])其中tensor.shape[0]代表tensor的batch_size如果......
  • 稀疏数组转换思路及代码实现
    基本功能当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。处理方法记录数组一共有几行几列,有多少个不同的值把具有不同值的元素的行列......
  • 实例-rust-string和bytes转换
    Cargo.toml[package]name="rust-example9"version="0.1.0"edition="2021"#Seemorekeysandtheirdefinitionsathttps://doc.rust-lang.org/cargo/refere......
  • Taurus.MVC-Java 版本打包上传到Maven中央仓库(详细过程):4、Maven项目转换与pom.xml配置
    文章目录:Taurus.MVC-Java版本打包上传到Maven中央仓库(详细过程):1、JIRA账号注册Taurus.MVC-Java版本打包上传到Maven中央仓库(详细过程):2、PGP下载安装与密钥生成发布Tau......