1

1250 でエンコードされた大きなファイルがあります。

zając
dzieło
kiepsko
etc

このファイルからランダムな 10 行を非常に高速な方法で選択する必要があります。私はこれを行いましたが、これらの単語を印刷すると、[zaj?c、dzie?o、kiepsko...] のエンコーディングが間違っているため、UTF8 が必要です。そこで、行を読み取るだけでなく、ファイルからバイトを読み取るようにコードを変更したため、私の努力は次のコードになりました。

public List<String> getRandomWordsFromDictionary(int number) {
    List<String> randomWords = new ArrayList<String>();
    File file = new File("file.txt");
    try {
        RandomAccessFile raf = new RandomAccessFile(file, "r");

        for(int i = 0; i < number; i++) {
            Random random = new Random();
            int startPosition;
            String word;
            do {
                startPosition = random.nextInt((int)raf.length());
                raf.seek(startPosition);
                raf.readLine();
                word = grabWordFromDictionary(raf);
            } while(checkProbability(word));
            System.out.println("Word: " + word);
            randomWords.add(word);
        }
    } catch (IOException ioe) {
        logger.error(ioe.getMessage(), ioe);
    }
    return randomWords;
}

private String grabWordFromDictionary(RandomAccessFile raf) throws IOException {
    byte[] wordInBytes = new byte[15];
    int counter = 0;
    byte wordByte;
    char wordChar;
    String convertedWord;
    boolean stop = true;
    do {
        wordByte = raf.readByte();
        wordChar = (char)wordByte;
        if(wordChar == '\n' || wordChar == '\r' || wordChar == -1) {
            stop = false;
        } else {
            wordInBytes[counter] = wordByte;
            counter++;
        }           
    } while(stop);
    if(wordInBytes.length > 0) {
        convertedWord = new String(wordInBytes, "UTF8");
        return convertedWord;
    } else {
        return null;
    }
}

private boolean checkProbability(String word) {
    if(word.length() > MAX_LENGTH_LINE) {
        return true;
    } else {
        double randomDouble = new Random().nextDouble();
        double probability = (double) MIN_LENGTH_LINE / word.length();
        return probability <= randomDouble;         
    }
}

しかし、何かが間違っています。このコードを見て、私を助けてくれませんか? 明らかなエラーが表示されるかもしれませんが、私には明らかではありませんか? どんな助けにも感謝します。

4

1 に答える 1

4

ファイルは 1250 であるため、UTF-8 ではなく 1250 でデコードする必要があります。ただし、デコード処理後に UTF-8 として保存できます。

Charset w1250 = Charset.forName("Windows-1250");
convertedWord = new String(wordInBytes, w1250);
于 2012-12-13T22:04:39.303 に答える