方法一:java.lang.String
- 用于解码的构造器:
1. String(byte[] bytes, int offset, int
2. String(byte[] bytes, String charsetName)
3.
4. 用于编码的方法:
5. byte[] getBytes(String charsetName) //使用指定字符集进行编码
6. byte[] getBytes() //使用系统默认字符集进行编码
1. public void convertionString() throws UnsupportedEncodingException{
2. "清山";
3. "gbk");//编码
4. "gbk");//解码:用什么字符集编码就用什么字符集解码
5. System.out.println(sa);
6.
7. "utf-8");//编码
8. "utf-8");//解码
9. System.err.println(sa);
10. }
方法二:java.io.InputStreamReader/OutputStreamWriter:桥转换
1. package
2.
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10. import
11.
12. /**
13. * <pre>
14. * 使用java.io桥转换:对文件进行转码
15. * </pre>
16. * <hr Color="green" ></hr>
17. * 2012 Qingshan Group 版权所有
18. * <hr Color="green" ></hr>
19. * @author thetopofqingshan
20. * @version 1.0.0
21. * @since JDK 1.5
22. * @date 2012-4-28
23. */
24. public class
25. private FileInputStream fis;// 文件输入流:读取文件中内容
26. private
27. private
28. private
29. private OutputStreamWriter osw;//写入
30. private char[] ch = new char[1024];
31. public void convertionFile() throws
32. new FileInputStream("C:/项目进度跟踪.txt");//文件读取
33. new InputStreamReader(is, "gbk");//解码
34. new FileOutputStream("C:/项目进度跟踪_utf-8.txt");//文件输出
35. new OutputStreamWriter(os, "utf-8");//开始编码
36. char[] c = new char[1024];//缓冲
37. int length = 0;
38. while(true){
39. length = isr.read(c);
40. if(length == -1){
41. break;
42. }
43. new String(c, 0, length));
44. 0, length);
45. osw.flush();
46. }
47.
48. }
49.
50. public void convertionString() throws
51. "清山集团";
52. byte[] b = s.getBytes("gbk");//编码
53. new String(b, "gbk");//解码:用什么字符集编码就用什么字符集解码
54. System.out.println(sa);
55.
56. "utf-8");//编码
57. new String(b, "utf-8");//解码
58. System.err.println(sa);
59. }
60.
61.
62.
63. /**
64. * <pre>
65. * 关闭所有流
66. * </pre>
67. *
68. */
69. public void
70. if(isr != null){
71. try
72. isr.close();
73. catch
74. e.printStackTrace();
75. }
76. }
77. if(is != null){
78. try
79. is.close();
80. catch
81. // TODO Auto-generated catch block
82. e.printStackTrace();
83. }
84. }
85.
86. if(osw != null){
87. try
88. osw.close();
89. catch
90. // TODO Auto-generated catch block
91. e.printStackTrace();
92. }
93. }
94.
95. if(os != null){
96. try
97. os.close();
98. catch
99. // TODO Auto-generated catch block
100. e.printStackTrace();
101. }
102. }
103. }
104.
105. /**
106. * <pre>
107. * 用io读取文件内容
108. * </pre>
109. *
110. * @throws IOException
111. * 读取过程中发生错误
112. *
113. */
114.
115. /**
116. * <pre>
117. *
118. * </pre>
119. * @param path
120. * @param charset
121. * @throws IOException
122. *
123. */
124. public void read(String path, String charset) throws
125. new
126. new
127. while (fis.available() > 0) {
128. int
129. new
130. }
131. }
132.
133.
134. public static void
135. try
136. new
137. cc.convertionFile();
138. cc.convertionString();
139. cc.close();
140. catch
141. e.printStackTrace();
142. }
143. }
144. }
方法三:java.nio.Charset
1. package
2.
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10. import
11. import
12. import
13.
14. /**
15. * <pre>
16. * 使用nio中的Charset转换字符:整个流程是文件读取-->byte-->解码(正确)-->编码--->byte-->写入文件
17. * </pre>
18. * <hr Color="green" >
19. * </hr>
20. * 2012 Qingshan Group 版权所有
21. * <hr Color="green" >
22. * </hr>
23. *
24. * @author thetopofqingshan
25. * @version 1.0.0
26. * @since JDK 1.5
27. * @date 2012-4-27
28. */
29. public class
30. private FileInputStream fis;// 文件输入流:读取文件中内容
31. private FileChannel in;// 文件通道:双向,流从中而过
32. private FileChannel out;// 文件通道:双向,流从中而过
33. private FileOutputStream fos;// 文件输出流:向文件中写入内容
34. private ByteBuffer b = ByteBuffer.allocate(1024 * 3);// 设置缓存区的大小
35. private Charset inSet;// 解码字符集
36. private Charset outSet;// 编码字符集
37. private CharsetDecoder de;// 解码器
38. private CharsetEncoder en;// 编码器
39. private CharBuffer convertion;// 中间的字符数据
40. private ByteBuffer temp = ByteBuffer.allocate(1024 * 3);// 设置缓存区的大小:临时
41. private byte[] by = new byte[1024];
42. private
43. private char[] ch = new char[1024];
44.
45. /**
46. * <pre>
47. *
48. * </pre>
49. *
50. * @param src
51. * @param dest
52. * @throws IOException
53. *
54. */
55. public void convertionFile_nio(String src, String dest) throws
56. new
57. in = fis.getChannel();
58. new
59. out = fos.getChannel();
60. "gbk");
61. "utf-8");
62. de = inSet.newDecoder();
63. en = outSet.newEncoder();
64. while (fis.available() > 0) {
65. // 清除标记
66. // 将文件内容读入到缓冲区内:将标记位置从0-b.capacity(),
67. // 读取完毕标记在0-b.capacity()之间
68. // 调节标记,下次读取从该位置读起
69. // 开始编码
70.
71. // 清除标记
72. temp = en.encode(convertion);
73. // 将标记移到缓冲区的开始,并保存其中所有的数据:将标记移到开始0
74. // 将缓冲区内的内容写入文件中:从标记处开始取出数据
75. }
76. }
77.
78. /**
79. * <pre>
80. * 测试转码是否成功, 指定字符集读取文件
81. * </pre>
82. *
83. * @param src
84. * 被复制文件全路径
85. * @param charset 解码字符集
86. *
87. * @throws IOException 读取过程中的发生的异常
88. *
89. */
90. public void read(String path, String charset) throws
91. new
92. new
93. while (fis.available() > 0) {
94. int
95. new
96. }
97. }
98.
99. /**
100. * <pre>
101. * 关闭所有流或通道
102. * </pre>
103. *
104. */
105. public void
106. try
107. if (in != null) {
108. in.close();
109. }
110. catch
111. e.printStackTrace();
112. }
113.
114. try
115. if (out != null) {
116. out.close();
117. }
118. catch
119. e.printStackTrace();
120. }
121.
122. try
123. if (fis != null) {
124. fis.close();
125. }
126. catch
127. e.printStackTrace();
128. }
129.
130. try
131. if (fos != null) {
132. fos.close();
133. }
134. catch
135. e.printStackTrace();
136. }
137. }
138.
139. public static void
140. new
141. try
142. "C:/项目进度跟踪.txt", "C:/nio_write.txt");
143. // n.read("C:/nio_write.txt", "utf-8");// 正确
144. // n.read("C:/nio_write.txt", "gbk");//乱码
145. catch
146. e.printStackTrace();
147. finally
148. n.close();
149. }
150. }
151.
152. }