• 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()方法无法进行换行,需要手动在原本输出的字符串后面加"
    "或"
    "
                        str += "
    ";
                        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()方法无法进行换行,需要手动在原本输出的字符串后面加"
    "或"
    "
                            str += "
    ";
                            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

  • 相关阅读:
    虚拟空间,域名解析,A记录,MX记录,CNAME记录,TTL 等 更多Web服务器相关名词解释
    C# WinForm中的Label换行方法
    SQL 2005 with(nolock)详解
    常用Web Service汇总(天气预报、时刻表等)
    csdn中一篇sock 经验贴..
    如何保护.net中的dll文件(防破解、反编译)
    C#内存流示例>用内存流来读取图片
    QQ网页登陆密码加密方式(农场、空间、WebQQ等通用)
    MySQL数据库对dvbbs.php全文搜索的完全分析
    提搞网站访问速度可做哪些优化
  • 原文地址:https://www.cnblogs.com/liruilong/p/12499457.html
Copyright © 2020-2023  润新知