У меня есть некоторые данные в файле xml, и я использую библиотеку Process для анализа этого файла. Я столкнулся с проблемой маркера BOM , которая вызвала некоторые ошибки. Я нашел работу в другом месте, которая очень медленная: я использую Apache Commons BOMInputStream, чтобы прочитать файл как набор байтов, после пропуска тех, которые представляют эти данные спецификации.
Я думаю, что источником моей проблемы на самом деле является отсутствие у меня знаний о потоках, читателях и писателях. Есть столько разных читателей и писателей и всевозможных «потоков» (слово, которое я едва понимаю), которое я хочу вырвать, пытаясь понять, какой из них использовать и как. Я думаю, что я просто выбрал неправильную реализацию.
Вопрос: Может кто-нибудь показать мне, почему мой код такой медленный, а также помочь мне лучше понять файловый ввод / вывод?
Код:
private static XML noBOM(String filename, PApplet p) throws FileNotFoundException, IOException{
ByteArrayOutputStream out = new ByteArrayOutputStream();
File f = new File(filename);
InputStream stream = new FileInputStream(f);
BOMInputStream bomIn = new BOMInputStream(stream);
int tmp = -1;
while ((tmp = bomIn.read()) != -1){
out.write(tmp);
}
String strXml = out.toString();
return p.parseXML(strXml);
}
public static Map<String, Float> lifeExpectancyFromXML(String filename, PApplet p,
int year) throws FileNotFoundException, IOException{
Map<String, Float> dataMap = new HashMap<>();
XML xml = noBOM(filename, p);
if(xml != null){
XML[] records = xml.getChild("data").getChildren("record");
for (XML record : records){
XML[] fields = record.getChildren("field");
String country = fields[0].getContent();
int entryYear = fields[2].getIntContent();
float lifeEx = fields[3].getFloatContent();
if (entryYear == year){
System.out.println("Country: " + country);
System.out.println("Life Expectency: " + lifeEx);
dataMap.put(country, lifeEx);
}
}
}
else {
System.out.println("String could not be parsed.");
}
return dataMap;
}