上一篇文章我们已经介绍了解决文件乱码的一种方式——修改Eclipse设置,但修改Eclipse设置并未改变文件编码格式,有时候我们需要统一文件编码格式,这时候就需要用到第二种解决文件乱码的方式——文件转码。下面介绍两种方式实现文件转码。

一、Eclipse插件实现文件转码

这个需要我们下载一个Eclipse文件转码插件com.lifesting.tool.encoding_1.0.0.jar,下载链接及教程可参考下面这篇文章http://www.blogjava.net/lifesting/archive/2008/04/11/192250.html,这里就不多介绍了。

二、自己编写程序实现文件转码

我们知道,文件出现乱码主要是因为文件的编码和解码方式不一致,前面写入数据的时候我们可能用的是GBK格式,而后面读取的时候却可能用了别的格式(如UTF-8),这样就极可能出现乱码,尤其是包含了中文字符的文件。

其实,在我们知道了乱码产生的原因后,我们就可以自己动手编写一个文件转码程序。

String类有一个构造方法String(byte [ ] bytes,String charsetName)和一种获取指定码表的字节数组的方法getBytes(String chasetName),通过这两种方法我们就可以实现字符串的转码,示例如下:

String str=new String("汉字".getBytes("GBK"),"UTF-8");

而这里我们需要实现整个文本内容的转码,整体思路其实差不多,不过得用到转换流的一些知识InputStreamReader(InputString in,String chasetName)和OutputStreamWriter(OutputString out,String chasetName),有了这两个方法后,剩下我们需要掌握的就是一些文本的操作了,可以参考文章——IO学习之File类https://blog.csdn.net/LIAO_7053/article/details/81940835。

三、java代码实现

1、功能实现:

a.批量文件编码格式转换;

b.文件夹遍历后指定位置输出;

c.方便友好的操作界面

2、具体代码:

package com.liao.CodeTools0823;import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;public class MainUI extends JFrame {private static final long serialVersionUID = 518541171932584910L;private JTextField jtf1;private JTextField jtf2;private JComboBox<String> jcb1;private JComboBox<String> jcb2;private JButton jbu;private ArrayList<File> filelist = new ArrayList<>();// 存储文件队列//主函数public static void main(String[] args) {MainUI mui = new MainUI();mui.init();mui.listen();}// 界面设计public void init() {setTitle("文件转码");setSize(340, 210);setLocationRelativeTo(null);setLayout(new FlowLayout());setResizable(false);setDefaultCloseOperation(3);// 原文件编码标签JLabel jl2 = new JLabel("原文件编码");add(jl2);// 支持的编码格式String[] encodeTypes = { "GBK", "UTF-8", "Unicode", "ASCII",  "GB2312" };// 原文件编码jcb1 = new JComboBox<>(encodeTypes);add(jcb1);// 目标文件编码标签JLabel jl4 = new JLabel("目标文件编码");add(jl4);// 目标文件编码jcb2 = new JComboBox<>(encodeTypes);add(jcb2);// 原文件地址标签JLabel jl1 = new JLabel("原文件地址");add(jl1);// 原文件地址jtf1 = new JTextField(28);add(jtf1);// 目标文件地址标签JLabel jl3 = new JLabel("目标文件地址");add(jl3);// 目标文件地址jtf2 = new JTextField(28);add(jtf2);// 开始按钮jbu = new JButton("开始");add(jbu);setVisible(true);}// 监听器获取信息private void listen() {// 添加监听器jbu.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 获取地址、编码信息String originalDir = jtf1.getText();String targetDir = jtf2.getText();String type1 = jcb1.getSelectedItem().toString();String type2 = jcb2.getSelectedItem().toString();// 调用文件判断方法及编码方法if (judge(originalDir, targetDir)) {encode(type1, type2, targetDir);}}});}// 对原文件进行判断private Boolean judge(String originalDir, String targetDir) {File file1 = new File(originalDir);// 判断原文件是否存在while (!file1.exists()) {JOptionPane.showMessageDialog(null, "输入文件不存在");return false;}if (file1.isFile()) {filelist.add(file1);// 创建新的File对象,指定存储位置File file2 = new File(targetDir);// 文件目录存在则创建if (!file2.exists()) {file2.mkdir();}} else {// 创建新的File对象,指定存储位置File file2 = new File(targetDir, originalDir);// 调用遍历文件方法getFile(file1, file2);}return true;}// 遍历文件夹private void getFile(File dir1, File dir2) {// 文件夹不存在,则创建文件if (!dir2.exists()) {dir2.mkdirs();}// 获取该目录下文件数组File[] files = dir1.listFiles();// 遍历文件数组for (File file : files) {if (file.isDirectory()) {// 创建新的文件对象,指定保存路径File dir = new File(dir2, file.getName());// 递归调用getFile(file, dir);} else {// 添加至文件队列中filelist.add(file);}}}// 编码方法private void encode(String type1, String type2, String targetDir) {// 给队列中文件编码for (File file : filelist) {File file3;// 按原文件结构指定新文件的路径if (file.getParent() != null) {file3 = new File(targetDir + "\\" + file.getParent(), file.getName());} else {file3 = new File(targetDir, file.getName());}try {// 创建指定编码格式的字节转换流InputStreamReader isr = new InputStreamReader(new FileInputStream(file), type1);OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file3), type2);// 使用缓冲流对文件进行读写BufferedReader br = new BufferedReader(isr);BufferedWriter bw = new BufferedWriter(osw);String line;// 读写文件while ((line = br.readLine()) != null) {bw.write(line);bw.flush();bw.newLine();}br.close();// 关闭输入流bw.close();// 关闭输出流} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}// 编码完成提示信息JOptionPane.showMessageDialog(null, "编码完成!");}
}

注意事项:

1、对原文件进行判断:是否存在?文件还是目录?

2、地址使用:绝对地址还是相对地址?这里小编为了方便操作采用的是相对地址;

3、本文保存文件是在一个指定文件夹里按原文件结构进行保存;

4、使用readLine( )读取文件时,写入文件的时候需要注意换行。

四、小结

本文主要介绍了两种文件转码的方式,下载Eclipse插件和自己编写小程序,两种方式均可以达到批量文件转码的效果。使用Eclipse插件操作简单,不过可能会遇到一些小bug;而自己写小程序则更有成就感,用起来也更得心应手,不过需要熟练掌握转换流及文件操作等相关知识。

乱码解决(二)——文件转码相关推荐

  1. 文件传服务器上全是乱码,解决txt文件上传oss服务器乱码的问题

    今天上传txt文件下载下来却乱码,搞了一下午,发现还挺复杂.记录一下. 1.首先服务器只接受utf-8格式的文件,所以首先想到的就是转码问题. 这是网上很容易就找到的判断文件编码的代码.判断出来之后如 ...

  2. Gingko Framework:页面参数中文乱码解决

    Gingko Framework:页面参数中文乱码解决 在formbean中转码 // bname public String getBname() { return businesscode.get ...

  3. linux文件内容乱码怎么解决,window到linux文件名乱码和文件内容乱码解决总结

    window系统一般文件名编码为gbk,文件内容编码这个需要通过编辑器查看或者设置,找个editplus文本编辑器就可以处理文本内容编码. 那么在window上显示正常的文件到linux上的时候,常常 ...

  4. 20,sql 测试 : 1.4g 文件的 sql 运行测试,表关联,日期转换,字符编码,乱码解决,程序的 shell 执行,字符串转数字,三个隐式转换,用列分区,输出,sum over

    一 ,基础操作 : 1 ,表关联 : select stock.area,goods.smallLei,goods.typeColorId,weekofyear(to_date(stock.sellD ...

  5. jsoncpp中文乱码,中文显示为\u问题处理;jsoncpp中文乱码解决;源码方式使用jsoncpp;UTF_8和ASSIC相互转换;

    一.jsoncpp中文写入为\u****问题处理:jsoncpp中文乱码解决: 当我们使用jsoncpp读取写入json文件时,会发现明明是中文字符串,但是赋值给Json::Value后却变成\u** ...

  6. Hhadoop-2.7.0中HDFS写文件源码分析(二):客户端实现(1)

    一.综述 HDFS写文件是整个Hadoop中最为复杂的流程之一,它涉及到HDFS中NameNode.DataNode.DFSClient等众多角色的分工与合作. 首先上一段代码,客户端是如何写文件的: ...

  7. java中文乱码解决之道(二)—–字符编码详解:基础知识 + ASCII + GB**

    原文出处:http://cmsblogs.com/?p=1412 在上篇博文(java中文乱码解决之道(一)-–认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述 ...

  8. 解决Mac文件乱码问题

    <一行shell解决Mac文件乱码问题>   使用Mac工作的小伙伴,经常面对一个问题就是,同事发来的一个文件是乱码的,尝试各种工具进行解码,如果文件少还好,文件多,几乎是崩溃的,所以本文 ...

  9. [macOS]_[打开GBK-ANSI编码的中文字符文件乱码解决办法]

    场景 在中文Windows系统里使用VS开发时,它默认保存的.h,.cpp格式就是ANSI(GBK)编码, 这时如果我们做模块移植到macOS时,用TextEdit或者Xcode打开这个源码文件,如果 ...

最新文章

  1. Java中使用UUID给图片命名的文件上传方法
  2. 一文解决new/delete与malloc/free相关问题:区别?注意事项?使用方式?
  3. python单词的含义-python
  4. 红帽子企业版linux 7,红帽企业 Red Hat Enterprise Linux 7.8 发布
  5. iOS多线程开发之NSThread
  6. retrofit content-length为0_Retrofit 源码剖析
  7. 逻辑程序设计语言Prolog
  8. 安捷伦or是德信号源+频谱仪操作: 从程控到自动测试 (五)频谱仪截屏到U盘的程控实现
  9. android连接airprint打印机,完爆AirPrint 揭秘联想安卓终端乐打印
  10. 20210706_IEEEDataPort免费订阅
  11. GC回收算法--当女友跟你提分手!
  12. 为笔记本添加固态硬盘以及之后的分区方法分享
  13. 在kile上通过串口实现scanf输入和printf打印
  14. 差分信号,共模与差模,共模滤波,差模滤波
  15. 创建一个Android Cardboard 360 Video Viewer
  16. 有没有英语语音测试软件,没有雅思的高分女朋友虐你英语,就善用手机的app录音自测练习...
  17. javascript中reduce的用法
  18. android 反编译 脱壳,反编译、回编译、脱壳的简单测试
  19. 机房建设及装修工程技术
  20. 第三组 Alpha(3/3)

热门文章

  1. mac迅雷如何批量下载页面全部链接(无需插件,只需三步)
  2. 1350:面朝大海 春暖花开 [ 基础版 ]
  3. 夏洛克和他的女朋友(AcWing 1293)
  4. python对小数的特殊处理(个人需求-小数点后有一位保留,否则十分位进1)
  5. 魏兴国:深入浅出DDoS攻击防御
  6. 【观察】从智慧旅游到全域旅游,旅游产业的进化与变革
  7. IVR在voip电话系统的应用与价值
  8. 计算机信息技术在生活中的应用实例,电子信息技术在生活中的应用与发展
  9. 参加2020全国大学生数学建模竞赛有感
  10. oracle错误编号06512,一个得到输入汉字的拼音函数报ORA-06512 数字或值错误