如何访问随机跳至恒定位置的二进制文件

时间:2019-10-05 12:29:35

标签: java

我正在用Java制作一本小词典。我的问题是我无法随机访问二进制文件中的单词。例如,如果我有这样的意思:

播放

  • 发音://一些东西
  • 类型:动词
  • 意思是:-乐于做某事'

操作

  • 发音://的东西
  • type://某物
  • 意思是:-//一些意思

杀死

  • 发音://一些东西
  • type://某物
  • 意思是:-//一些意思

单词操纵将比其他两个占据更多的字节。我想要做的是读取播放的程序以获取其位置,并跳三行语音,类型和含义,然后进行读取操作并获取其位置,以便以后可以访问它。 但是我可以因为所有单词都有不同的字节帮助!

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");
        }
    }
}

2 个答案:

答案 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个字节之后。