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

嗯,需求是这样的:

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

我是这样解决的:

  1. package com.liruilong.demotext.service.utils;
  2.  
  3. import java.io.*;
  4.  
  5. /**
  6. * @Description :
  7. * @Author: Liruilong
  8. * @Date: 2020/3/15 18:37
  9. */
  10. public class EncodingUtil {
  11.  
  12. public static void gbkAndUtf8(File file) {
  13.  
  14. if (!file.exists() || file.isDirectory()) {
  15. System.out.println("输入路径不对");
  16. } else {
  17. // 以GBK格式,读取文件
  18. FileInputStream fileInputStream = null;
  19. InputStreamReader inputStreamReader = null;
  20. BufferedReader bufferedReader = null;
  21. FileOutputStream fileOutputStream = null;
  22. OutputStreamWriter outputStreamWriter = null;
  23. try {
  24. fileInputStream = new FileInputStream(file);
  25. inputStreamReader = new InputStreamReader(fileInputStream, "GBK");
  26. bufferedReader = new BufferedReader(inputStreamReader);
  27.  
  28. String str = null;
  29. // 创建StringBuffer字符串缓存区
  30. StringBuffer stringBuffer = new StringBuffer();
  31.  
  32. // 通过readLine()方法遍历读取文件
  33. while ((str = bufferedReader.readLine()) != null) {
  34. // 使用readLine()方法无法进行换行,需要手动在原本输出的字符串后面加"\n"或"\r"
  35. str += "\n";
  36. stringBuffer.append(str);
  37. }
  38. String str2 = stringBuffer.toString();
  39. // 以UTF-8格式写入文件,file.getAbsolutePath()即该文件的绝对路径,false代表不追加直接覆盖,true代表追加文件
  40. fileOutputStream = new FileOutputStream(file.getAbsolutePath(), false);
  41. outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
  42. outputStreamWriter.write(str2);
  43. outputStreamWriter.flush();
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. } finally {
  47. allClose(outputStreamWriter, fileOutputStream, bufferedReader, inputStreamReader, fileInputStream);
  48. }
  49.  
  50. }
  51. }
  52.  
  53. public static void allClose(Closeable... closeables) {
  54. for (Closeable closeable : closeables) {
  55. try {
  56. closeable.close();
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. }
  62. }

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

  1. package com.zjx.file;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.io.OutputStreamWriter;
  10.  
  11. /*
  12. * 需求:请大家把自己一个文件目录的所有文件格式以UTF-8输出,然后以GBK写入。
  13. * 分析:
  14. * A:封装目录
  15. * B:遍历文件,获取该目录下的所有以.java结尾的文件
  16. * C.读取该文件,遍历至StringBuffer文件
  17. * D.写入文件
  18. */
  19. public class FilePathDemo {
  20. public static void main(String[] args) throws IOException {
  21.  
  22. // 封装目录,需要修改文件格式的路径
  23. File srcFolder = new File("文件路径");
  24.  
  25. // 递归功能实现
  26. getAllJavaFilePaths(srcFolder);
  27. }
  28.  
  29. private static void getAllJavaFilePaths(File srcFolder) throws IOException {
  30.  
  31. // 获取该目录下所有的文件或者文件夹的File数组
  32. File[] fileArray = srcFolder.listFiles();
  33.  
  34. // 遍历该File数组,得到每一个File对象
  35. for (File file : fileArray) {
  36.  
  37. // 继续判断是否以.java结尾,不是的话继续调用getAllJavaFilePaths()方法
  38. if (file.isDirectory()) {
  39.  
  40. getAllJavaFilePaths(file);
  41.  
  42. } else {
  43.  
  44. if (file.getName().endsWith(".java")) {
  45.  
  46. // 以GBK格式,读取文件
  47. FileInputStream fis = new FileInputStream(file);
  48. InputStreamReader isr = new InputStreamReader(fis, "GBK");
  49. BufferedReader br = new BufferedReader(isr);
  50. String str = null;
  51.  
  52. // 创建StringBuffer字符串缓存区
  53. StringBuffer sb = new StringBuffer();
  54.  
  55. // 通过readLine()方法遍历读取文件
  56. while ((str = br.readLine()) != null) {
  57. // 使用readLine()方法无法进行换行,需要手动在原本输出的字符串后面加"\n"或"\r"
  58. str += "\n";
  59. sb.append(str);
  60. }
  61. String str2 = sb.toString();
  62.  
  63. // 以UTF-8格式写入文件,file.getAbsolutePath()即该文件的绝对路径,false代表不追加直接覆盖,true代表追加文件
  64. FileOutputStream fos = new FileOutputStream(file.getAbsolutePath(), false);
  65. OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
  66. osw.write(str2);
  67. osw.flush();
  68. osw.close();
  69. fos.close();
  70. br.close();
  71. isr.close();
  72. fis.close();
  73. }
  74. }
  75. }
  76. }
  77. }

转载:

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

Java实现GBK转码到UTF-8(文件)的更多相关文章

  1. java 将GBK编码文件转为UTF-8编码

    需要commons-io-2.0.1.jar public class Test { public static void main(String args[]) throws IOException ...

  2. JAVA小项目实例源码—学习娱乐小助手

    代码地址如下:http://www.demodashi.com/demo/11456.html 一.程序实现 项目目录: MyJFrame:实现项目界面样式: AppProcess:实现调用api或爬 ...

  3. java编译后字节码解析

    java编译后字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260

  4. 利用JAVA生成二维码

    本文章整理于慕课网的学习视频<JAVA生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...

  5. java 模拟qq源码

    java 模拟qq源码: http://files.cnblogs.com/files/hujunzheng/QQ--hjzgg.zip

  6. Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析

    经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...

  7. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  8. Java并发包源码学习之AQS框架(一)概述

    AQS其实就是java.util.concurrent.locks.AbstractQueuedSynchronizer这个类. 阅读Java的并发包源码你会发现这个类是整个java.util.con ...

  9. 如何查看JDK以及JAVA框架的源码

    如何查看JDK以及JAVA框架的源码 设置步骤如下: 1.点 “window”-> "Preferences" -> "Java" -> &q ...

随机推荐

  1. 康耐视软件VisionPro-max-u与VisionPro-plus-u的区别

    康耐视软件VisionPro-max-u与VisionPro-plus-u的区别 1.VisionPro-plus-u为基础版可以直接运用该软件包的算法,拖拽式的窗口程序 2.VisionPro-ma ...

  2. 学习C++之前要先学习C语言吗?

    C++ 读作“C加加”,是“C Plus Plus”的简称.顾名思义,C++ 是在C语言的基础上增加新特性,玩出了新花样,所以叫“C Plus Plus”,就像 iPhone 7S 和 iPhone ...

  3. Chrome开发者调试工具

    参考资料 Chrome Console不完全指南 Chrome使用技巧 Chrome开发工具详解 结束语 工欲善其事,必先利其器.

  4. 为什么前两年大热的VR创业突然冷了?

    不得不说,如果不是<头号玩家>在国内的热映,人们似乎都要忘记VR这个行业了.<头号玩家>中那些带有极强真实色彩的游戏,其实就是VR进化的目标,甚至是巅峰!而里面的角色佩戴的设备 ...

  5. 反编译.net下的exe程序

    1. 什么叫.net平台 .NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境..NET框架的目的是便于开发人员更容易地建立Web应用程序和Web服务,使得Internet上的 ...

  6. Nginx笔记总结十二:nginx版本号隐藏

    vim nginx.conf http { server_tokens off;} php-fpm fastcgi.conf或fcgi.conf fastcgi_param SERVER_SOFTWA ...

  7. 吴裕雄--天生自然 R语言开发学习:回归(续二)

    #------------------------------------------------------------# # R in Action (2nd ed): Chapter 8 # # ...

  8. hexo命令

    2017-09-12 by chenyan 安装 npm install hexo -g #安装npm update hexo -g #升级hexo init #初始化 简写 hexo n " ...

  9. js javascript 获取url,获得当前页面的url,静态html文件js读取url参数

    获得当前页面的url window.location.href 静态html文件js读取url参数 location.search; //获取url中"?"符后的字串 下边为转载的 ...

  10. 每天一个linux命令(15)-tail

    tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不断刷新, ...