我目前正在使用以下代码从计算机上读取.txt文件:
BufferedReader in = new BufferedReader(new FileReader("./Data/text.txt"));
String data = null;
try {
while ((data = in.readLine()) != null) {
String[] args = data.split(":");
if (args[1] == "yes")) {
file.add(data);
} else {
//Remove line here
}
}
} finally {
in.close();
}
现在,对于我读过的每一行,我都会做一个简单的检查,如果答案不是“是”,我想删除该行并继续下一行。
这可能吗?或者你只能阅读而不是改变吗?
答案 0 :(得分:4)
您无法从文件中“删除”特定行,但您可以读取行,删除不需要的行并使用清理的行覆盖文件内容。
答案 1 :(得分:0)
如前所述,您可以阅读所有内容并跳过不想要的内容,之后您可以将其余内容存储在同一个文件中。
List<String> file = new ArrayList();
BufferedReader in = new BufferedReader(new FileReader("./Data/text.txt"));
String data = null;
try {
while ((data = in.readLine()) != null) {
String[] args = data.split(":");
if (args[1].equals("yes")) {
file.add(data);
} else {
//skip this line
}
}
in.close();
//Add to file
FileWriter fw = new FileWriter("./Data/text.txt");
BufferedWriter out = new BufferedWriter(fw);
for (String line : file) {
out.write(line + "\n");
}
out.flush();
out.close();
} catch (Exception e){
}
您也可以使用Apache Commons IO。
File file = new File("./Data/text.txt");
List<String> lines = org.apache.commons.io.FileUtils.readLines(file)
for (int i = 0; i < lines.size(); i++)
if (! lines.get(i).split(":")[1].equals("yes"))
lines.remove(i--);
org.apache.commons.io.FileUtils.writeLines(file, lines);
对于arg[1]
,您必须非常小心,如果您有空行,则结果为ArrayIndexOutOfBoundsException
。
<强>附录强>
我想使用 Java 8 lambda表达式和 Java 7 java.nio.file.*
包发布另一种方式。
List<String> lines = Files.readAllLines(Paths.get("./Data/text.txt"), Charset.defaultCharset());
Predicate<String> filter = line -> line.split(":")[1].equals("./Data/text.txt");
String output = lines
.stream()
.filter(filter)
.map(l -> l + "\n")
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
.toString();
Files.write(Paths.get("test"), output.getBytes());
答案 2 :(得分:0)
最简单的解决方案是复制您要保留的所有行,并将现有文件替换为您刚刚创建的文件。
File orig = new File("Data/text.txt");
File tmp = new File(orig+".tmp");
try (BufferedReader in = new BufferedReader(new FileReader(orig));
PrintWriter pw = new PrintWriter(new FileWriter(tmp))) {
for (String data; (data = in.readLine()) != null; )
if (data.split(":")[1].equals("yes"))
pw.println(data);
}
if (orig.delete())
tmp.renameTo(orig);
else
// cannot delete old file :|
答案 3 :(得分:0)
如果我错了,请纠正我,但你的代码已经删除了&#39;不需要的行(args [1]!=&#34;是&#34;),为什么?因为你的IF有如下声明:
IF&#39; args [1]&#39;是的&#39;是&#39;是然后将其添加到&#39;文件&#39; ELSE什么都不做
也就是说,除yes
之外,它不会被添加到file
,您应该检查file
的内容(我假设它是&#39} ; sa List<String>
类型),但我很确定您的代码已经是正确的。
或者您可以在continue;
块中添加else
。