Я любитель на Java-кодировании, и я застрял в задании. Я написал большую часть кода, кроме основной части, и я рисую пробел о том, как это сделать. Я надеялся, что кто-то может указать мне в правильном направлении, как это делается.Сплит-файл по тегам XML
Я сделал класс под названием Splitter
. Его задача - прочитать в XML-файл и разделить его на более мелкие файлы на основе определенных тегов XML start
и end
, в то время как каждый меньший файл также должен быть меньше заданного maxfilesize
.
Кроме того, старые версии файла должны быть помещены в папку архива с отметкой времени. В основном я это получил. Кроме того, я не уверен, как сделать этот раскол тегами start
и end
. У меня есть метод getXML
, который читает все между этими тегами; но оттуда, когда я называю это методом разделения, я не уверен, что с ним делать.
У кого-нибудь есть какой-либо вклад, который они могли бы поделиться, чтобы направить меня в правильном направлении?
public class Splitter {
public static void split(String directory, String fileName,
String transactionTag, int fileSize) throws IOException{
String startTag = "<"+ transactionTag + ">";
String endTag = "</"+ transactionTag + ">";
File f = new File(directory + fileName);
File output = new File (directory + "Output/" + fileName);
BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
Splitter sp = new Splitter();
int fileCount = 0;
int len;
int maxFileSize = fileSize;
byte[] buf = new byte[maxFileSize];
SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss");
Date curDate = new Date();
String strDate = sdf.format(curDate);
String fileTime = strDate;
while ((len = in.read(buf)) > 0) {
fileCount++;
try{
File afile =new File(directory + "Output\\" + fileName + "." + fileCount);
if(afile.exists()){
if(afile.renameTo(new File(directory + "Output\\Archive\\" + fileName + "." + fileCount + "-" + fileTime))){
}else{
System.out.println("Files failed to be archived. ");
}
}else{
System.out.println("This file does not exist.");
}
}catch(Exception e){
e.printStackTrace();
}
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(output + "." + fileCount));
String newInput = new String(buf,0,len); // newInput is a String no greater in length than whatever bytes or chars
String value = sp.getXML(newInput, transactionTag);
//This part is incomplete.
//Do something with value to make this class split the file by XML tags.
//Also make sure any left over code before the first start tag and last end tag are also put into smaller files.
int start = value.indexOf(startTag);
int end = value.lastIndexOf(endTag);
out.write(buf,0,len);
out.close();
}
in.close();
}
public String getXML(String content, String tagName){
String startTag = "<"+ tagName + ">";
String endTag = "</"+ tagName + ">";
int startposition = content.indexOf(startTag);
int endposition = content.indexOf(endTag, startposition);
if (startposition == -1)return "";
startposition += startTag.length();
if(endposition == -1) return "";
return content.substring(startposition, endposition);
}
public static void main(String[]args) throws IOException{
int num = 100;
int kb = num * 1024;
Splitter split = new Splitter();
split("C:/SplitUp/", "fileSplit.xml", "blah1", kb);
System.out.println("Program ran");
}
}
IIUC ваш единственный входной файл ('fileSplit.xml') имеет несколько тегов' start' и 'end', и вы разделите содержимое между каждой парой« start »и« end »тегов на отдельные отдельные файлы, правильно? –
Да, это точно. Как бы то ни было, у меня есть этот код, работающий над тем, где он разбивает файл файловым файлом, но мне также нужно, чтобы он разбивался на те начальные и конечные теги. У меня есть метод getXML, который видит содержимое между тегом start и end, и я знаю, что мне нужно вызвать это в метод split и сделать какой-то цикл, чтобы сделать это все, но я не уверен, как идти об этом. Мне также нужно записать «остатки», то есть положить материал перед первым стартовым тегом и материалом после последнего тега в свои собственные файлы.Я был бы благодарен за любую информацию. – Galvatron