【发布时间】:2019-12-31 02:34:32
【问题描述】:
我有一个表单来上传一个 zip 文件,然后将 zip 中的所有 xml 文件转换为 unix 格式(如果它们是 dos 格式)。现在我将输入作为 InputStream 接收。如何处理输入流中的文件并对其执行 (dos2unix) 以将其转换为 unix 格式?
我尝试将流转换为文件,然后再转换,但没有成功
public void uploadFile(UploadAuditConfig transaction,String fileType, InputStream in, String delimiter) {
ZipInputStream zipInputStream = new ZipInputStream(in);
ZipEntry entry = null;
do{
entry = zipInputStream.getNextEntry();
//need to convert this entry to unix format if it is dos before I pass it to processFile method
if(entry != null && !entry.isDirectory()) {
List<Map<String,String>> list =processFile(zipInputStream, delimiter);
zipInputStream.closeEntry();
}
}while(entry!=null);
}
public List<Map<String, String>> processFile(InputStream in, String
delimiter){
List<Map<String,String>> acesList = new ArrayList<>();
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader xsr = xif.createXMLStreamReader(new InputStreamReader(in));
while (xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {
File file = new File("/tmp/" + "out" + i + ".xml");
FileWriter fw = new FileWriter(file);
if (!file.exists())
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file, true);
t.transform(new StAXSource(xsr), new StreamResult(fos));
fos.close();
if (i == 0) {
JSONObject xmlJSONObjHeader = XML.toJSONObject(content);
Object o = JsonPath.parse(xmlJSONObjHeader.toString()).read("$['Header']['BrandAAIAID']");
brandaaiaid = String.valueOf(o);
logger.info("Brand id: " + brandaaiaid);
file.delete();
fw.close();
i++;
}
}
return acesList;
}
预期:来自输入流的 Unix 格式文件
【问题讨论】:
-
你应该如何处理转换的结果?
-
这是完整的代码吗?
processFile()的返回类型为List<Map<String, String>>,但没有return语句。 -
为什么? XML 不关心,因此它的任何标准工具或 API 也不关心,包括您正在使用的那些。你不需要这样做。
-
怎么失败了?这是真正的问题。你拿锤子敲碎坚果。不清楚您是否甚至需要
XMLStreamReader。并摆脱exists()/createNewFile()的东西。这完全是浪费时间和空间,而且无论如何你都是在错误的地方做的。如果它有效,您将获得空文件。 -
我只能重复一遍。 XML 不在乎。您引用的错误是因为您已经使用了流的第一个元素,因此 SAX 解析器无法解析它的其余部分。它与 DOS2UNIX 无关。您的代码是错误的,正如我已经说过的,您根本不需要
XMLStreamReader。只需从 zip 输入流创建一个StreamSource。
标签: java inputstream dos2unix