从RandomAccessFile读取特定字节并测试它们是否等于0

时间:2014-05-07 03:05:13

标签: java randomaccessfile

这里的第一次海报。提前感谢您查看我的问题。我在编写一个家庭作业问题时遇到了很多麻烦,我必须从RandomAccessFile中读取特定范围的字节,然后检查字节范围以查看它们是否都等于0.我已经看了一遍属于这个,但我发现的任何东西都没有碰到现场。任何帮助将不胜感激。

问题告诉我们,某个文件包含学校中假设学生的数据。这些学生中的每一个都用40个字节的代码表示,但我们文件的前四个字节必须是一个整数,其中包含学校的学生总数(假设有75个)。字节4到43代表第一个学生(#0),44到83代表第二个(#1),依此类推。当学生转学到另一所学校时,他们的40个字节将被全部0(字符)覆盖。

我编写了一个名为“transferStudent”的方法,该方法采用表示文件名的String和表示学生数的整数。如果有任何例外,或者由于某种原因文件没有覆盖学生的数据,我会返回false;

到目前为止,这是我的工作:

public static Boolean transferStudent(String fileName, int studentNum) {

    RandomAccessFile file = new RandomAccessFile(fileName, "rw");
    file.writeInt(75);
    try {
        if (studentNum == 0) {
            file.seek(4);
            file.writeBytes("0000000000000000000000000000000000000000"); // 40 zero characters
            file.seek(4);
            for (int i = 0; i < 40; i++) {
                if (file.read() == 0) {
                    return true;
                }
            }
            return false;
        }
        else if (studentNum > 0) {
            file.seek(4 + (studentNum * 40));
            file.writeBytes("0000000000000000000000000000000000000000"); // 40 more zeroes
            file.seek(4);
            for (int i = (4 + (studentNum * 40)); i < (44 + (studentNum * 40)); i++) {
                if (file.read() == 0) {
                    return true;
                }
            }
            return false;
        }
        else {
            return false;
        }
    }
    catch (Exception e) {
        return false;
    }
}

每当我查看已创建的二进制文件时,在与studentNum对应的范围内确实存在0。但是,控制台始终打印错误 - 检查因某些原因无法正常工作。我正濒临撕裂头发。请帮忙!

2 个答案:

答案 0 :(得分:2)

您将ASCII零“0”与二进制零混淆。你正在编写前者并测试后者。 ASCII“0”占用两个字节。请注意,'character'和'byte'在Java中并不相同。

答案 1 :(得分:-1)

所以我想我终于找到了问题:就像EJP所说的那样,我混淆了ASCII零&#34; 0&#34;用二进制零。如上所述,ASCII零占用两个字节的信息 - 这对我来说真的很困惑:我查看写入的文件,但看起来只有一个字节的信息被用来写每个&#34; 0&#34 ;.我将不得不对这个主题做更多的研究。除此之外,我的代码还有另一个问题 - 每次运行程序时,文件都会收到写入零字符的文件。这没有问题,但是检查还有第二个问题 - 在使用循环进行检查时,我没有做任何事情来进一步推进文件指针。

因此,修复我的代码需要做两件事:

首先,我必须找到一种方法来推进文件指针,以便正确读取RandomAccessFile中的每个点。

其次,我必须在启动检查时检查适当的值:该值应该是&#34; 48&#34;,这是字符的ASCII值&#34; 0&#34;。< / p>

这是我的新代码:

public static boolean transferStudent(String fileName, int studentNum) throws IOException {

    RandomAccessFile file = new RandomAccessFile(fileName, "rw");
    boolean trueOrFalse = false;
    file.writeInt(75);
    try {
        if (studentNum == 0) {
            file.seek(4);
            file.writeBytes("0000000000000000000000000000000000000000"); // 40 zero characters
            file.seek(4);
            for (int i = 0; i < 40; i++) {
                file.seek(4 + i); // Here is where the file pointer is advanced in the for-loop - very crucial
                if (file.read() == 48) { // Here is where the file is checked for the appropriate value - the ASCII value for "0"
                    trueOrFalse = true;
                }
            }
            return trueOrFalse;
        }
        else if (studentNum > 0) {
            file.seek(4 + (studentNum * 40));
            file.writeBytes("0000000000000000000000000000000000000000"); // 40 more zeroes
            file.seek(4 + (studentNum * 40));
            for (int i = 0; i < 40; i++) { // The same happens here as above
                file.seek((4 + (studentNum * 40)) + i); // ... and here also
                if (file.read() == 48) {
                    trueOrFalse = true;
                }
            }
            return trueOrFalse;
        }
        else {
            return trueOrFalse;
        }
    }
    catch (Exception e) {
        return false;
    }
}