Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java根据行号从文件中删除行_Java_File_File Io_Numbers_Line - Fatal编程技术网

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

是否有基于行号删除行的Java库

我的目标是删除基于行号的行

范例

  • 佩伦特式居住者morbi tristique Sentecus et netus et malesuada 著名的ac turpis
  • 埃格斯塔斯。前庭侵权法庭、封建法庭、别有用心法庭、, 暂时坐下来
  • 不要让你的自由人坐在那里。乌尔特里斯埃涅亚酒店 维塔埃斯特。莫里斯
  • Placelat eleifend leo。这是乌拉姆科珀的智慧所在 法雷特拉。前庭
  • 埃拉特·维西、调味品、康茂德·维塔、奥纳雷·西特·维西。 埃尼酵母
  • eget tincidunt调味品、欧洛斯益普生、芸香果、甜慈姑 拉卡斯·埃尼姆酒后驾车
  • 在turpis枕面部进行非enim治疗。乌特·费利斯。普拉森特 达皮布斯,内克·艾德·库苏斯
  • faucibus,tortor neque egestas augue,欧盟 埃拉特。阿利奎姆埃拉特
  • 帕特。Nam dui mi、tincidunt quis、accumsan porttitor、facilisis 卢克图斯,梅特斯
  • 移除第3、4、5行输出应为

  • 佩伦特式居住者morbi tristique Sentecus et netus et malesuada fames ac turpis
  • 埃格斯塔斯。前庭侵权人、世仇、别有用心者、临时诉讼人、担保人
  • 蔬菜调味品,红玫瑰,豆蔻
  • 在turpis枕面部进行非enim治疗。乌特·费利斯。帕雷森特·达皮布斯,内克·伊德·库苏斯
  • 福西布斯,奥古斯塔·奥古斯塔,欧洲大魔王。阿利奎姆埃拉特
  • 帕特。Nam dui mi、tincidunt quis、accumsan porttitor、facilisis 卢克图斯,梅特斯
  • 我制定了一个工作方法

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