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