基于位置的Java文件解析

时间:2014-07-15 14:34:45

标签: java parsing

实际上我正在尝试使用Java(StringTokenizer)解析txt文件。 我将每个记录作为字符串并解析它,因为没有分隔符。 FirstRow是整体标题。 第二条记录headerRecord记录,后跟其详细记录。 最后记录是预告片记录。

问题:我将如何验证/解析每个标题记录中有一个或多个详细记录。如果没有抛出错误。

HEADER                  0010120140602090500000000
HEDREC1000000001       yyy 0327201404262014Z3USD    eTCINTERFACE
DETREC2000000001       yyy           22222 bbbbb 44           0001140000.00C 
DETREC2000000001       yyy           22222 aaaaa 44           0001140000.00D  
HEDREC1000000002       yyy 0327201404262014Z3USD    eTCINTERFACE
DETREC2000000002       yyy           22222 bbbbb 44           0001140000.00C 
TRAILER                  001012014060209050000000003

提前感谢您的帮助!!

1 个答案:

答案 0 :(得分:1)

不要将StringTokenizer用于固定记录。

有两种情况:

  • 固定记录大小
  • 记录终结者

使用记录终止符,就像常规换行符一样,它是最简单的:

try (BufferedReader in = new BufferedReader(new InputStreamReader(
        new FileInputStream(file), StandardCharsets.ISO_8859_1))) {
    for (;;) {
        String record = in.readLine();
        if (record == null) {
            break;
        }
        String field1 = record.substring(0, 16).trim();
        String field2 = record.substring(16, 20);
        ...
   }
}

(修剪去除两侧的空间。)

对于固定长度的记录,请使用byte[RECORD_LENGTH]并使用

进行阅读
byte[] record = new byte[120];
try (InputStream in = new BufferedInputStream(new FileInputStream))) {
    for (;;) {
        int nread = in.read(record);
        if (nread < record.length) {
            break;
        }
        String recordS = new String(record, StandardCharsets.ISO_8859_1);
        ...

为了提高效率,您可以查看内存映射I / O ByteBuffer