java - readChar() 方法显示日文字符
问题描述
我正在尝试编写一个代码,根据用户输入的索引从文件中提取一个单词,但问题是该类中的方法readChar()
正在RandomAccessFile
返回日文字符,我必须承认这不是第一次我在我的联想笔记本电脑上看到过这个,有时在一些安装向导上我可以看到混合了普通字符和日文字符的混合内容,你认为它来自笔记本电脑还是来自代码?
这是代码:
package com.project;
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
int N, i=0;
char C;
char[] charArray = new char[100];
String fileLocation = "file.txt";
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
do {
System.out.println("enter the index of the word");
N = Integer.parseInt(buffer.readLine());
if (N!=0) {
RandomAccessFile word = new RandomAccessFile(new File(fileLocation), "r");
do {
word.seek((2*(N-1))+i);
C = word.readChar();
charArray[i] = C;
i++;
}while(charArray[i-1] != ' ');
System.out.println("the word of index " + N + " is: " );
for (char carTemp : charArray )
System.out.print(carTemp);
System.out.print("\n");
}
}while(N!=0);
buffer.close();
}
}
我得到这个输出:
瑯潕啰灰灥敲牃䍡慳獥攨⠩⤍ഊੴ瑯潌䱯潷睥敲牃䍡慳獥攨⠩⤍ഊ捯潭浣捡慴琨⡓却瑲物楮湧朩⤍ഊ捨桡慲牁䅴琨⡩楮湴琩⤍ഊੳ獵畢扳獴瑲物楮湧木⠠獴瑡慲牴琠楮湤摥數砬Ⱐ敮湤搠楮湤摥數砩⤍ഊੴ瑲物業洨⠩Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 100 out of bounds for length 100
at Main.main(Main.java:21)
解决方案
char
是16位,即2个字节。
seek
寻找字节边界。
如果文件包含字符,那么它们的偏移量是偶数:0、2、4...
表达式(2*(N-1))+i)
是偶数当且仅当i
;如果奇怪,你肯定会落在一个字符的中间,从而读取垃圾。
i
从零开始,但您增加 1,即半个字符。
您的 seek 参数可能应该是(2*(N-1+i))
.
替代解释:您的文件根本不包含chars
;例如,您创建了一个字符为单字节的 ASCII 文件。
在这种情况下,错误是尝试使用readChar
函数读取 ASCII(过时的字符编码)。
但如果文件包含 ASCII,则在 seek 参数中乘以 2 的目的就很模糊了。它显然没有任何用处。
推荐阅读
- python - 如何将我的 DataFrame 转换为正态分布?
- python - 玩循环
- javascript - Can I declare globals to Flow in the same file?
- r - 请求 rvest 同意 cookie 的抓取网站
- javascript - 根据属性值为折线图中的垂直线分配不同的颜色
- discord - JDA - 如何等待下一条消息
- c# - 如何自动在表中每 10 行添加一个新行?
- javascript - 当第二个 td 包含单词时,在第一个 td 中选择输入
- java - 使用 char 的 SQLite 检查约束
- cmake - 如何编写特定的多目标并行可构建 CMakeLists.txt?