我正在用Java制作一本小词典。我的问题是我无法随机访问二进制文件中的单词。例如,如果我有这样的意思:
播放
操作
杀死
单词操纵将比其他两个占据更多的字节。我想要做的是读取播放的程序以获取其位置,并跳三行语音,类型和含义,然后进行读取操作并获取其位置,以便以后可以访问它。 但是我可以因为所有单词都有不同的字节帮助!
public class BinaryIO {
public static void main (String [] args)
{
String file_name = "person.bin";
try {
FileOutputStream fileO = new FileOutputStream(new File("person.bin"));
DataOutputStream out = new DataOutputStream(fileO);
person teddy = new person();
teddy.name= "x";
teddy.address= " somwhere";
teddy.phone= " 484892";
out.writeObject(teddy);
out.close();
fileO.close();
} catch (FileNotFoundException e) {
System.out.println("file not found");
} catch (IOException e) {
System.out.println(" out failed");
}
System.out.println();
System.out.println("reading :");
try {
FileInputStream fileI = new FileInputStream(new File("ArtistName.bin"));
RandomAccessFile in = new RandomAccessFile(file_name, "r");
in.seek(12);
long len = in.length();
String str = in.readUTF();
System.out.println(str);
str = in.readUTF();
System.out.println(str);
System.out.println("length: " + len + "\n");
in.close();
} catch (FileNotFoundException e) {
System.out.println("file not found");
} catch (IOException e) {
System.out.println(" in failed");
}
}
}
答案 0 :(得分:0)
除非绝对要强制使用二进制文件,否则我将使用文本文件,其中将各个单词属性放在换行符上。我将每个单词的条目读入一个新的Person对象,并将该Person对象使用该单词作为哈希表的键放在哈希表中。
代码看起来像这样:
Hashtable<String, Person> hashtable = new Hashtable<String, Person>();
String Word, Pronounciation, Type, Meaning, RequiredWord;
Person RequiredObj;
try
{
BufferedReader br = new BufferedReader(new FileReader("dictionary.txt"));
while(br.ready())
{
Word = br.readLine();
Pronunciation = br.readLine();
Type = br.readLine();
Meaning = br.readLine();
if (Word != null && Pronunciation != null &&
Type != null && Meaning != null)
{
// Note: Make the Person object immutable and initialize all attributes
// in the constructor.
hashtable.put(Word, new Person(Word, Pronunciation, Type, Meaning));
}
else
{
break;
}
}
br.close();
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
// Get a Person object from the hash table.
RequiredObj = hashtable.get(RequiredWord);
如果必须使用二进制文件,则需要在文件顶部创建一个查找表,列出该文件中的每个单词以及与文件开头相对应的字节偏移量。每个单词的属性都需要用某种标记来区分,或者,每个属性可以以一个整数开始,该整数表示该属性占用了多少字节。但是,此实现非常混乱,如果需要快速访问单词定义,则会很慢。相比之下,哈希表超级快。
答案 1 :(得分:0)
解决方案是为每个条目创建一个定义的char
数组,然后任意跳到输入的开头,在我的情况下是在127个字节之后。