0

仲間!

を使用してファイルからキリル文字を読み取るのに問題がありますRandomAccessFile

以下は、そのような形式を使用して特定のファイル (キリル文字) に情報を書き込む簡単なプログラムです。

keyLength, valueLength, key, value

次に、プログラムはこの情報を読み取ろうとしますが、私の出力は正しくありません:

writing success
keyLength = 10, valueLength = 4
read: килло, гр

UPD 期待される出力:

writing success
keyLength = 10, valueLength = 4
read: киллограмм, сала

何が問題ですか?(脳が小さいという問題を除く)

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        String fileName = "file.db";
        RandomAccessFile outputFile = null;

        try {
            outputFile = new RandomAccessFile(fileName, "rw");
        } catch (FileNotFoundException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

        String key = "киллограмм";
        String value = "сала";

        try {
            outputFile.writeInt(key.length());
            outputFile.writeInt(value.length());

            outputFile.write(key.getBytes("UTF-8"));
            outputFile.write(value.getBytes("UTF-8"));
        } catch (IOException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

        System.out.println("writing success");

        RandomAccessFile inputFile = null;

        try {
            inputFile = new RandomAccessFile(fileName, "r");
        } catch (FileNotFoundException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

        int keyLength = 0, valueLength = 0;

        try {
            keyLength = inputFile.readInt();
            valueLength = inputFile.readInt();
        } catch (IOException e) {
            System.err.println(e.getMessage());
        }

        System.out.println("keyLength = " + keyLength + ", valueLength = " + valueLength);
        if (keyLength <= 0 || valueLength <= 0) {
            System.err.println("key or value length is negative");
            System.exit(1);
        }

        byte[] keyBytes = null, valueBytes = null;

        try {
            keyBytes = new byte[keyLength];
            valueBytes = new byte[valueLength];
        } catch (OutOfMemoryError e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

        try {
            inputFile.read(keyBytes);
            inputFile.read(valueBytes);
        } catch (IOException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

        try {
            System.out.println("read: " + new String(keyBytes, "UTF-8") + ", " + new String(valueBytes, "UTF-8"));
        } catch (IOException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

    }
}
4

1 に答える 1

2

お題はこれ

outputFile.writeInt(key.length());

String#length()

この文字列の長さを返します。長さは、文字列内の Unicode コード単位の数と同じです。

この場合、10この文字列を表すのに必要なバイト数ではない value を返します。

あなたが欲しいのは

key.getBytes("UTF-8").length

使用されます

byte[] keyBytes = key.getBytes("UTF-8");
outputFile.writeInt(keyBytes.length);

についても同じですvalue

于 2013-10-27T23:33:50.113 に答える