Java Stream API: 修改文件中的特定行
Java Stream API: Modify a specific line in a file
我正在读取 readme
文件的内容作为字符串列表
我想修改这个文件的特定行(所以列表的特定字符串)。
我设法实现了它,但是有没有一种优雅的方法可以(仅)使用 java 流操作(因为我目前正在学习 java 流 API) ?
我发现的其他代码展示了如何在执行 replaceAll()
或附加某些字符后创建新列表并向该列表添加新字符串。
我的情况有点不同,我只想更改我在文件中找到的某一行(更具体地说是其中的某些字符,尽管我可以重写整行).
现在,我只是在新列表中逐行重写所有行,除了我生成并写入的一行(所以我想修改的行)。
我愿意以任何方式这样做,我可以更改 i/o 类型,重写整个 file/line 或只更改其中的一部分...只要我最终得到了一个修改过的 readme
文件。只是在寻找这样做的“流方式”。
我的实际代码:
private static List<String> getReadme() {
try {
return stream(readFileToString(new File("readme.md")).split("\n")).collect(Collectors.toList());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void generateReadMe(String day, String year, int part) {
List<String> readme = getReadme();
// hidden code where I create the line I want to end up modified...
String line = prefix + fDay + stars + color + packages + fYear + "/days/Day"+ day +".java)\n";
List<String> newReadme = readme.stream().map(l -> {
if (l.contains(fYear) && l.contains(fDay)) {
// add the modified line (aka replacing the line)
return line;
} else {
// or add the non modified line if not the one we're looking for
return l;
}
}).toList();
newReadme.forEach(System.out::println);
}
您不需要 Apache commons,我建议使用 Files.lines
或 java.nio.file.Files
,您也可以像下面这样使用一种方法来实现
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Example {
public static void generateReadMe(String day, String year, int part) {
List<String> newReadme = null;
try (Stream<String> lines = Files.lines(Paths.get("readme.md"))) {
newReadme = lines.map(l -> l.contains(fYear) && l.contains(fDay) ? replaceLine() : l).collect(Collectors.toList())
} catch (IOException e) {
throw new RuntimeException(e);
}
newReadme.forEach(System.out::println);
}
private static String replaceLine() {
//Your implementation
return prefix + fDay + stars + color + packages + fYear + "/days/Day" + day + ".java)\n";
}
}
我正在读取 readme
文件的内容作为字符串列表
我想修改这个文件的特定行(所以列表的特定字符串)。
我设法实现了它,但是有没有一种优雅的方法可以(仅)使用 java 流操作(因为我目前正在学习 java 流 API) ?
我发现的其他代码展示了如何在执行 replaceAll()
或附加某些字符后创建新列表并向该列表添加新字符串。
我的情况有点不同,我只想更改我在文件中找到的某一行(更具体地说是其中的某些字符,尽管我可以重写整行). 现在,我只是在新列表中逐行重写所有行,除了我生成并写入的一行(所以我想修改的行)。
我愿意以任何方式这样做,我可以更改 i/o 类型,重写整个 file/line 或只更改其中的一部分...只要我最终得到了一个修改过的 readme
文件。只是在寻找这样做的“流方式”。
我的实际代码:
private static List<String> getReadme() {
try {
return stream(readFileToString(new File("readme.md")).split("\n")).collect(Collectors.toList());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void generateReadMe(String day, String year, int part) {
List<String> readme = getReadme();
// hidden code where I create the line I want to end up modified...
String line = prefix + fDay + stars + color + packages + fYear + "/days/Day"+ day +".java)\n";
List<String> newReadme = readme.stream().map(l -> {
if (l.contains(fYear) && l.contains(fDay)) {
// add the modified line (aka replacing the line)
return line;
} else {
// or add the non modified line if not the one we're looking for
return l;
}
}).toList();
newReadme.forEach(System.out::println);
}
您不需要 Apache commons,我建议使用 Files.lines
或 java.nio.file.Files
,您也可以像下面这样使用一种方法来实现
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Example {
public static void generateReadMe(String day, String year, int part) {
List<String> newReadme = null;
try (Stream<String> lines = Files.lines(Paths.get("readme.md"))) {
newReadme = lines.map(l -> l.contains(fYear) && l.contains(fDay) ? replaceLine() : l).collect(Collectors.toList())
} catch (IOException e) {
throw new RuntimeException(e);
}
newReadme.forEach(System.out::println);
}
private static String replaceLine() {
//Your implementation
return prefix + fDay + stars + color + packages + fYear + "/days/Day" + day + ".java)\n";
}
}