java字符转码的三种方法总结及实例

java字符转码:三种方法

转码成功的前提:解码后无乱码

转码流程:文件(gbk)-->解码-->编码--->文件(utf-8)

注:如有问题请留言

下面具体的实例

 方法一:Java.lang.String

//用于解码的构造器:
String(byte[] bytes, int offset, int length, String charsetName)
String(byte[] bytes, String charsetName)  

用于编码的方法:
byte[] getBytes(String charsetName) //使用指定字符集进行编码
 byte[] getBytes() //使用系统默认字符集进行编码
public void convertionString() throws UnsupportedEncodingException{
    String s = "清山";
    byte[] b = s.getBytes("gbk");//编码
    String sa = new String(b, "gbk");//解码:用什么字符集编码就用什么字符集解码
    System.out.println(sa); 

    b = sa.getBytes("utf-8");//编码
    sa = new String(b, "utf-8");//解码
    System.err.println(sa);
  }

方法二:java.io.InputStreamReader/OutputStreamWriter:桥转换 

package com.qingshan.io; 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException; 

/**
 * <pre>
 * 使用java.io桥转换:对文件进行转码
 * </pre>
 * <hr Color="green" ></hr>
 * 2012 Qingshan Group 版权所有
 * <hr Color="green" ></hr>
 * @author thetopofqingshan
 * @version 1.0.0
 * @since  JDK 1.5
 * @date  2012-4-28
 */
public class CharsetConvertion {
  private FileInputStream fis;// 文件输入流:读取文件中内容
  private InputStream is;
  private InputStreamReader isr;
  private OutputStream os;
  private OutputStreamWriter osw;//写入
  private char[] ch = new char[1024];
  public void convertionFile() throws IOException{
    is = new FileInputStream("C:/项目进度跟踪.txt");//文件读取
    isr = new InputStreamReader(is, "gbk");//解码
    os = new FileOutputStream("C:/项目进度跟踪_utf-8.txt");//文件输出
    osw = new OutputStreamWriter(os, "utf-8");//开始编码
    char[] c = new char[1024];//缓冲
    int length = 0;
    while(true){
      length = isr.read(c);
      if(length == -1){
        break;
      }
      System.out.println(new String(c, 0, length));
      osw.write(c, 0, length);
      osw.flush();
    } 

  } 

  public void convertionString() throws UnsupportedEncodingException{
    String s = "清山集团";
    byte[] b = s.getBytes("gbk");//编码
    String sa = new String(b, "gbk");//解码:用什么字符集编码就用什么字符集解码
    System.out.println(sa); 

    b = sa.getBytes("utf-8");//编码
    sa = new String(b, "utf-8");//解码
    System.err.println(sa);
  } 

  /**
   * <pre>
   * 关闭所有流
   * </pre>
   *
   */
  public void close(){
    if(isr != null){
      try {
        isr.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    if(is != null){
      try {
        is.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    } 

    if(osw != null){
      try {
        osw.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    } 

    if(os != null){
      try {
        os.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  } 

  /**
   * <pre>
   * 用io读取文件内容
   * </pre>
   *
   * @throws IOException
   *       读取过程中发生错误
   *
   */ 

  /**
   * <pre>
   *
   * </pre>
   * @param path
   * @param charset
   * @throws IOException
   *
   */
  public void read(String path, String charset) throws IOException {
    fis = new FileInputStream(path);
    isr = new InputStreamReader(fis, charset);
    while (fis.available() > 0) {
      int length = isr.read(ch);
      System.out.println(new String(ch));
    }
  } 

  public static void main(String[] args) {
    try {
      CharsetConvertion cc = new CharsetConvertion();
      cc.convertionFile();
      cc.convertionString();
      cc.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

方法三:java.nio.Charset

package com.qingshan.nio; 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder; 

/**
 * <pre>
 * 使用nio中的Charset转换字符:整个流程是文件读取-->byte-->解码(正确)-->编码--->byte-->写入文件
 * </pre>
 * <hr Color="green" >
 * </hr>
 * 2012 Qingshan Group 版权所有
 * <hr Color="green" >
 * </hr>
 *
 * @author thetopofqingshan
 * @version 1.0.0
 * @since JDK 1.5
 * @date 2012-4-27
 */
public class CharsetConvertion {
  private FileInputStream fis;// 文件输入流:读取文件中内容
  private FileChannel in;// 文件通道:双向,流从中而过
  private FileChannel out;// 文件通道:双向,流从中而过
  private FileOutputStream fos;// 文件输出流:向文件中写入内容
  private ByteBuffer b = ByteBuffer.allocate(1024 * 3);// 设置缓存区的大小
  private Charset inSet;// 解码字符集
  private Charset outSet;// 编码字符集
  private CharsetDecoder de;// 解码器
  private CharsetEncoder en;// 编码器
  private CharBuffer convertion;// 中间的字符数据
  private ByteBuffer temp = ByteBuffer.allocate(1024 * 3);// 设置缓存区的大小:临时
  private byte[] by = new byte[1024];
  private InputStreamReader isr;
  private char[] ch = new char[1024]; 

  /**
   * <pre>
   *
   * </pre>
   *
   * @param src
   * @param dest
   * @throws IOException
   *
   */
  public void convertionFile_nio(String src, String dest) throws IOException {
    fis = new FileInputStream(src);
    in = fis.getChannel();
    fos = new FileOutputStream(dest);
    out = fos.getChannel();
    inSet = Charset.forName("gbk");
    outSet = Charset.forName("utf-8");
    de = inSet.newDecoder();
    en = outSet.newEncoder();
    while (fis.available() > 0) {
      b.clear();// 清除标记
      in.read(b); // 将文件内容读入到缓冲区内:将标记位置从0-b.capacity(),
            // 读取完毕标记在0-b.capacity()之间
      b.flip();// 调节标记,下次读取从该位置读起
      convertion = de.decode(b);// 开始编码 

      temp.clear();// 清除标记
      temp = en.encode(convertion);
      b.flip(); // 将标记移到缓冲区的开始,并保存其中所有的数据:将标记移到开始0
      out.write(temp); // 将缓冲区内的内容写入文件中:从标记处开始取出数据
    }
  } 

  /**
   * <pre>
   * 测试转码是否成功, 指定字符集读取文件
   * </pre>
   *
   * @param src
   *      被复制文件全路径
   * @param charset 解码字符集
   *
   * @throws IOException 读取过程中的发生的异常
   *
   */
  public void read(String path, String charset) throws IOException {
    fis = new FileInputStream(path);
    isr = new InputStreamReader(fis, charset);
    while (fis.available() > 0) {
      int length = isr.read(ch);
      System.out.println(new String(ch));
    }
  } 

  /**
   * <pre>
   * 关闭所有流或通道
   * </pre>
   *
   */
  public void close() {
    try {
      if (in != null) {
        in.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    } 

    try {
      if (out != null) {
        out.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    } 

    try {
      if (fis != null) {
        fis.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    } 

    try {
      if (fos != null) {
        fos.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  } 

  public static void main(String[] args) {
    CharsetConvertion n = new CharsetConvertion();
    try {
       n.convertionFile_nio("C:/项目进度跟踪.txt", "C:/nio_write.txt");
//     n.read("C:/nio_write.txt", "utf-8");// 正确
      // n.read("C:/nio_write.txt", "gbk");//乱码
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      n.close();
    }
  } 

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • java字符转码的三种方法总结及实例

    java字符转码:三种方法 转码成功的前提:解码后无乱码 转码流程:文件(gbk)-->解码-->编码--->文件(utf-8) 注:如有问题请留言 下面具体的实例  方法一:Java.lang.String //用于解码的构造器: String(byte[] bytes, int offset, int length, String charsetName) String(byte[] bytes, String charsetName) 用于编码的方法: byte[] getByte

  • Java追加文件内容的三种方法实例代码

    整理文档,搜刮出一个Java追加文件内容的三种方法的代码,稍微整理精简一下做下分享. import Java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.RandomAccessFile;

  • java 获取当前时间的三种方法

    总结java里面关于获取当前时间的一些方法 System.currentTimeMillis() 获取标准时间可以通过System.currentTimeMillis()方法获取,此方法不受时区影响,得到的结果是时间戳格式的.例如: 1543105352845 我们可以将时间戳转化成我们易于理解的格式 SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); Date date = n

  • java调用Restful接口的三种方法

    目录 1,基本介绍 2,HttpURLConnection实现 3.HttpClient实现 4.Spring的RestTemplate 1,基本介绍 Restful接口的调用,前端一般使用ajax调用,后端可以使用的方法比较多, 本次介绍三种: 1.HttpURLConnection实现 2.HttpClient实现 3.Spring的RestTemplate 2,HttpURLConnection实现 @Controller public class RestfulAction { @Aut

  • Java项目实现定时任务的三种方法

    目录 1 使用java.util.Timer 2 使用ScheduledExecutorService 3 使用Spring Task 总结 1 使用java.util.Timer 这种方式的定时任务主要用到两个类,Timer 和 TimerTask,使用起来比较简单.其中 Timer 负责设定 TimerTask 的起始与间隔执行时间. TimerTask是一个抽象类,new的时候实现自己的 run 方法,然后将其丢给 Timer 去执行即可. 代码示例: import java.time.L

  • Java复制文件常用的三种方法

    复制文件的三种方法: 1.Files.copy(path, new FileOutputStream(dest));. 2.利用字节流. 3.利用字符流. 代码实现如下: package com.tiger.io; import java.io.*; import java.nio.file.*; /** * 复制文件的三种方式 * @author tiger * @Date */ public class CopyFile { public static void main(String[]

  • java读取文件内容的三种方法代码片断分享(java文件操作)

    复制代码 代码如下: try {           // 方法一           BufferedReader br = new BufferedReader(new FileReader(new File(                   "D:\\1.xls")));           // StringBuilder bd = new StringBuilder();           StringBuffer bd = new StringBuffer();   

  • Java中终止线程的三种方法

    Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的! 1.线程正常执行完毕,正常结束 也就是让run方法执行完毕,该线程就会正常结束. 但有时候线程是永远无法结束的,比如while(true). 2.监视某些条件,结束线程的不间断运行 需要while()循环在某以特定条件下退出,最直接的办法就是设一个boolean标志,并通过设置这个标志来控制循环

  • pygame学习笔记(2):画点的三种方法和动画实例

    1.单个像素(画点) 利用pygame画点主要有三种方法: 方法一:画长宽为1个像素的正方形 复制代码 代码如下: import pygame,sys pygame.init() screen=pygame.display.set_caption('hello world!') screen=pygame.display.set_mode([640,480]) screen.fill([255,255,255]) pygame.draw.rect(screen,[0,0,0],[150,50,1

  • java 字符串分割的三种方法(总结)

    最近在项目中遇到一个小问题,一个字符串分割成一个数组,类似String str="aaa,bbb,ccc"; 然后以","为分割符,将其分割成一个数组,用什么方法去实现呢? 第一种方法: 可能一下子就会想到使用split()方法,用split()方法实现是最方便的,但是它的效率比较低 第二种方法: 使用效率较高的StringTokenizer类分割字符串,StringTokenizer类是JDK中提供的专门用来处理字符串分割子串的工具类.它的构造函数如下: publ

随机推荐