2

第一次在这里海报。提前感谢您查看我的问题。我在家庭作业问题上遇到了很多麻烦,我必须从 RandomAccessFile 读取特定范围的字节,然后检查该字节范围以查看它们是否都等于 0。我已经到处寻找了与此有关,但我发现没有什么能引起人们的注意。提供的任何帮助将不胜感激。

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

我编写了一个名为“transferStudent”的方法,它接受一个表示文件名的字符串和一个表示学生人数的整数。如果有任何异常或者文件由于某种原因没有覆盖学生的数据,我返回 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。但是,控制台总是打印错误 - 检查由于某种原因无法正常工作。我快要为此扯掉头发了。请帮忙!

4

2 回答 2

2

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

于 2014-05-07T03:14:23.510 回答
-1

所以我想我终于弄明白了这个问题:就像 EJP 所说,我将 ASCII 零“0”与二进制零混淆了。如前所述,ASCII 零占用两个字节的信息——这曾经,现在仍然让我感到困惑:我查看了写入的文件,但似乎只有一个字节的信息用于写入每个“0”。我将不得不对这个主题做更多的研究。除此之外,我的代码还有另一个问题——每次我运行程序时,文件都会收到写入它的零字符。没有问题,但是检查存在第二个问题 - 在使用循环进行检查时,我没有做任何事情来进一步推进文件指针。

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

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

其次,我必须在开始检查时检查适当的值:这个值应该是“48”,这是字符“0”的 ASCII 值。

这是我的新代码:

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;
    }
}
于 2014-05-07T20:47:54.303 回答