Java 在两点之间读取文件

Java 在两点之间读取文件,java,io,newline,readfile,Java,Io,Newline,Readfile,我有以下文件: file.csv header:2013/01/01, shasum: 495629218484151218892233214 content:data,a,s,d,f,g,h,j,k,l content:data,q,w,e,r,t,y,u,i,o,p content:data,z,x,c,v,b,n,m footer:2013/01/01 EOF 我需要计算内容的散列。换句话说,我需要计算不带页眉和页脚的文件内容的散列,并确保它与源代码的页眉中提供的散列匹配。我试着使用扫描

我有以下文件:

file.csv

header:2013/01/01, shasum: 495629218484151218892233214
content:data,a,s,d,f,g,h,j,k,l
content:data,q,w,e,r,t,y,u,i,o,p
content:data,z,x,c,v,b,n,m
footer:2013/01/01 EOF
我需要计算内容的散列。换句话说,我需要计算不带页眉和页脚的文件内容的散列,并确保它与源代码的页眉中提供的散列匹配。我试着使用
扫描仪
逐行读取文件,并省略页眉和页脚

Scanner reader = new Scanner(new FileReader("filename"));
String header = reader.nextLine();
while(reader.hasNextLine()){
    line = reader.nextLine();
    if(reader.hasNextLine()){
        md.update(line.getBytes());
        md.update(NEW_LINE.getBytes());
    }
}
这里我不知道文件是从哪里来的。它可能来自Windows或Unix。那么我怎么知道要使用什么
NEW\u LINE
。为此,我写了这篇肮脏的文章

int i;
while((i = br.read()) != -1){
    if(i == '\r'){
        if(br.read() == '\n'){
            NEW_LINE = "\r\n";
            break;
        }
    } else if(i == '\n'){
        NEW_LINE = "\n";
        break;
    }
}
基本上,它正在查找
\r\n
\n
的第一个序列。无论它首先遇到什么,它都假定这是换行符

如果我的文件同时包含CRLF和LF,这肯定会给我带来麻烦。我可能会从一个可以提供两个偏移量的阅读器中受益,它会在这两个偏移量之间返回内容。像这样:

reader.read(15569236952265)


我相信我想要的两个偏移量是可以计算出来的。非常感谢来自社区的任何建议。

比我在评论中所设想的更好,我们只需使用
RandomAccessFile
类即可

// Load in the data file in read-only mode:
RandomAccessFile randFile = new RandomAccessFile("inputFileName.txt", "r");

// (On your own): Calculate starting byte to read from
// (On your own): Calculate ending byte to read from

// Discard header and footer.
randFile.setLength(endingPoint);
randFile.seek(startingPoint);

// Discard newlines of any kind as they are read in.
StringBuilder sb = new StringBuilder(endingPoint - startingPoint);
String currentLine = "";
while(currentLine != null)
{
  sb.append(currentLine);
  currentLine = randFile.readLine();
}

// hash your String contained in your StringBuilder without worrying about
// header, footer or newlines of any kind.
注意:此代码不是生产质量代码,因为它不捕获异常,并且可能有一些逐个错误。我强烈建议阅读RandomAccessFile类的文档:()


我希望这有帮助。如果我离开了基地,请告诉我,我会再试一试。

为什么不将CRLF和LF包含在您的哈希中?不管你期望什么,我想他希望这两个系统的换行符标准中的同一个文件的哈希相同。你能不能先使用15569个字符,然后忽略它们?从这一点开始,您可以继续,直到到达端点…?如果您有Unix和Windows sourcesPerhaps,那么非ASCII字符也会有问题,这很幼稚,但不应该有一种方法来反向读取它吗?也许通过反转字节流并正常使用扫描器?因此,您可以向后解析它,删除您使用的页脚,暂时保存这个修改过的文件,然后向前读取。这不是一个很好的解决方案,但我认为这是可能的…我的问题不是我的内容末尾或开头的新行字符。我的问题是这两行之间的所有新行字符。
randFile.readLine()
将在行尾咬掉新行字符,因此它不会包含在哈希中。我在标题中收到的哈希值是用新行字符计算的。@juzerali哦,这很容易修复。您需要使用readfull(),它将为您提供指定数组中的所有字节。我以为你也想从正文中删除换行符。如果文件太大,会给我带来麻烦。在我们的例子中,我们期望文件中有超过70k行。我想我必须编写一个算法,一次读取几个块。@juzerali您只需要担心您的哈希函数。一次读取几个块的算法应该不会太糟糕。只需将代码从readFully()调整为read(),它将一次读取一个字节,或者重载版本将读取您告诉它的字节数。这些都在我贴出链接的javadoc中。