首页 > 解决方案 > 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)

标签: javarandomaccessfile

解决方案


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 的目的就很模糊了。它显然没有任何用处。


推荐阅读