是否有Java库可以根据行号删除行?

我的目的是根据行号删除行。




Pellentesque居民morbi tristique senectus et netus et Malesuada
名人堂
egestas。 Vestibulum tortor quam,feugiat vitae,溃疡
tempor amet,事前。
Donec eu libero坐在书架上。埃尼昂ultricies mi
毛里维斯
莱普拉特·伊莱芬德·利奥。 Quisque sit amet est et sapien ullamcorper
pharetra。 sti
韦斯特(East Wisi),调味品sed,康莫多(commodo vitae),艾米塔娜(ornare)
    埃涅阿发酵罐
eget tincidunt调味品,eros ipsum rutrum orci,弓形虫
    Lacus Enim ac dui。
Donec non enim in turpis pulvinar facilisis。费利斯。 Praesent
dapibus,neid id诅咒
faucibus,tor neque egestas augue,欧盟vulputate magna eros eu
删除。阿里夸特
Volutpat。 Nam dui mi,Tincidunt quis,Accumsan Porttitor,facilisis
luctus,metus


删除第3、4、5行的输出应为


Pellentesque居民morbi tristique senectus et netus et malesuada名望ac turpis
egestas。 Vestibulum tortor quam,feugiat vitae,ultureies eget,tempor sit amet,ante。
eget tincidunt调味品,eros ipsum rutrum orci,矢状天妇座菜。
Donec non enim in turpis pulvinar facilisis。费利斯。 Praesent dapibus,neid id cursus
faucibus,torque neque egestas augue,eu vulputate magna eros eu erat。阿里夸特
Volutpat。 Nam dui mi,Tincidunt quis,Accumsan Porttitor,facilisis
luctus,metus


我已经制定了工作方法

 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();
    }


有没有更简单的方法可以做到这一点?

最佳答案

由于您似乎不介意将整个文件读入内存,因此请尝试以下操作:

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();
}


另外,您也可以使用LineIterator做这样的事情:

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();
}

关于java - Java根据行号从文件中删除行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24430565/

10-10 07:38