在Java中现有数据之间的文本文件中添加数据[重复]

Posted

技术标签:

【中文标题】在Java中现有数据之间的文本文件中添加数据[重复]【英文标题】:Adding data in a text file between already existing data in Java [duplicate] 【发布时间】:2015-08-03 23:44:17 【问题描述】:

我需要在类名或方法名之前在 text/java 文件中添加 这是一个类这是一个方法(行号可通过 japa 获得) .

我已经尝试了所有可能的情况,尝试使用文件读取器/写入器编辑文本/Java 文件(但它总是附加在末尾,并且想要上面的类/方法名称),pmd,japa(可以读取但可以't find option to edit) 和随机访问文件界面(也可以编辑,但不追加,而是覆盖字符)。

到目前为止没有任何帮助,有什么方法可以实现吗?

例如原始源代码:

import java.lang.*;
class test1
    public static void main(String[] args) 
        System.out.println("hello world");
    

之后

import java.lang.*;
/*this is a class*/
class test1
    /*this is a method*/
    public static void main(String[] args) 
        System.out.println("hello world");
    

【问题讨论】:

你如何确定在哪里追加。如果您有逻辑,那么您应该读取行并重写文件。通常这种代码操作是使用抽象语法树(AST)完成的 不清楚你在问什么。您是否在问 Java 中有哪些方法可以读取文本文件、解析它并根据内容更新文件?目前尚不清楚 java 标记是因为您碰巧正在读取 Java 文件还是因为解决方案必须使用 Java。请澄清。 我使用过 japa 或通过简单的文本阅读器,您可以找到类名及其行号,然后 lineNo-1 是我需要添加的行 /*this is method/class*/ ,就是这样不是问题,我想在公共课 abc 之前添加评论而不修改任何其他内容 这可以通过使用 RegEx 和缓冲区读取文本文件直到公共类 XXX 来完成并重写原始文件。但这不是好的方法。如果您没有找到位置公共类 XXX,您的代码以后可能无法编译。这可能是因为注释 /* public class XXX .....*/ 其实我也想过这种方法,在不同的文件或字符串中读取上部内容,在不同的文件/字符串中休息,在第一部分附加所需的数据,然后再次附加其余的代码,但这不是好的方法,加上它对于小代码的 OK 如果代码是 1000 行或更多 【参考方案1】:

您可以使用 JavaParser 并实现自己的 ModifierVisitorAdapter。在下面找到一个可以开始的小 sn-p。

import japa.parser.JavaParser;
import japa.parser.ParseException;
import japa.parser.ast.CompilationUnit;
import japa.parser.ast.Node;
import japa.parser.ast.body.ClassOrInterfaceDeclaration;
import japa.parser.ast.body.MethodDeclaration;
import japa.parser.ast.comments.BlockComment;
import japa.parser.ast.visitor.ModifierVisitorAdapter;
import java.io.File;
import java.io.IOException;

public class ModifierVisitorAdapterDemo 

    public static void main(String[] args) throws IOException, ParseException 
        File sourceFile = new File("Test.java");
        CompilationUnit cu = JavaParser.parse(sourceFile);
        cu.accept(new ModifierVisitor(), null);

        // instead of printing it to stdout you can write it to a file
        System.out.println("// enriched cource");
        System.out.println(cu.toString());

        // to save it into the original file
        // this will overwrite the input file
        Files.write(sourceFile.toPath(), 
                cu.toString().getBytes(Charset.defaultCharset()), 
                StandardOpenOption.TRUNCATE_EXISTING
        );
    

    private static class ModifierVisitor extends ModifierVisitorAdapter 

        @Override
        public Node visit(ClassOrInterfaceDeclaration n, Object arg) 
            if (!n.isInterface()) 
                n.setComment(new BlockComment(" this is a class "));
            
            return super.visit(n, arg);
        

        @Override
        public Node visit(MethodDeclaration n, Object arg) 
            n.setComment(new BlockComment(" this is a method "));
            return super.visit(n, arg);
        
    

假设以下输入文件Test.java

import java.lang.System;

class Test 

    static class Foo 
    

    static interface IFace 
    

    public static void main(String... args) 
    

输出将是

// enriched cource
import java.lang.System;

/* this is a class */
class Test 

    /* this is a class */
    static class Foo 
    

    static interface IFace 
    

    /* this is a method */
    public static void main(String... args) 
    

【讨论】:

感谢次优的答案,我也尝试过,但我不需要在屏幕上显示更改的输出,而是保存在我从中读取的确切文件中, @shrikant.sharma 看看我更新的答案。【参考方案2】:

您绝对可以使用 JavaParser 来做到这一点。您可以访问查找所有类和方法的树(您可以使用访问者来执行此操作,或者只是从文件的根目录 (CompilationUnit) 开始并递归调用 node.getChildrenNodes()。当您找到 ClassOrInterfaceDeclaration 或 MethodDeclaration 的实例时,您只需使用 node.setComment() 方法添加评论

现在您可以使用 DumpVisitor 转储文件(从 AST 转回源代码)或直接调用 compilationUnit.toString()

免责声明:我是 JavaParser 贡献者

在此处免费提出其他问题或在 GitHub 上打开问题。该项目目前维护在https://github.com/javaparser/javaparser

【讨论】:

谢谢大家得到了解决方案,谢谢@SubOptimal 和@Federico Tomassetti,实际上这很容易,在进行更改后,fileWriter(cu.toString) 完成了这项工作,@SubOptimal 你能把你的工作项目寄给我吗连同所需的 jar shrikant.sharma606@gmail.com,因为当我在 eclipse 中处理你的代码时,它给出错误Files.write(sourceFile.toPath(), cu.toString().getBytes(Charset.defaultCharset()), StandardOpenOption.TRUNCATE_EXISTING );),我也想了解你的做法。 @shrikant.sharma 你有一个错字);) 或者你使用的是Java 7之前的版本。

以上是关于在Java中现有数据之间的文本文件中添加数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不删除现有数据的情况下写入文件[重复]

如何将文本附加到 Java 中的现有文件?

如何在java中将字符串保存在文件中[重复]

Java 几分钟处理完 30 亿个数据?

为啥在更新现有实体时会出现重复的实体?

如何将字段添加到现有模型[重复]