Sonar qube 給我以下錯誤:
使用 try-with-resources 或在“finally”子句中關閉此“Stream”
這是我的代碼:
Path start = Paths.get(filePath);
Stream<File> stream;
try {
stream = Files.walk(start, 1, FileVisitOption.FOLLOW_LINKS).map(s -> s.toFile());
List<File> files = stream.collect(Collectors.toList());
files.remove(0);
for (File f : files) {
String fileName = f.toPath().getFileName().toString();
if (fileName.matches(regex)) {
fileList.add(f.toPath().toString());
}
}
} catch (IOException e) {
}
我該如何解決這個錯誤?
uj5u.com熱心網友回復:
以這種方式定義和打開您的流:
try (Stream<File> stream = Files.walk(start, 1, FileVisitOption.FOLLOW_LINKS).map(s -> s.toFile())){
這樣做,系統會自動關閉流,你不用擔心
uj5u.com熱心網友回復:
根據 Ryan 所說的擴展,我更喜歡將要關閉的流的范圍盡可能小:
try (Stream<File> stream = Files.walk(start, 1, FileVisitOption.FOLLOW_LINKS)) {
List<File> files = stream
.map(s -> s.toFile())
.collect(Collectors.toList());
}
也就是說,你流式傳輸,收集到一個串列,然后再回圈一些。這可以改進:
try (Stream<File> stream = Files.walk(start, 1, FileVisitOption.FOLLOW_LINKS)) {
stream
.skip(1) // replacement of files.remove(0)
// leave out converting to File
.filter(f -> f.getFileName().toString().matches(regex)) // filter in the stream
.map(Path::toString)
.forEach(fileList::add);
}
我真的不喜歡那樣fileList::add,所以如果你可以收集到 aList<String>并將其分配給fileList那將是首選。或者也許收集到 aList<String>然后使用fileList.addAll.
uj5u.com熱心網友回復:
關閉流,以防它在打開流時引發例外。
public static void main(String[] args) {
Path start = Paths.get("");
Stream<File> stream = null;
List<String> fileList = new ArrayList<>();
try {
stream = Files.walk(start, 1, FileVisitOption.FOLLOW_LINKS).map(s -> s.toFile());
List<File> files = stream.collect(Collectors.toList());
files.remove(0);
for (File f : files) {
String fileName = f.toPath().getFileName().toString();
if (fileName.matches("")) {
fileList.add(f.toPath().toString());
}
}
} catch (IOException e) {
// Do something
}finally {
if(stream!=null)
stream.close();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/433106.html
