【问题标题】:Read/Write from RandomAccessFile in Java从 Java 中的 RandomAccessFile 读/写
【发布时间】:2016-10-26 21:45:12
【问题描述】:

我正在尝试使用 RandomAccessFile。我正在做的是尝试将消息存储在文件中并尝试将所有消息从一个指针获取到另一个指针

//file is the RandomAccessFile
//newLine is just new line

我的存储方式:

//I want to store a message per line
public void store(long idx, String message){

   file.seek(idx);
   file.write(message);
   file.write(newLine)
}

这是我填写文件的方式:

void createDummy(String location) throws IOException {

    Random r = new Random();

    for (int i = 0; i < 10; i++) {

        long l = i;
        StringBuffer b = new StringBuffer();
        for (int j = 0; j < 10; j++) {

            b.append((char)r.nextInt(26)+65);
        }

        String str = b.toString();
        store(l, str);
        System.out.println("Stored "+str);
    }

}

这是输出:

Stored BYOENDRWEBUVGIFR
Stored HNXRKZWPAZUYCUHN
Stored RPRRAXWRBFSRSHJD
Stored AGTJXZMCFXENBQOH
Stored QLWXLIBKRPELYHPR
Stored VBUOVQICIOOTOTYK
Stored HPDZRPUGIYAFBGJE
Stored ZGLAIXTBGVCLJAGC
Stored UZKUXCWGCIVJLMAF
Stored RIXZSEDXQPAVDWEK

阅读...我的阅读方式:

//I want to retrieve all messages from "from" to "to"

public void retrieve(long from, long to){

 long start = from;
 file.seek(start);

 while(start < to){ 
    System.out.println(file.readLine());
    start++;
    file.seek(start);
  }
}

调用retrieve(3,9);给出以下输出 // 从 3 到 9 检索;

Read NRPRAGTJQLWXLVBUOVQHPDZRPUZGLAIXTBUZKUXCWGCRIXZSEDXQPAVDWEKBT                    WNWFVVYDPEMCSFVQ                                RXCZSNOBEPPDKNBB                                            LCPFDVUXWETHVWJQ                                                        CPCCDTSOCLSEXIST                                                                    QZFCQWMQVEXTOGNG                                                                                SSKTXOYMOBETGVWN                                                                                            DWYIMILEXQMSNUBJ
Read RPRAGTJQLWXLVBUOVQHPDZRPUZGLAIXTBUZKUXCWGCRIXZSEDXQPAVDWEKBT                    WNWFVVYDPEMCSFVQ                                RXCZSNOBEPPDKNBB                                            LCPFDVUXWETHVWJQ                                                        CPCCDTSOCLSEXIST                                                                    QZFCQWMQVEXTOGNG                                                                                SSKTXOYMOBETGVWN                                                                                            DWYIMILEXQMSNUBJ
Read PRAGTJQLWXLVBUOVQHPDZRPUZGLAIXTBUZKUXCWGCRIXZSEDXQPAVDWEKBT                    WNWFVVYDPEMCSFVQ                                RXCZSNOBEPPDKNBB                                            LCPFDVUXWETHVWJQ                                                        CPCCDTSOCLSEXIST                                                                    QZFCQWMQVEXTOGNG                                                                                SSKTXOYMOBETGVWN                                                                                            DWYIMILEXQMSNUBJ
Read RAGTJQLWXLVBUOVQHPDZRPUZGLAIXTBUZKUXCWGCRIXZSEDXQPAVDWEKBT                    WNWFVVYDPEMCSFVQ                                RXCZSNOBEPPDKNBB                                            LCPFDVUXWETHVWJQ                                                        CPCCDTSOCLSEXIST                                                                    QZFCQWMQVEXTOGNG                                                                                SSKTXOYMOBETGVWN                                                                                            DWYIMILEXQMSNUBJ
Read AGTJQLWXLVBUOVQHPDZRPUZGLAIXTBUZKUXCWGCRIXZSEDXQPAVDWEKBT                    WNWFVVYDPEMCSFVQ                                RXCZSNOBEPPDKNBB                                            LCPFDVUXWETHVWJQ                                                        CPCCDTSOCLSEXIST                                                                    QZFCQWMQVEXTOGNG                                                                                SSKTXOYMOBETGVWN                                                                                            DWYIMILEXQMSNUBJ
Read GTJQLWXLVBUOVQHPDZRPUZGLAIXTBUZKUXCWGCRIXZSEDXQPAVDWEKBT                    WNWFVVYDPEMCSFVQ                                RXCZSNOBEPPDKNBB                                            LCPFDVUXWETHVWJQ                                                        CPCCDTSOCLSEXIST                                                                    QZFCQWMQVEXTOGNG                                                                                SSKTXOYMOBETGVWN                                                                                            DWYIMILEXQMSNUBJ

我希望检索以下内容,但事实并非如此:

阅读 AGTJXZMCFXENBQOH 阅读 QLWXLIBKRPELYHPR 阅读 VBUOVQICIOOTOTYK 阅读 HPDZRPUGIYAFBGJE 阅读 ZGLAIXTBGVCLJAGC 阅读 UZKUXCWGCIVJLMAF

请问我的retrieve() 函数有什么问题。任何反馈表示赞赏。谢谢你。

【问题讨论】:

  • 这还能编译吗?你写的start&lt;long的检索方法里面的while-loop不正确?那应该是start&lt;end 我想这就是你的意思。
  • 您正在读取一行,然后前进一个字节并再次读取同一行(减去第一个字节)。
  • 抱歉,while 循环中的 long 是一种类型。进行了更正。谢谢。
  • 你的retrieve() 方法没有意义。即使它编译了,它没有,它读取的任何内容都会被丢弃。它的签名应该是String retrieve(long idx),它的实现很简单。没有循环。而且您不能将自动递增的long 也视为文件的偏移量。下定决心。不是记录号,是字节偏移量。
  • 您希望您的seek 电话做什么?转到给定的行号?他们没有。它们转到给定的字节偏移量。

标签: java file random-access


【解决方案1】:

两件事:

  1. 你的 newLine 到底是什么,应该是“\n”。

  2. 当您在 while 循环中读取该文件时,您不需要调用

    file.seek(开始);

    完全没有。导致光标在

    之后会自动跳到下一行

    file.readLine();

【讨论】:

  • newLine 应该是 System.lineSeparator()。不仅阅读有问题,写作也有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2015-06-30
  • 2012-01-31
  • 1970-01-01
相关资源
最近更新 更多