0

我想知道文本文件中每一行的偏移量。

目前我已经尝试过,

path=FileSystems.getDefault().getPath(".",filename);
br=Files.newBufferedReader(path_doc_title_index_path, Charset.defaultCharset());
int offset=0; //offset of first line.       
String strline=br.readline();
offset+=strline.length()+1; //offset of second line

通过这种方式,我可以遍历整个文件以了解整个文本文件中行首的偏移量。但是,如果我使用RandomAccessFile通过上述方法计算的偏移量来查找文件并访问一行,那么我发现自己处于某行的中间。也就是说,偏移量似乎不正确。

怎么了?这种方法计算偏移量是否不正确?请问有更好更快的方法吗?

4

2 回答 2

1

您的代码仅适用于 ASCII 编码文本。由于某些字符需要超过一个字节,因此您必须更改以下行

offset += strline.length() + 1;

offset += strline.getBytes(Charset.defaultCharset()).length + 1;

正如我在您问题下方的评论中所述,您必须指定文件的正确编码。例如Charset.forName("UTF-8")这里以及你初始化你的BufferedReader.

于 2013-02-09T22:15:37.237 回答
0

显然,这给了我预期的结果。在下面的程序中,我通过一组通过 BufferedReader 收集的偏移量打印出文件的每一行。这是你的情况吗?

public static void main(String[] args) {
    File readFile = new File("/your/file/here");
    BufferedReader reader = null;
    try
    {
        reader = new BufferedReader( new FileReader(readFile) );
    }
    catch (IOException ioe)
    {
        System.err.println("Error: " + ioe.getMessage());     
    }
    List<Integer> offsets=new ArrayList<Integer>(); //offset of first line.       
    String strline;
    try {
        strline = reader.readLine();
        while(strline!=null){
            offsets.add(strline.length()+System.getProperty("line.separator").length()); //offset of second line
            strline = reader.readLine();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        RandomAccessFile raf = new RandomAccessFile(readFile, "rw");
        for(Integer offset : offsets){
            try {
                raf.seek(offset);
                System.out.println(raf.readLine());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
}
于 2013-02-09T22:15:00.357 回答