几乎我工作的每个项目都会有某种制表符分隔的文件,我需要读入并返回它的查找 map 。我发现自己一遍又一遍地重写相同的方法。我想创建一些更通用的东西,这样我就不必一直复制和粘贴代码了。在下面的代码中,我只更改了第 9 行和第 16-19 行。所以我只改变了 Map<key, value>
,以及如何将数据输入 map 的实现。有没有办法从中创建一个通用过程,所以每次我想调用这个方法时,我所需要的只是提供我想如何将数据输入到 Map 中的实现,并以某种方式将 Map 更改为更通用的类型好吧。
1. public Map<String, PackageLog> readAllLogsIntoMap(File file){
2. if (!file.exists())
3. {
4. return new HashMap <String, PackageLog> ();
5. }
6. BufferedReader reader = null;
7. FileReader fileReader = null;
8. String data = null;
9. Map <String, PackageLog> resultMap = new HashMap <String, PackageLog> ();
10. try
11. {
12. fileReader = new FileReader(file);
13. reader = new BufferedReader(fileReader);
14. while ((data = reader.readLine()) != null)
15. {
16. PackageLog pl = new PackageLog(data);
17. if(!pl.getPdfName().equals("")){
18. resultMap.put(pl.getPdfName(), pl);
19. }
20. }
21. } catch(Exception e){
22.
23. }
24. finally
25. {
26. try{
27. if (reader != null) reader.close();
28. if (fileReader != null) fileReader.close();
29. }catch(IOException ioe){
30.
31. }
32. }
33. return resultMap;
34. }
最佳答案
- 将此方法放在一个抽象的 Util 类中。使用泛型。
- 委托(delegate)抽象方法执行第 9 行和第 16-19 行的逻辑。
- 在这个类的使用中定义这些抽象方法
例如:
public abstract class ReaderUtil<K, V> {
protected abstract Map<K, V> newMap();
protected abstract void doThings(String data, Map<K, V> resultMap);
public Map<K, V> readAllLogsIntoMap(File file){
if (!file.exists()){
return newMap();
}
BufferedReader reader = null;
FileReader fileReader = null;
String data = null;
Map <K, V> resultMap = newMap();
try {
fileReader = new FileReader(file);
reader = new BufferedReader(fileReader);
while ((data = reader.readLine()) != null){
doThings(data, resultMap);
}
} catch(Exception e){
}
finally{
try{
if (reader != null) reader.close();
if (fileReader != null) fileReader.close();
} catch(IOException ioe){
}
}
return resultMap;
}
}
还有一个可能的用途:
ReaderUtil<String, PackageLog> reader = new ReaderUtil<String, PackageLog>(){
protected Map<String, PackageLog> newMap() {
return new HashMap<String, PackageLog>();
}
protected void doThings(String data, Map<String, PackageLog> resultmap){
PackageLog pl = new PackageLog(data);
if(!pl.getPdfName().equals("")){
resultMap.put(pl.getPdfName(), pl);
}
}
};
Map<String, PackageLog> myMap = reader.readAllLogsIntoMap();
考虑到您只需要 newMap()
方法,如果你想提供不同的 map 实现。你可以做 new HashMap<K, V>()
在泛型类中。
您可能还想定义用于处理异常的钩子(Hook)方法(可覆盖的、可能为空的方法)。
关于java - 如何创建读取制表符分隔文件的通用进程,并从中返回通用 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081829/