配偶!RandomAccessFile閱讀西里爾文UTF-8 java
我無法使用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);
}
}
}
您的預期產量是多少? –
@SotiriosDelimanolis,upd – NinjaTurtle
如果您按順序讀取/寫入,'java.io.Writer'和'Reader'會封裝一個OutputStream/InputStream併爲您處理UTF-8或其他字符編碼。你確定這些不會是更好的解決方案嗎? –