我正在编写一个java程序来删除同一个java程序中的注释。 我在考虑使用文件阅读器。但我不确定它是否会奏效。
因为两个进程将使用相同的文件。
但我认为在执行代码之前,java文件将生成.class
文件。
因此,如果我使用filereader
来编辑java文件。它不应该让我错误,另一个进程已经在使用此文件。
我的想法是否正确?
提前致谢。
答案 0 :(得分:7)
是的,你可以毫无问题地做到这一点。
注意:请注意以下事项:
String notAComment = "// This is not a comment";
答案 1 :(得分:7)
如果您只想从Java程序中删除注释,为什么不使用正则表达式进行简单搜索和替换,并将所有注释转换为空字符串?
在Java中,这是一种冗长的方式:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedReader;
class Cleaner{
public static void main( String a[] )
{
String source = readFile("source.java");
System.out.println(source.replaceAll("(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|(?://.*)",""));
}
static String readFile(String fileName) {
File file = new File(fileName);
char[] buffer = null;
try {
BufferedReader bufferedReader = new BufferedReader( new FileReader(file));
buffer = new char[(int)file.length()];
int i = 0;
int c = bufferedReader.read();
while (c != -1) {
buffer[i++] = (char)c;
c = bufferedReader.read();
}
} catch (IOException e) {
e.printStackTrace();
}
return new String(buffer);
}
}
答案 2 :(得分:2)
你是对的,不是两个进程使用同一个文件,你的程序将使用.class
文件并处理.java
文件。您可能需要仔细查看此页面:
Finding Comments in Source Code Using Regular Expressions
答案 3 :(得分:2)
是的,使用FileReader会有效。要注意的一件事是FileEncoding,如果你可能有非英文字符或跨不同平台工作。在Eclipse和其他IDE中,您可以将Java源文件的字符集更改为不同的编码。如果不确定,可能值得使用:
InputStream in = ....
BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF-8"));
..
同样在输出输出时,请使用带UTF-8的OutputStreamWriter。
答案 4 :(得分:1)
查看帖子Remove comments from String来做你的事情。您可以使用FileReader
或java.util.Scanner
类来读取文件。
答案 5 :(得分:1)
它很晚但可能会帮助一些人删除所有类型的评论。
package com.example;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
class CommentRemover {
public static void main(String a[]) {
File file = new File("F:/Java Examples/Sample.java");
String fileString = readLineByLine(file);
fileString = fileString.replaceAll(
"(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)", "");
System.out.println(fileString);
}
private static String readLineByLine(File file) {
String textFile = "";
FileInputStream fstream;
try {
fstream = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(
fstream));
String strLine;
while ((strLine = br.readLine()) != null) {
textFile = textFile + replaceComments(strLine) + "\n";
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return textFile;
}
private static String replaceComments(String strLine) {
if (strLine.startsWith("//")) {
return "";
} else if (strLine.contains("//")) {
if (strLine.contains("\"")) {
int lastIndex = strLine.lastIndexOf("\"");
int lastIndexComment = strLine.lastIndexOf("//");
if (lastIndexComment > lastIndex) { // ( "" // )
strLine = strLine.substring(0, lastIndexComment);
}
} else {
int index = strLine.lastIndexOf("//");
strLine = strLine.substring(0, index);
}
}
return strLine;
}
}
答案 6 :(得分:0)
我为这种必要性制作了一个开源android:layout_weight
,你可以删除单行和多行Java注释。
它支持删除或不删除TODO 它也支持JavaScript,HTML,CSS,属性,JSP和XML注释。
小代码片段如何使用它(有2种类型用法):
第一种方式是InternalPath
public static void main(String[] args) throws CommentRemoverException {
// example for externalInternalPath
CommentRemover commentRemover = new CommentRemover.CommentRemoverBuilder()
.removeJava(true) // Remove Java file Comments....
.removeJavaScript(true) // Remove JavaScript file Comments....
.removeJSP(true) // etc..
.removeTodos(true) // Remove todos
.removeSingleLines(false) // Do not remove single line type comments
.removeMultiLines(true) // Remove multiple type comments
.startExternalPath("/Users/user/Projects/MyOtherProject")// Give it full path for external directories
.setExcludePackages(new String[]{"src.main.java.model"}) // Refers to /Users/user/Projects/MyOtherProject/src/main/java/model and skips this directory.
.build();
CommentProcessor commentProcessor = new CommentProcessor(commentRemover);
commentProcessor.start();
}
第二种方式ExternalPath
CREATE TABLE #Table1
(
[uid] INT ,
[company] VARCHAR(7) ,
[last_complaint] DATETIME
);
INSERT INTO #Table1
( [uid], [company], [last_complaint] )
VALUES ( 1, 'Foo inc', '2015-01-01 00:00:00' ),
( 2, 'Bar ltd', '2015-02-02 00:00:00' ),
( 3, 'Baz inc', '2015-03-03 00:00:00' ),
( 4, 'Bar ltd', '2015-04-04 00:00:00' ),
( 5, 'Foo inc', '2015-05-05 00:00:00' );
SELECT #Table1.*
FROM #Table1
INNER JOIN ( SELECT company ,
ROW_NUMBER() OVER ( ORDER BY MAX(last_complaint) DESC ) rn
FROM #Table1
GROUP BY company
) t ON t.company = #Table1.company
ORDER BY rn ,
last_complaint DESC
DROP TABLE #Table1
答案 7 :(得分:-1)
public class Copy {
void RemoveComments(String inputFilePath, String outputFilePath) throws FileNotFoundException, IOException {
File in = new File(inputFilePath);
File out = new File(outputFilePath);
BufferedReader bufferedreader = new BufferedReader(new FileReader(in));
PrintWriter pw = new PrintWriter(new FileWriter(out));
String line = null, lineToRemove = null;
while ((line = bufferedreader.readLine()) != null) {
if (line.startsWith("/*") && line.endsWith("*/")) {
lineToRemove = line;
}
if (!line.trim().equals(lineToRemove)) {
pw.println(line);
pw.flush();
}
}
}
}