我正在编写一个程序,使用线程将包含zip代码的行数过滤到相应的单独zip文件中。因为我正在处理数百万行创建OutputStream
的新对象,并且每次关闭它都是不可行的。因此,我为每个邮政编码创建了一个哈希,并继续写入它。在完成代码之后,我完成了关闭每个流的每个Hash迭代。
现在的问题是一些文件(每次运行不同)仍然抛出AccessDeniedException
。
我还尝试删除它之前设置setWritable(true)
,当我调用file.delete()
时它返回true,但它返回true但文件未被删除。
任何帮助都会受到欢迎。
用于写入文件
private synchronized void write(String file, StringJoiner joiner) throws Exception {
OutputStream out = zipOutStreamMap.get(file);
if (out == null) {
out = Files.newOutputStream(Paths.get(file), CREATE, APPEND);
zipOutStreamMap.put(zip, out);
}
out.write((joiner.toString() + System.getProperty("line.separator")).getBytes());
out.flush();
}
用于关闭流
for (Map.Entry<String, OutputStream> out : zipOutStreamMap.entrySet()) {
try {
if (out.getValue() != null) {
out.getValue().close();
File zipFile = new File(out.getKey());
System.out.println(out.getKey() + " " + zipFile.setWritable(true));
System.out.println(zipFile.delete());
}
} catch (IOException e) {
e.printStackTrace();
}
}
使用线程如下
try {
Path file = Paths.get(inputProperty.inputFilePath);
if (!(new File(outputPath)).exists()) {
(new File(outputPath)).mkdir();
}
Stream<String> lines = Files.lines(file, StandardCharsets.UTF_8);
for (String line : (Iterable<String>) lines::iterator) {
synchronized (this) {
pool.execute(new ZipWriter(line, inputProperty, outputPath));
}
}
lines.close();
} catch (Exception e) {
e.printStackTrace();
}
pool.shutdown();
while (!pool.isTerminated()) {
Thread.sleep(100);
}