我正在使用jaxb和XmlStreamWriter在java中创建一个xml文件。这将成为一个非常大的文件,必须分成几个最大的。 200MB。这些部分不再是可读的xml。
这个文件的名称使用日期和几个参数非常具体,最后它们的编号如下:'3.1','3.2','3.3'其中第一个数字是创建的块数和第二个数字是文件的以下编号。文件名的第一部分(除了编号)是在java应用程序中创建的。
现在我想创建一个UNIX脚本,用所需的参数调用java应用程序,拆分文件并重命名块。
我知道调用java应用程序以及拆分和重命名文件的命令,但我不知道如何组合它们,因为我现在只是Java应用程序中的文件名所以我无法确定哪个文件必须拆分并重命名。
有没有人知道如何处理它?</ p>
编辑: 好的,我会尽量不那么模糊。
我创建的应用程序创建了非常大的xml文件。此文件的名称采用以下格式:FI.DB2P.107601.20130130.20010.T.1.1。此名称包含一些标识号和创建文件的日期。名称的第一部分在Java应用程序中创建,如下所示:FI.DB2P.107601.20130130.20010.T。
现在这个文件应分成几个最大块。每个200 MB。然后创建的块应该与'base-file'具有相同的名称,但它们必须以'T.3.1','T.3.2'和'T.3.3'结尾。例如。
我现在的问题是如何在Unix脚本中获取java应用程序创建的文件的文件名。文件名非常复杂,包含数据库中的数据,因此我无法在Unix脚本中定义名称。
我希望现在有点清楚。
答案 0 :(得分:0)
不是你的Java进程会调用Unix脚本,因此能够在命令行上传递文件名。
Unix脚本可以获取文件名并在其上运行类似split
的内容,然后将文件名修复为Java进程所期望的文件名。
答案 1 :(得分:0)
除非我误解你的问题,否则应该很容易。
当您创建XMLStreamWriter
时,您知道(希望)文件的名称:
String fileName = "FI.DB2P.107601.20130130.20010.T.1.1";
XMLStreamWriter writer = factory.createXMLStreamWriter(new FileWriter(fileName ));
然后将此名称作为参数传递给shell脚本不是问题:
Runtime.getRuntime().exec("yourscript.sh " + fileName);
yourscript.sh
将有代码来拆分文件并将递增变量添加到文件名中,这样的事情可能会起作用:
#!/bin/bash
split -b 200m -a 5 "$1" splited_file
i=1
for file in splited_file*
do
mv $file $1_${i}
i=$(( i + 1 ))
done
ps:这个脚本不是线程安全的:)