我正在制作一个简单的javafx应用程序来生成一个表,用于对xml格式的blastp输出进行数据分析。这不是难以置信的慢,但我只是想让程序尽可能有效。我添加的代码减少了很多,因为真正的文件是相当大的,但他们传达的大致轮廓。我不想找人为我写代码,只是当我必须加载大量的xml时的建议,比如看一下这个api或尝试将文件加载到这个对象中。xml to表如下所示:
从filechooser收集文件
public void listChange() throws //ALLEXCEPTIONS// {
List<File> files = fc.showOpenMultipleDialog(new Stage());
if (files != null) {
files.forEach(f -> {
try {
xmlDataList.add(XMLFile(f.getPath()));
} catch (//ALLEXCEPTIONS//) {
e.printStackTrace();
}
});
}
}
通过sax解析器将文件运行到对象xmldata中
public XMLData XMLFile(String path) throws //ALLEXCEPTIONS// {
if (path.endsWith(".xml")) {
SAXParserFactory parserFactor = SAXParserFactory.newInstance();
SAXHandler saxh = new SAXHandler();
SAXParser parser = parserFactor.newSAXParser();
parser.parse(path, saxh);
int suffix = 1;
String pname = path.substring(path.lastIndexOf("\\")+1, path.length() - 4), temp = pname;
ArrayList<String> xmldataname = new ArrayList<>();
xmlDataArrayListist.forEach(x -> xmldataname.add(x.pName));
System.out.println("Finished");
return new XMLData(saxh.hitList, temp);
}
else{
return null;
}
}
sax处理程序创建一个名为hsps(高分蛋白质序列)的对象列表,在该对象中是另一个对象hsp(高分蛋白质序列)。
public class SAXHandler extends DefaultHandler {
public ArrayList<HSPS> hitList = new ArrayList<>();
@Override
public void startElement(String u, String ln, String ele, Attributes at)
throws SAXException {
switch(ele){
case "Hit":
hsps = new HSPS();
break;
case "Hsp":
hsp = new HSP();
break;
}
}
@Override
public void endElement(String uri, String ln,String ele) throws SAXException {
switch(ele){
case "Hit_hsps":
hitList.add(hsps);
break;
case "Hsp":
hsps.hspL.add(hsp);
break;
case "Hit_def":
hsps.name = content;
break;
case "Hit_id":
hsps.id = content;
break;
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
content = String.copyValueOf(ch, start, length);
}
}
对象hsps包含hsp列表和这些序列所属的蛋白质的名称。hsp对象包含许多包含数据的字符串。该表只读取xmlfile对象中hsp中的所有hsp。
所以,我想我的问题是,这是将正确的项目转移到表中的最佳方式吗?xml文件包含大量的数据,但我只需要一些项目。如果需要任何补充信息,请询问。
我对并发没有经验,但如果它能提高效率,我会研究它。
1条答案
按热度按时间8yoxcaq71#
maven依赖
样本代码