2

我正在通过教科书自学 Java 编程。一个练习要求您编写一个重新格式化整个源代码文件的程序(使用命令行):

从此格式(下一行大括号样式):

public class Test
{
    public static void main(String[] args)
    {
    // Some statements
    }
}

到这种格式(行尾大括号样式):

public class Test {
    public static void main(String[] args) {
    // Some statements
    }
}

这是我到目前为止的代码:

import java.io.*;
import java.util.*;

public class FOURTEENpoint12 {

public static void main(String[] args) throws IOException {

    if (args.length != 2) {
        System.out.println
                    ("Usage: java FOURTEENpoint12 sourceFile targetFile");
        System.exit(1);
    }

    File sourceFile = new File(args[0]);
    File targetFile = new File(args[1]);

    if (!sourceFile.exists()) {
        System.out.println("File does not exist");
        System.exit(2);
    }

    Scanner input = new Scanner(sourceFile);
    PrintWriter output = new PrintWriter(targetFile);

    String token;


    while (input.hasNext()) {
        token = input.next();
        if (token.equals("{"))
            output.println("\n{\n");
        else
            output.print(token + " ");

    }

    input.close();
    output.close();
}

}

我有两个问题:

  1. 我尝试了许多不同的 while 块,但无法得到接近本书所要求的任何内容。我已经尝试过正则表达式、分隔符、令牌数组的不同组合,但仍然很遥远。

  2. 这本书要求您重新格式化单个文件,但该章从未解释过如何做到这一点。它仅说明如何将文本重写到新文件中。所以我只是编写了程序来创建一个新文件。但我真的很想按照问题要求的方式去做。

如果有人可以帮助我解决这两个问题,它实际上会解决我在很多练习中遇到的许多问题。提前致谢。

4

4 回答 4

1

如果我正确阅读了您的问题,您所需要的只是跟踪前一行和当前行。既然你在学习,我就给你粗略的提纲:

  • 如果当前行只包含大括号和空格,则忘记当前行,在上一行添加空格和大括号,并将其保留为上一行。

  • 否则将上一行写入输出,将当前行设置为上一行。

  • 读取新的当前行并在上面重复,直到输入文件结束。

尝试更改您的代码以匹配它,逐行阅读。

{您可以通过修剪和比较来检测行是否是"{",或者使用正则表达式

"^\\s*\\{\\s*$"(未经测试)。

注意:这是最简单的版本,它假设可移动是单独支撑在一条线上。

于 2013-08-26T12:47:14.110 回答
1

这对于一个简单的正则表达式是可行的。

您想替换) *any whitesplace character* {) {.

在 java 正则表达式中,有一个预定义的正则表达式:\s匹配所有空白字符:[ \t\n\x0B\f\r]

在这里,您要替换)\s*{) {.

为此,将整个文件加载到一个字符串中(input下面调用)并使用String#replaceAll(String regex, String replacement)

//Added the escape characters...
input.replaceAll("\\)\\s*\\{", ") {");

测试 :

String input = "public static void main()    \n    {";
System.out.println(input.replaceAll("\\)\\s*\\{", ") {"));

输出 :

public static void main() {
于 2013-08-26T13:27:02.127 回答
0

第一:hasNextLine()并且nextLine()似乎更适合于逐行阅读。

然后考虑必须做什么。

读:

line = "    public static void main(String[] args)";

读:

line = "    {"

写:

public static void main(String[] args) {

其他一切都必须复制。

也许您想print(line)代替println(line)并单独确定 a println()? 也许你需要记住你刚刚做了什么boolean linePrintedWithoutLn = false;

于 2013-08-26T13:02:21.213 回答
0
   import java.io.*;
   import java.util.Scanner;
   public class ReformatinCode {
      public static void main(String[] args) throws Exception{
        File f1 = new File ("java8_19.txt");
        File f2 = new File("java8_19_result.txt");

        Scanner scr1 = new Scanner(f1);
        StringBuffer sb1 = new StringBuffer();
        PrintWriter pw1 = new PrintWriter(f2);
        while(scr1.hasNext()){
            sb1.append(scr1.nextLine() + System.lineSeparator());
        }
        scr1.close();

        String output = format(sb1.toString());
        System.out.println(output);
        pw1.print(output);
        pw1.close();
    }

public static String format(String s){
        String result ="";  
        result = s.replaceAll("\\\r\\n\\s\\{","\\{");
        return result;
    }

}
/* this is a working answer , notice that the code that needed to be   reformated is stored in the file "java8_19.txt"... and the file "java8_19_result.txt" will be created after running the code.... both will be in the workspace directory within the package folder
于 2016-04-05T10:35:43.643 回答