# swing-note **Repository Path**: clock9527/swing-note ## Basic Information - **Project Name**: swing-note - **Description**: 使用Java Swing 结合 Java NIO 实现一个简单的记事本 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2022-04-25 - **Last Updated**: 2022-04-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Swing Note - __开发工具:eclipse__ - __jdk版本:1.8__ - __UI: Java Swing__ ## 概述 通过Java swing结合Java NIO 编写的记事本小程序 ### 通过UTF-8编码读取中文时乱码问题结局 在使用UTF-8编码读取文件时,由于UTF-8是不定长编码,且我们给定的Bufer的大小是固定的,所以可能存在有时候读取了一个汉字的部分字节,而不是所有字节,这时候就会出现乱码。 #### 解决方法 我们可以使用CharsetDecoder类里的decode方法将字节缓冲区中的字符通过UTF-8进行编码后放到临时的字符缓冲区中进行处理。 ~~~java public String readFile(String filePath) { StringBuilder sb = new StringBuilder(); Charset charset = Charset.forName(StandardCharsets.UTF_8.name()); CharsetDecoder decoder = charset.newDecoder(); char[] charCache = null; int leftNum = 0; try (RandomAccessFile file = new RandomAccessFile(filePath, "rw"); FileChannel fileChannel = file.getChannel();) { ByteBuffer bBuf = ByteBuffer.allocate(1024); CharBuffer cBuf = CharBuffer.allocate(1024); while (fileChannel.read(bBuf) != -1) { bBuf.flip(); //从给定的输入缓冲区解码尽可能多的字节,将结果写入到给定的缓冲区 decoder.decode(bBuf, cBuf, true); cBuf.flip(); //判断bBuf中是否有未被解码的字符,如果有,则将它添加到remainByte数组中 charCache = new char[cBuf.length()]; //处理解码成功的字符集 while (cBuf.hasRemaining()) { cBuf.get(charCache); sb.append(charCache); } //转为写入模式 bBuf.compact(); cBuf.clear(); //如果remainByte也就是未被解析的数组中存在元素,则把这些未被解码的字符重新放回到bBuf中进行下一轮的解码 } } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } ~~~