Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #12581

I develop a Java program to format Java codes

From gearss8888@gmail.com
Newsgroups comp.lang.java.programmer
Subject I develop a Java program to format Java codes
Date 2012-03-02 03:29 -0800
Organization http://groups.google.com
Message-ID <5690138.193.1330687781011.JavaMail.geo-discussion-forums@ynca15> (permalink)

Show all headers | View raw


The program can format Java codes, the codes formatted will have correct indent spaces.

//----------
/*
Modified: 2012-3-1
it can format java codes so as to get the correct indent spaces.


*/
import java.io.IOException;//引入类
import java.io.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.Reader;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JFileChooser;
import javax.swing.SwingConstants;
import javax.swing.UIManager;

public class Tidy extends JFrame {
    JButton SelectFilebtn, OKbtn;
    JTextField FileNameField;
    String TabBlank = "    "; // 每一次tab的空格大小,这里为默认的四个空格
    int HowManyTab = 0;
    boolean HaveUnCleanRow = false; // 记录有没有编写不规整的程序代码,如果有弹出对话框请用户改正再关闭控制台,如果没有,不显示对话框。
    boolean ForWhileIfBlock = false; // 标志这一行是否for, while or if 开头但却没有{}符号,这说明这个块只有一行。
    public Tidy () {
        this.setTitle( "文件整理器");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST; //设定Layout的位置
        gbc.insets = new Insets(2,2,2,2); //设定与边界的距离(上,左,下,右)
        SelectFilebtn = new JButton("选择文件");
        SelectFilebtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                do_SelectFilebtn_actionPerformed(e);
            }
        });
        FileNameField = new JTextField("",40);
        gbc.gridy=1;
        gbc.gridx=0;
        this.add(SelectFilebtn, gbc);
        gbc.gridx=1;
        this.add(FileNameField, gbc);
        //--------------
        OKbtn = new JButton("OK");
        OKbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String FileName = FileNameField.getText();
                do_OKbtn_actionPerformed(e, FileName);
            }
        });
        gbc.gridy=2;
        gbc.gridx=0;
        this.add(OKbtn, gbc);
        //---------------------
        this.pack();
        this.setVisible(true);
    }
    
    protected void do_SelectFilebtn_actionPerformed (ActionEvent e) {
        JFileChooser chooser = new JFileChooser();// 创建文件选择器
        int option = chooser.showOpenDialog(this);// 显示文件打开对话框
        if (option == JFileChooser.APPROVE_OPTION) {// 判断用户是否选定文件
            File file = chooser.getSelectedFile();// 获取用户选择文件
            FileNameField.setText(file.getAbsolutePath());// 把选择的文件路径显示在文本框中
        }
    }
    
    protected void do_OKbtn_actionPerformed(ActionEvent e, String ThisFile) {
        if (!ThisFile.equals("")) {
            HowManyTab = 0;
            ReadAndCombFile(ThisFile); // 文件名不能为空
        }
    }
    // 根据{和}的个数决定每一行前面需要添加多少个tab空格
    String FileInManyLines (String oneline, int CombRow, String Suffix) {
        String PreffixStr; // 这是每一行开始的空格,它是用来方便阅读的
        String TrimIt = oneline.trim();
        String newoneline = "";
        int Diff = 0;
        // Java程序
        if (Suffix.equals(".java")) {
            int Conutleft = strFind(TrimIt, "{", 0);
            int ConutRight = strFind(TrimIt, "}", 0);
            Diff = Conutleft - ConutRight;
            // 如果前面一行只有一个for, while or if但没有{},所以下面一行就缩进了
            if ((Conutleft == 0) && (ConutRight == 0) && ForWhileIfBlock)
                Diff = 50;
            // for, while or if 开头,但是却没有使用{},说明这个块只有一行。
            if ((Conutleft == 0) && (ConutRight == 0) && ((TrimIt.startsWith("for")) || (TrimIt.startsWith("while")) || (TrimIt.startsWith("if")) || (TrimIt.startsWith("else")) || (TrimIt.startsWith("else if")))) {
                ForWhileIfBlock = true;
                Diff= 100;
            }
            switch (Diff) {
                case 1 : {
                    PreffixStr = ManyTabStr (HowManyTab, TabBlank);
                    HowManyTab = HowManyTab + 1;
                    newoneline = PreffixStr + TrimIt; // 把前缀空格添加到这一行前面
                    break;
                }
                case -1 : {
                    HowManyTab = HowManyTab - 1;
                    PreffixStr = ManyTabStr (HowManyTab, TabBlank);
                    newoneline = PreffixStr + TrimIt; // 把前缀空格添加到这一行前面
                    break;
                }
                case 0 : {
                    PreffixStr = ManyTabStr (HowManyTab, TabBlank);
                    newoneline = PreffixStr + TrimIt; // 把前缀空格添加到这一行前面
                    break;
                }
                case 50 :{
                    PreffixStr = ManyTabStr (HowManyTab, TabBlank);
                    newoneline = PreffixStr + TrimIt; // 把前缀空格添加到这一行前面
                    HowManyTab = HowManyTab - 1;
                    ForWhileIfBlock = false;
                    break;
                }
                case 100 : {
                    PreffixStr = ManyTabStr (HowManyTab, TabBlank);
                    newoneline = PreffixStr + TrimIt; // 把前缀空格添加到这一行前面
                    HowManyTab = HowManyTab + 1;
                    break;
                }
                default: {
                    PreffixStr = ManyTabStr (HowManyTab, TabBlank);
                    newoneline = PreffixStr + TrimIt; // 把前缀空格添加到这一行前面
                    System.out.println("第"+CombRow+"行"+"编写不规整,请改正!");
                    HaveUnCleanRow = true; // 程序最后弹出对话框提醒用户这个程序有编写不规整的代码。
                }
            }
            }  else if (Suffix.equals(".f90") || Suffix.equals(".f95")) { // Fortran程序
            String LowCaseTrimIt = TrimIt.toLowerCase();
            if (LowCaseTrimIt.startsWith("program") || LowCaseTrimIt.startsWith("module") || LowCaseTrimIt.startsWith("subroutine") || ((strFind(LowCaseTrimIt, "function", 0) == 1)) || LowCaseTrimIt.startsWith("do ") || (LowCaseTrimIt.startsWith("if") && (LowCaseTrimIt.endsWith("then"))) || LowCaseTrimIt.startsWith("select") || LowCaseTrimIt.startsWith("case")) {
                Diff = 1;
            }
            else if (LowCaseTrimIt.startsWith("end ") || LowCaseTrimIt.startsWith("enddo") || LowCaseTrimIt.startsWith("endif")) {
                Diff = 2;
            }
            else if (LowCaseTrimIt.startsWith("else")) {
                Diff = 3;
            }
            else
                {Diff = 100;}
                switch (Diff) {
                    case 1 : {
                        PreffixStr = ManyTabStr (HowManyTab, TabBlank);
                    HowManyTab = HowManyTab + 1;
                    newoneline = PreffixStr + TrimIt; // 把前缀空格添加到这一行前面
                    break;
                }
                case 2 : {
                    HowManyTab = HowManyTab - 1;
                    PreffixStr = ManyTabStr (HowManyTab, TabBlank);
                    newoneline = PreffixStr + TrimIt; // 把前缀空格添加到这一行前面
                    break;
                }
                case 3 : {
                    HowManyTab = HowManyTab - 1;
                    PreffixStr = ManyTabStr (HowManyTab, TabBlank);
                    newoneline = PreffixStr + TrimIt; // 把前缀空格添加到这一行前面
                    HowManyTab = HowManyTab + 1;
                    break;
                }
                case 100 : {
                    PreffixStr = ManyTabStr (HowManyTab, TabBlank);
                    newoneline = PreffixStr + TrimIt; // 把前缀空格添加到这一行前面
                    break;
                }
            }
            } else {// 其他格式的文件
            newoneline = oneline;
        }
        return 	newoneline;
    }
    // 生成一个n个tab空格的空白字符串
    String ManyTabStr (int howmany, String TabBlank) {
        String Str = "";
        for (int i = 0; i < howmany; i++)
            Str = Str + TabBlank;
        return Str;
    }
    // 方法strFind用于实现字符串查找,返回匹配的次数
    public int strFind(String s1, String s2, int pos) {
        // 变量i和j分别表示主串和模式串中当前字符串的位置,k表示匹配次数
        int i, j, k = 0;
        // pos代表主串中开始比较的位置
        // i=pos;
        i = 0;// 如果把i=pos改成此句将不从鼠标位置开始找,而是直接从字符串头开始找,i决定着开如查找的位置
        j = 0;
        while (i < s1.length() && j < s2.length()) {
            if (s1.charAt(i) == s2.charAt(j)) {
                ++i;
                ++j;
                if (j == s2.length()) {
                    // j=s2.length()表示字符串匹配成功,匹配成功次数加1
                    k = k + 1;
                    // 将指示主串和模式中当前字符的变量i和j进行回退
                    i = i - j + 1;
                    j = 0;
                }
                else {
                    i = i - j + 1;
                    j = 0;
                }
            }
            i++;
        }
        return k;// 为什么这个while循环没有一个循环控制器呢,我还没有理解它的结构?
    }
    
    //以行为单位读取文件
    String[] readFileByLines (String fileName){
        File file = new File(fileName);
        ArrayList<String> alllinks = new ArrayList<String>();
        BufferedReader reader = null;//创建缓存读取
        try {
            reader = new BufferedReader(new FileReader(file));//将文件放在缓存读取中
            String tempString = null;
            //一次读入一行,直到读入null为文件结束
            while ((tempString = reader.readLine()) != null){
                alllinks.add(tempString);
            }
            reader.close();
            } catch (IOException e) {//捕获异常
            e.printStackTrace();
            } finally {//内容总执行
            if (reader != null) {
                try {
                    reader.close();//关闭缓存读取
                    } catch (IOException e1) {
                }
            }
        }
        String[] links = new String[alllinks.size()];
        for (int count = 0; count < alllinks.size(); count++) {links[count] = alllinks.get(count);}
        return links;
    }
    
    // 把字符串数组写入文件, 即按行写入文件
    public boolean stringArrayToFile(String[] arrayres, String filePath) {
        boolean flag = true;
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        StringBuffer temp = new StringBuffer();
        for (String one : arrayres) {
            temp.append(one);
            temp.append("\n");
        }
        int x = temp.lastIndexOf("\n");
        temp.replace(x, temp.length(), "");
        String res = temp.toString();
        try {
            File distFile = new File(filePath);						//创建文件
            if (!distFile.getParentFile().exists())					//判断父路径是文件夹是否存在
                distFile.getParentFile().mkdirs();					//可以在不存在的目录中创建文件夹
            bufferedReader = new BufferedReader(
            new StringReader(res));							//将原字符串读入缓冲
            bufferedWriter = new BufferedWriter(
            new FileWriter(distFile));						//将文件写入缓冲
            char buf[] = new char[1024];							// 字符缓冲区
            int len;
            while ((len = bufferedReader.read(buf)) != -1) {		//while循环
                bufferedWriter.write(buf, 0, len);					//将字符串写入文件
            }
            bufferedWriter.flush();									//刷新写入流的缓冲
            bufferedReader.close();									//关闭读出流
            bufferedWriter.close();									//关闭写入流
            } catch (IOException e) {									//捕获异常
            e.printStackTrace();
            flag = false;
            return flag;
            } finally {												//finally方法总被执行
            if (bufferedReader != null) {							//判断读出流是否为空
                try {
                    bufferedReader.close();							//确保读出流关闭
                    } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;												//返回布尔类型
    }
    
    void ReadAndCombFile (String filename) {
        String[] FileDivideToManyLines = readFileByLines (filename);
        // 获取文件的后缀名
        int FileSuffixLoc = filename.lastIndexOf(".");
        String FileSuffix = filename.substring(FileSuffixLoc, filename.length());
        ArrayList<String> FileCombed = new ArrayList <String> (); // 储存加入合适前面空行的新的一行字符
        int RowNumber = 1; // 记录现在处理第几行的代码,使用这个行数提醒开发者哪里出错了
        for (String oneline : FileDivideToManyLines) {
            String newLine = FileInManyLines (oneline, RowNumber, FileSuffix);
            FileCombed.add(newLine);
            RowNumber = RowNumber + 1;
        }
        String[] FileCombInStr = new String[FileCombed.size()];
        for (int count = 0; count < FileCombed.size(); count ++) {FileCombInStr [count] = FileCombed.get(count);}
        stringArrayToFile (FileCombInStr, filename);
        if (HaveUnCleanRow) {JOptionPane.showMessageDialog(null, "有不规整的代码,请改正。");}
    }
    
    public static void main(String[] args)  {
        Tidy TideFiles = new Tidy();
    }
}

Back to comp.lang.java.programmer | Previous | NextNext in thread | Find similar


Thread

I develop a Java program to format Java codes gearss8888@gmail.com - 2012-03-02 03:29 -0800
  Re: I develop a Java program to format Java codes Novice <novice@example..com> - 2012-03-02 13:44 +0000
  Re: I develop a Java program to format Java codes Lew <noone@lewscanon.com> - 2012-03-02 09:25 -0800
  Re: I develop a Java program to format Java codes Roedy Green <see_website@mindprod.com.invalid> - 2012-03-02 10:04 -0800
    Re: I develop a Java program to format Java codes Lew <noone@lewscanon.com> - 2012-03-02 10:18 -0800
    Re: I develop a Java program to format Java codes Lars Enderin <lars.enderin@telia.com> - 2012-03-02 19:24 +0100
    Re: I develop a Java program to format Java codes Arne Vajhøj <arne@vajhoej.dk> - 2012-03-02 17:04 -0500
  Re: I develop a Java program to format Java codes gearss8888@gmail.com - 2012-03-02 15:55 -0800
    Re: I develop a Java program to format Java codes Arne Vajhøj <arne@vajhoej.dk> - 2012-03-02 19:05 -0500
    Re: I develop a Java program to format Java codes Lew <noone@lewscanon.com> - 2012-03-02 16:07 -0800
      Re: I develop a Java program to format Java codes gearss8888@gmail.com - 2012-03-02 19:24 -0800
        Re: I develop a Java program to format Java codes Lew <noone@lewscanon.com> - 2012-03-02 21:20 -0800
    Re: I develop a Java program to format Java codes Wanja Gayk <brixomatic@yahoo.com> - 2012-03-10 13:01 +0100
      Re: I develop a Java program to format Java codes Roedy Green <see_website@mindprod.com.invalid> - 2012-03-15 03:42 -0700
  Re: I develop a Java program to format Java codes gearss8888@gmail.com - 2012-03-02 18:57 -0800
    Re: I develop a Java program to format Java codes Lew <noone@lewscanon.com> - 2012-03-02 21:22 -0800

csiph-web