之前在网上查询了很多关于解决NIO中文乱码的问题,仁者见仁智者见智,不过就找到的几种方法实现都太繁琐了,稍微研究了下NIO源码,以下是我自己的一种实现,偷懒用最简单的代码去实现是我的习惯!

Demo:

  1. String backupPath = "备份文件夹的路径";
  2. backupPath += File.separator + "ERROR";
  3. File file = new File(filePath);
  4. File backupDirectory = new File("需要复制的文件夹全路径");
  5. if(!backupDirectory.exists()) {
  6. backupDirectory.mkdir();
  7. }
  8. //创建临时文件
  9. File backupFile = new File(backupPath + File.separator + file.getName());
  10. backupFile.createNewFile();
  11. FileOutputStream fos = new FileOutputStream(backupFile, false);
  12. FileInputStream fis = new FileInputStream(file);
  13. //获取输入通道
  14. FileChannel fc_in = fis.getChannel();
  15. //获取输出通道
  16. FileChannel fc_out = fos.getChannel();
  17. //创建缓冲区
  18. ByteBuffer buffer = ByteBuffer.allocate(102400);  //这里用1 或者 一个很大的数 比如1024比较小的数也是有几率出现乱码的
  19. CharBuffer charBuffer = CharBuffer.allocate(102400);
  20. char[] charCache = null;
  21. //字符编码
  22. Charset charset = Charset.forName("GBK");
  23. CharsetDecoder charDecoder = charset.newDecoder();
  24. //读取数据到缓冲区
  25. while((fc_in.read(buffer)) != -1) {
  26. buffer.flip();
  27. charDecoder.decode(buffer, charBuffer, true);
  28. charBuffer.flip();
  29. charCache =  new char[charBuffer.length()];
  30. while (charBuffer.hasRemaining()) {
  31. charBuffer.get(charCache);
  32. String str = new String(charCache);
  33. System.out.println(str);
  34. buffer = ByteBuffer.wrap(str.getBytes());
  35. }
  36. fc_out.write(buffer);
  37. charBuffer.clear();
  38. buffer.clear();
  39. }
  40. fis.close();
  41. fos.close();
		String backupPath = "备份文件夹的路径";
	backupPath += File.separator + "ERROR";

	File file = new File(filePath);

	File backupDirectory = new File("需要复制的文件夹全路径");

	if(!backupDirectory.exists()) {
backupDirectory.mkdir();
}
//创建临时文件
File backupFile = new File(backupPath + File.separator + file.getName()); backupFile.createNewFile(); FileOutputStream fos = new FileOutputStream(backupFile, false); FileInputStream fis = new FileInputStream(file);
//获取输入通道
FileChannel fc_in = fis.getChannel();
//获取输出通道
FileChannel fc_out = fos.getChannel();
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(102400); //这里用1 或者 一个很大的数 比如1024比较小的数也是有几率出现乱码的 CharBuffer charBuffer = CharBuffer.allocate(102400); char[] charCache = null; //字符编码
Charset charset = Charset.forName("GBK"); CharsetDecoder charDecoder = charset.newDecoder(); //读取数据到缓冲区
while((fc_in.read(buffer)) != -1) {
buffer.flip(); charDecoder.decode(buffer, charBuffer, true); charBuffer.flip(); charCache = new char[charBuffer.length()]; while (charBuffer.hasRemaining()) { charBuffer.get(charCache); String str = new String(charCache); System.out.println(str); buffer = ByteBuffer.wrap(str.getBytes());
} fc_out.write(buffer); charBuffer.clear(); buffer.clear(); } fis.close(); fos.close();</pre><br><br><p></p>






NIO 中文乱码问题的解决代码实现的更多相关文章

  1. Sublime Text 3中文乱码问题的解决(最有效)

    Sublime Text 3中文乱码问题的解决(最有效) Sublime Text 3是很好的代码编辑器,没有之一,因为她的性感高亮代码配色,更因为它的小巧,但是它默认不支持GBK的编码格式,因此打开 ...

  2. jquery.ajax的url中传递中文乱码问题的解决方法

    jquery.ajax的url中传递中文乱码问题的解决方法   JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQu ...

  3. eclipse中js中文乱码问题的解决办法

    在Eclipse中编辑JS文件简直是一种折磨,但是却总是很无奈得要去适应. 这里说一下Eclipse中,编辑JS文件时候,出现中文乱码问题的解决办法. 这个问题很容易想到是文件编码的问题,因此通常是修 ...

  4. XAMPP下MYSQL中文乱码问题的解决

    XAMPP下MYSQL中文乱码问题的解决 现象描述: 安装完成XAMMP后,内置有MySQL数据库. 新建好自己的数据库后通过hibernate往表里面添加一些中文信息时全部乱码变成“??”. 问题解 ...

  5. Rhythmbox中文乱码问题的解决

    Rhythmbox中文乱码问题的解决 Rhythmbox是Ubuntu自带的一款很优秀的音乐播放器,但是在处理中文时却不太友好,导入歌曲时中文会变成乱码 这个问题也是很好解决的. ** 1.Ctrl+ ...

  6. (转)MySQL 插入数据时,中文乱码问题的解决

    MySQL 插入数据时,中文乱码问题的解决  原文:http://www.cnblogs.com/sunzn/archive/2013/03/14/2960248.html 当向 MySQL 数据库插 ...

  7. windows下mysql中文乱码, 配置解决方法

    内容源自:windows下mysql中文乱码, 配置解决方法 解决方法:打开mysql安装目录,打开my.ini文件(如果只有my-default.ini文件,先将其改名为my.ini!!!) 修改内 ...

  8. Pycharm 输出中文或打印中文乱码现象的解决办法

    1. 确保文件开头加上以下代码: # -*- coding:utf-8 -*- 还可以加上 import sys reload(sys) sys.setdefaultencoding('utf-8') ...

  9. get/post时中文乱码问题的解决办法

    1.文章1 最近遇到一个问题:用get方法传递中文有问题,用post没有问题. 问题简单的描述是这样的: <a href="userGroup.jsp?userGroupName=&l ...

随机推荐

  1. select2 如何自定义提示信息-布布扣-bubuko.com

    标签:color   dom   layui   href   默认事件   替换   each   ase   options 最近项目中使用到了select2来美化和丰富下拉框的功能,这款插件功能 ...

  2. Laravel 使用 JWT 做 API 认证之tymon/jwt-auth 1.0.0-beta.1实践 - moell - SegmentFault

    安装 将"tymon/jwt-auth": "1.0.0-beta.1" 添加到 composer.json 中,执行 composer update Prov ...

  3. 验证python中函数传参是引用传递

    定义: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...

  4. js里面的this指向

    1.  this是动态绑定的,或者说是在代码运行期绑定而不是在书写期 function fire () { console.log(this.a) } var obj = { a: 1, fire: ...

  5. 【django后端分离】mysql原生查询命令后,RawQueryset类型的自定义序列化返回json格式

    1:设置mysql原生分页 # 监控系统首页显示分页 def MyPagination(limitid,offsetid): limitid =str(limitid) offsetid =str(o ...

  6. Docker的asp.net core应用部署系列——docker pull 加速

    原文:Docker的asp.net core应用部署系列--docker pull 加速 版权声明:本文为博主原创文章,随意转载. https://blog.csdn.net/Michel4Liu/a ...

  7. cnn.py cs231n

    n import numpy as np from cs231n.layers import * from cs231n.fast_layers import * from cs231n.layer_ ...

  8. LintCode_69 二叉树前序遍历

    题目 给出一棵二叉树,返回其节点值的前序遍历. 和中序遍历基本相同 C++代码 vector<int> preorderTraversal(TreeNode *root) { // wri ...

  9. C​#​字​符​串​与​ ​b​y​t​e​数​据​的​互​相​转​换

    string和byte[]的转换 (C#) string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( s ...

  10. MySQL非安装版安装

    1 数据库的打开方式(非安装版本) 1.解压mysql-5.7.12-winx64.zip到一个路径上没有空格没有汉字的目录中 2.复制my-default.ini重命名为my.ini 3.命令行进入 ...