java根据行号从文件中删除行
是否有基于行号删除行的Java库 我的目标是删除基于行号的行 范例java根据行号从文件中删除行,java,file,file-io,numbers,line,Java,File,File Io,Numbers,Line,是否有基于行号删除行的Java库 我的目标是删除基于行号的行 范例 佩伦特式居住者morbi tristique Sentecus et netus et malesuada 著名的ac turpis 埃格斯塔斯。前庭侵权法庭、封建法庭、别有用心法庭、, 暂时坐下来 不要让你的自由人坐在那里。乌尔特里斯埃涅亚酒店 维塔埃斯特。莫里斯 Placelat eleifend leo。这是乌拉姆科珀的智慧所在 法雷特拉。前庭 埃拉特·维西、调味品、康茂德·维塔、奥纳雷·西特·维西。 埃尼酵母 eget
import org.apache.commons.io.FileUtils;
//...
private String removeLines(List<Integer> removeLines, File text) throws IOException {
List<String> textLines = FileUtils.readLines(text, StandardCharsets.UTF_8);
if (argsStrings.contains(Flags.DEBUG_FLAG)) {
String format = String.format("%d from %d need to be removed", removeLines.size(), textLines.size());
Logger.getLogger(App.class.getName()).log(Level.INFO, format);
}
int i = textLines.size();
while (!removeLines.isEmpty()) {
Integer line = new Integer(i + 1);
if (argsStrings.contains(Flags.DEBUG_FLAG)) {
String format = String.format("%4d. line inspected", line);
Logger.getLogger(App.class.getName()).log(Level.INFO, format);
}
if (removeLines.contains(line)) {
if (argsStrings.contains(Flags.DEBUG_FLAG)) {
String format = String.format("%4d. line removed, line text is below%n%s", line, textLines.get(i));
Logger.getLogger(App.class.getName()).log(Level.INFO, format);
}
textLines.remove(i);
removeLines.remove(line);
}
i--;
}
StringBuilder sb = new StringBuilder();
for (String line : textLines) {
sb.append(line);
sb.append(System.lineSeparator());
}
return sb.toString();
}
import org.apache.commons.io.FileUtils;
//...
私有字符串removeLines(列表removeLines,文件文本)引发IOException{
List textLines=FileUtils.readLines(text,StandardCharsets.UTF_8);
if(argsStrings.contains(Flags.DEBUG_FLAG)){
String format=String.format(“需要删除%d中的%d”)、removeLines.size()、textLines.size();
Logger.getLogger(App.class.getName()).log(Level.INFO,格式);
}
int i=textLines.size();
而(!removeLines.isEmpty()){
整数行=新整数(i+1);
if(argsStrings.contains(Flags.DEBUG_FLAG)){
字符串格式=String.format(“%4d.行已检查”,行);
Logger.getLogger(App.class.getName()).log(Level.INFO,格式);
}
if(删除行包含(行)){
if(argsStrings.contains(Flags.DEBUG_FLAG)){
String format=String.format(“%4d.行已删除,行文本在%n%s”之下),行,textLines.get(i));
Logger.getLogger(App.class.getName()).log(Level.INFO,格式);
}
文本行。删除(i);
移除线。移除(线);
}
我--;
}
StringBuilder sb=新的StringBuilder();
用于(字符串行:文本行){
某人附加(行);
sb.append(System.lineSeparator());
}
使某人返回字符串();
}
有更简单的方法吗?既然您似乎不介意将整个文件读入内存,请尝试以下方法:
private String removeLines(List<Integer> removeLines, File text) throws IOException {
List<String> textLines = FileUtils.readLines(text, StandardCharsets.UTF_8);
for(Integer removeLine : removeLines) {
textLines.remove(removeLine - 1); // -1, depending on how you specify removeLines
}
StringBuilder builder = new StringBuilder();
for(String line : textLines) {
builder.append(line).append(System.lineSeparator());
}
return builder.toString();
}
逐行复制,跳过所需的行并替换原始文件+1,但请注意,用户希望在删除后保留行号。@任务什么计数?在建议的输出中,OP似乎又开始从1开始编号。是的,从这个意义上说,在删除行之后,OP将需要再次分配行号。我正在使用java 1.7和builder.appendLine();方法不存在,但它要简单得多thanks@nkvnkv更新了我的答案。任何版本中都没有
appendLine()
。不知道我在想什么。
private String removeLines(List<Integer> removeLines, File text) throws IOException {
StringBuilder builder = new StringBuilder();
LineIterator it = FileUtils.lineIterator(text, StandardCharsets.UTF_8);
try {
for (int i = 1; it.hasNext(); i++) {
String line = it.nextLine();
if(!removeLines.contains(i)) {
builder.append(line).append(System.lineSeparator());
}
}
} finally {
LineIterator.closeQuietly(it);
}
return builder.toString();
}