日期:2014-05-20  浏览次数:20754 次

请各位大哥帮帮忙、谢谢!
小弟最近在用java解析txt文件时遇到一些问题,愿各位大哥帮帮忙。txt内容格式如下:

工号 姓名 上班日期 上班时间
20 20 2012-05-04 08:30:02
.. .. .......... .........

问题是:要解析这个文件,然后把这些内容放到一张表里面。现在想记录第一次读取文件的结束位置,下次读时就从记录的这个位置开始读取。只是这个txt文件不是固定不变的、可能读完这个txt文件后、又换了一个新的(和前边的没有重复内容),还有一个就是读完txt以后、换了一个新的txt、里面还有以前读过的内容。

------解决方案--------------------
描述的好乱。。。
这所谓的txt文件很大么,
为什么还有下次读取。

你可以在txt文件每一行的最开始设置一个标志位,
比如只要读过的记录加上 “已读取”,
下次只要碰到 已读取 的记录就跳过好了。

至于可能有重复的记录,只能在插入数据库时捕获 主键冲突 异常,
然后跳过了。。。
------解决方案--------------------
为什么要记录位置?文件还一次性读取不完?标记的方式不太实用,因为你要去重新写那个txt文件。所以你要先考虑为何要记录第一次读取的位置,如果不是必须要记录的话最好换种方式来,你可以考虑每天换一个记录的txt文件,这样就不存在记录上次读的位置了。
------解决方案--------------------
既然文件是变得,你记录上一次读取文件的位置有什么用呢?
我的思路,及供参考:
Java code

/**
*你懂得。。。
*/
class Employee{
   private int empNo;
   private String empName;
   private Date onDate;
   private Time onTime;
   //setter
   //getter
   //hashcode
   //equals
}
/**
*这里就不考虑扩展了,特定功能
*/
public class TextHanlder{
    private static Map<String, Employee> empCache = new HashMap<String, Employee>();//缓存读取的行数据
    private static Map<String, File> fileCache = new HashMap<String, File>();//不知道你文件变化时文件名是否相同,这里权当文件变化时文件名不同
    private static Map<String, Integer>  posCache = ...;//每个文件结束位置
    public static void handle(String fileName){
        File f = null;
        if((f = sameFile(fileName)) != null){//同一个文件
             int pos = posCaceh.get(fileName);

             RandomeAccessFile r = new ....
             r.seek(pos);
             Employee e = new ...
             e.setId(r.readInt);
             e.setName(r.readUTF());...
             empCache.put(e.empName, e);//添加到缓存中
        }else{//新的文件
             checkFileContent(f);//检查文件内容,将新的内容添加到缓存中
        }
        最后将缓存中的内容写入到数据库中
    }
    /**判断是不是同一个文件**/
    public static File sameFile(String fileName){
        return fileCache.get(fileName);  
    }
    public static void checkFileContent(File file){
        //读取文件构造Employee对象,查看缓存中是否存在该对象,不存在便添加到缓存中
    }
}