日期:2014-05-20 浏览次数:20896 次
package net.csdn.bbs.mrsworf; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.HashSet; public class FindFriends { interface FriendFinder{ void findFriends(File idFile, File listFile, File targetFile) throws IOException, IllegalAccessException; } static class EasyFriendFinder implements FriendFinder{ private boolean ignoreWrongFormat = true;//是否忽略List文件中数据的格式错误 private long wrongFormatCount = 0;//List文件中,数据格式错误的行数。 public void findFriends(File idFile, File listFile, File targetFile) throws IOException, IllegalAccessException { // 由于ID文件大约10M,一般不会爆掉内存,所以,完全读取到内存中来 HashSet<String> idCache = new HashSet<String>(); BufferedReader reader = new BufferedReader(new FileReader(idFile)); String line = null; try{ while((line=reader.readLine())!=null){ if(line.trim().length()<=0)continue; idCache.add(line.trim()); } }finally{ reader.close(); } //读取List文件中的内容,同时,生成目标文件。 reader = new BufferedReader(new FileReader(listFile)); BufferedWriter writer = new BufferedWriter(new FileWriter(targetFile)); try{ while((line=reader.readLine())!=null){ //解析List文件中每一行的数据。 样例:12 [29,39,18,59] int index = line.indexOf('[');//创建一个行级索引,辅助数据解析。 int index_ = line.lastIndexOf(']');//创建另一个行级索引,辅助数据解析。 if(index<0){ wrongFormatCount++; if(ignoreWrongFormat)continue;//是否忽略List文件中数据的格式错误,如果不忽略则抛出异常,中断执行。 else throw new IllegalAccessException("数据格式不正确,没找到'['字符:"+line); } if(index_<0){ wrongFormatCount++; if(ignoreWrongFormat)continue;//是否忽略List文件中数据的格式错误,如果不忽略则抛出异常,中断执行。 else throw new IllegalAccessException("数据格式不正确,没找到']'字符:"+line); } String id = line.substring(0,index).trim(); String allFriends = line.substring(index+1,index_);//所有的friend_id,以逗号分开。 String friends [] = allFriends.split("\\,|\\,");//以逗号为分隔符,拆分字符串 writer.write(id);writer.write(' ');writer.write('['); for(int i=0;i<friends.length;i++){ if(idCache.contains(friends[i].trim())){ if(i>0)writer.write(','); writer.write(friends[i]); } } writer.write(']');writer.newLine(); } }finally{ writer.close(); reader.close();//当writer.close()出现异常时,该语句将不会被执行,这是个BUG,楼主可以优化一下。 } } public boolean isIgnoreWrongFormat() { return ignoreWrongFormat; } public void setIgnoreWrongFormat(boolean ignoreWrongFormat) { this.ignoreWrongFormat = ignoreWrongFormat; } public long getWrongFormatCount() { return wrongFormatCount; } } /** * 测试用例 */ public static void main(String[] args) { final String IdFile = "id.txt"; final String ListFile = "list.txt"; final String TargetFile = "friends.txt"; FriendFinder finder = new EasyFriendFinder(); try { finder.findFriends(new File(IdFile),new File(ListFile),new File(TargetFile)); } catch (IOException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }