@Override
    public void parse(Class<RowType> _rowClass, File... files) throws TableParseFailedException, TableHeaderParseFailedException {

        if (!isValidFiles(files)) {
            return;
        }

        tableHeader.parse(files[0]);
        rowClass = _rowClass;

        File file = null;
        try {
            for (int i = 0; i < files.length; i++) {
                file = files[i];
                FileReader fileReader = new FileReader(file);
                BufferedReader br = new BufferedReader(fileReader);

                br.readLine(); // 舍弃第一行
                String[] columnNames = br.readLine().split("\t"); // 第二行是列名
                br.readLine(); // 舍弃第三行

                Map<String, String> columnNameMaptoValue = new HashMap<String, String>();
                String line = null;
                int rowNumber = 0;
                while ((line = br.readLine()) != null) {
                    rowNumber++;
                    String[] columnValues = line.split("\t");
                    for (int j = 0; j < columnNames.length; j++) {
                        String columnValue = (j >= columnValues.length) ? "" : columnValues[j];
                        columnNameMaptoValue.put(columnNames[j], columnValue);
                    }
                    RowType row = (RowType) rowClass.newInstance();
                    row.setTable(this);
                    row.parse(rowNumber, columnNameMaptoValue);
                    int rowId = row.getId();
                    if (has(rowId)) {
                        Throwable cause = new Exception("Duplicate Row Id " + rowId);
                        throw new TableParseFailedException(this, file, cause);
                    }
                    idMaptoRow.put(rowId, row);
                }

                br.close();
                fileReader.close();
            }
        } catch (Exception e) {
            throw new TableParseFailedException(this, file, e);
        }
    }