如何确定java中每行文件的字节数?

时间:2011-02-28 14:29:26

标签: java file-io

我有一个非常大的文本文件。我想确定每行的字节数并将其保存在另一个文件中。

4 个答案:

答案 0 :(得分:2)

使用java.io.BufferedReader,您可以轻松地将每一行作为单独的String读取。 行使用的字节数取决于使用的编码。对于简单的ASCII编码,您可以简单地使用String的长度,因为每个字符占用一个字节。对于像UTF-8这样的多字节编码,您需要一种更复杂的方法。

答案 1 :(得分:2)

以下代码摘录

   byte[] chunks  = null;
        BufferedReader  in = 
        new BufferedReader (new InputStreamReader(new FileInputStream(path +"/"+filePath),"UTF-8"));
        String eachLine  = "";  
        while( (eachLine = in.readLine()) != null) 
        {
            chunks = eachLine.getBytes("UTF-8");
            System.out.println(chunks.length);
        } 

答案 2 :(得分:1)

创建一个循环:

  1. 一次读一行。
  2. 计算字节数
  3. 将其保存到另一个文件。

答案 3 :(得分:0)

如果您对大文件中构成“行”的内容有一些定义,则可以简单地逐字节遍历文件,并在每次出现行结束或行开始时记住当前索引。 / p>

例如,如果您有一个unix文本文件(即\n作为行分隔符),则可能如下所示:

/**
 * a simple class encapsulating information about a line in a file.
 */
public static class LineInfo {
    LineInfo(number, start, end) {
       this.lineNumber = number;
       this.startPos = start;
       this.endPos = end;
       this.length = endPos - startPos;
    }
    /** the line number of the line. */
    public final long lineNumber;
    /** the index of the first byte of this line. */
    public final long startPos;
    /** the index after the last byte of this line. */
    public final long endPos;
    /** the length of this line (not including the line separators surrounding it). */
    public final long length;
}

/**
 * creates an index of a file by lines.
 * A "line" is defined by a group of bytes between '\n'
 * bytes (or start/end of file).
 *
 * For each line, a LineInfo element is created and put into the List.
 * The list is sorted by line number, start positions and end positions.
 */
public static List<LineInfo> indexFileByLines(File f)
    throws IOException
{

    List<LineInfo> infos = new ArrayList<LineInfo>();

    InputStream in = new BufferedInputStream(new FileInputStream(f));
    int b;
    for(long index = 0, lastStart = 0, lineNumber = 0;
        (b = in.read()) >= 0 ;
        index++)
    {
        if(b == '\n') {
            LineInfo info = new LineInfo(lineNumber, lastStart, index);
            infos.add(info);
            lastStart = index + 1;
            lineNumber ++;
        }
    }
    return infos;
}

这可以避免将字节转换为字符,从而避免任何编码问题。它仍然取决于行分隔符\n - 但可能有一个参数将它提供给方法。

(对于带有\r\n作为分隔符的DOS / Windows文件,条件有点复杂,因为我们要么必须存储前一个字节,要么对下一个字节进行预测。)

为了便于使用,可能代替列表,SortedMap<Long, LineInfo>的一对(或三倍)可能更好。