Java实现GBK转码到UTF-8(文件)

所以,虚无的悲叹,寻根问底仍是由于肉身的圈定。肉身蒙蔽了灵魂的眼睛,单是看见要回那无中去,却忘了你原是从那无中来。                                              ——史铁生 《病隙碎笔》

 

 

 

 

嗯,需求是这样的:

需要爬一点东西,我用python爬到,然后保存成JSON文件,但是开发环境是windows,所以文件保存是以GBK的编码保存的。然后我需要把JSON解析为POJO,然后给持久层。,但是Java编码环境是UTF-8,所以我想把文件转换为UTF-8,觉得应该可以GBK的方式读取,直接解析,不做处理,但是考虑控制台日志啥的,其他不定项因素,网上参考部分,写了这个。

我是这样解决的:

 

package com.liruilong.demotext.service.utils;

import java.io.*;

/**
 * @Description :
 * @Author: Liruilong
 * @Date: 2020/3/15 18:37
 */
public class EncodingUtil {

    public static void gbkAndUtf8(File file) {

        if (!file.exists() || file.isDirectory()) {
            System.out.println("输入路径不对");
        } else {
            // 以GBK格式,读取文件
            FileInputStream fileInputStream = null;
            InputStreamReader inputStreamReader = null;
            BufferedReader bufferedReader = null;
            FileOutputStream fileOutputStream = null;
            OutputStreamWriter outputStreamWriter = null;
            try {
                fileInputStream = new FileInputStream(file);
                inputStreamReader = new InputStreamReader(fileInputStream, "GBK");
                bufferedReader = new BufferedReader(inputStreamReader);

                String str = null;
                // 创建StringBuffer字符串缓存区
                StringBuffer stringBuffer = new StringBuffer();

                // 通过readLine()方法遍历读取文件
                while ((str = bufferedReader.readLine()) != null) {
                    // 使用readLine()方法无法进行换行,需要手动在原本输出的字符串后面加"\n"或"\r"
                    str += "\n";
                    stringBuffer.append(str);
                }
                String str2 = stringBuffer.toString();
                // 以UTF-8格式写入文件,file.getAbsolutePath()即该文件的绝对路径,false代表不追加直接覆盖,true代表追加文件
                fileOutputStream = new FileOutputStream(file.getAbsolutePath(), false);
                outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
                outputStreamWriter.write(str2);
                outputStreamWriter.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                allClose(outputStreamWriter, fileOutputStream, bufferedReader, inputStreamReader, fileInputStream);
            }

        }
    }

    public static void allClose(Closeable... closeables) {
        for (Closeable closeable : closeables) {
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

原博主博客,,用了递归,多个文件夹:

package com.zjx.file;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
/*
 * 需求:请大家把自己一个文件目录的所有文件格式以UTF-8输出,然后以GBK写入。
 * 分析:
 *         A:封装目录
 *         B:遍历文件,获取该目录下的所有以.java结尾的文件
 *         C.读取该文件,遍历至StringBuffer文件
 *         D.写入文件    
 */
public class FilePathDemo {
    public static void main(String[] args) throws IOException {
 
        // 封装目录,需要修改文件格式的路径
        File srcFolder = new File("文件路径");
 
        // 递归功能实现
        getAllJavaFilePaths(srcFolder);
    }
 
    private static void getAllJavaFilePaths(File srcFolder) throws IOException {
 
        // 获取该目录下所有的文件或者文件夹的File数组
        File[] fileArray = srcFolder.listFiles();
 
        // 遍历该File数组,得到每一个File对象
        for (File file : fileArray) {
 
            // 继续判断是否以.java结尾,不是的话继续调用getAllJavaFilePaths()方法
            if (file.isDirectory()) {
 
                getAllJavaFilePaths(file);
 
            } else {
 
                if (file.getName().endsWith(".java")) {
 
                    // 以GBK格式,读取文件
                    FileInputStream fis = new FileInputStream(file);
                    InputStreamReader isr = new InputStreamReader(fis, "GBK");
                    BufferedReader br = new BufferedReader(isr);
                    String str = null;
 
                    // 创建StringBuffer字符串缓存区
                    StringBuffer sb = new StringBuffer();
 
                    // 通过readLine()方法遍历读取文件
                    while ((str = br.readLine()) != null) {
                        // 使用readLine()方法无法进行换行,需要手动在原本输出的字符串后面加"\n"或"\r"
                        str += "\n";
                        sb.append(str);
                    }
                    String str2 = sb.toString();
 
                    // 以UTF-8格式写入文件,file.getAbsolutePath()即该文件的绝对路径,false代表不追加直接覆盖,true代表追加文件
                    FileOutputStream fos = new FileOutputStream(file.getAbsolutePath(), false);
                    OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
                    osw.write(str2);
                    osw.flush();
                    osw.close();
                    fos.close();
                    br.close();
                    isr.close();
                    fis.close();
                }
            }
        }
    }
}

转载:

https://blog.csdn.net/weixin_42038771/article/details/80490505

posted @ 2020-03-15 19:18  山河已无恙  阅读(3912)  评论(0编辑  收藏  举报