Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #12581
| 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) |
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 | Next — Next in thread | Find similar
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