欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java IO文件编码转换实现代码

程序员文章站 2024-02-20 14:29:46
对io操作真心不是很懂。。。对编码、乱码也是一知半解。。。今天遇到了一个需求,要求将一个文件进行编码转换,并且返回编码后的字符串,如原本的gbk编码,转换为utf-8 其...

对io操作真心不是很懂。。。对编码、乱码也是一知半解。。。今天遇到了一个需求,要求将一个文件进行编码转换,并且返回编码后的字符串,如原本的gbk编码,转换为utf-8

其中这个bytesencodingdetect 类就不贴了。主要用了里面的获取文件编码格式。

刚开始试了直接在源文件修改编码方式,采用urlencoder和urldecoder进行转换,却迟迟不行。出现了中文奇数最后一个字乱码

百度找了解决方法,都未果,只好采用我的思路是:先读取源文件的内容,存放到stringbuffer里面,然后删除源文件,再重新new一个文件,再以另一中编码形式存放进去。

查看编码后效果:注意不要在eclipse查看效果,eclipse以一种编码形式查看而已,所以可以在浏览器端查看如html文件,查看指定编码可以右键---编码,以此来判断是否成功。

复制代码 代码如下:

package com.test;
import java.io.bufferedreader;
import java.io.bufferedwriter;
import java.io.file;
import java.io.fileinputstream;
import java.io.fileoutputstream;
import java.io.inputstream;
import java.io.inputstreamreader;
import java.io.outputstream;
import java.io.outputstreamwriter;
import java.net.urldecoder;
import java.net.urlencoder;

public class transcoding {
 private bytesencodingdetect encode = new bytesencodingdetect();
 public transcoding() {
 }

 /**
  * 编码转换
  * @param tocharset 要转换的编码
  * @param path 要转换的文件路径
  * @return
  * @throws exception
  */
 public string encoding(string tocharset, string path) throws exception{
  file srcfile = new file(path);
  int index = encode.detectencoding(srcfile);
  string charset = bytesencodingdetect.javaname[index];
  // 编码相同,无需转码
  if (charset.equalsignorecase(tocharset)) {
   return "编码一样,无需转换";
  }

  inputstream in = new fileinputstream(path);

  bufferedreader br = new bufferedreader(
    new inputstreamreader(in, charset));

  stringbuffer sb = new stringbuffer();
  string s1;
  while ((s1=br.readline())!=null) {
   string s = urlencoder.encode(s1, tocharset);
   sb.append(s+"\r\n");//一行+回车
  }

  br.close();
  srcfile.delete();//删除原来文件
  //重新以新编码写入文件并返回值
  file newfile = new file(path);//重新建原来的文件
  newfile.createnewfile();
  outputstream out = new fileoutputstream(newfile);
  outputstreamwriter  writer = new outputstreamwriter(out, tocharset);
  bufferedwriter bw = new bufferedwriter(writer);
  bw.write(urldecoder.decode(sb.tostring(), tocharset));
  string result = urldecoder.decode(sb.tostring(), tocharset);
  bw.flush();//刷到文件中
  bw.close();
  return result;
 }

}