我有一个包含 Java 源文件的源文件夹。这些 Java 文件有不同的包。使用 javac 命令我可以生成包结构,但包将包含类文件而不是源文件。
是否有任何 API 可以从 Java 文件生成包结构并将 Java 文件放入特定包中
我有一个包含 Java 源文件的源文件夹。这些 Java 文件有不同的包。使用 javac 命令我可以生成包结构,但包将包含类文件而不是源文件。
是否有任何 API 可以从 Java 文件生成包结构并将 Java 文件放入特定包中
假设您使用的是 Windows,我编写了一个批处理脚本来执行此操作。
将下面的内容复制到 中source.bat
,放在source.bat
找到所有.java
文件的同一目录中,然后运行它。
@echo off
@setlocal enabledelayedexpansion
for /f "usebackq delims=" %%f in (`dir /s /b *.java`) do (
set file=%%~nxf
for /f "usebackq delims=" %%p in (`findstr package %%~nxf`) do (
set package=%%p
set package=!package:*.java:=!
set package=!package:package =!
set package=!package:;=!
set package=!package:.=\!
echo Expanding !package!...
mkdir !package!
xcopy /f %%~nxf !package!
)
)
@endlocal
但是,如果您使用的是 Unix/Linux,这里有一个bash
脚本。我确信这可以以更好和简洁的方式完成,但它绝对有效。
#! /bin/bash
for file in *.java
do
package=`grep -h 'package' $file`
package=`echo $package | sed 's/package//g'`
package=`echo $package | sed 's/;//g'`
package=`echo $package | sed 's/\./\//g'`
echo Expanding $package...
mkdir -p $package
cp $file $package
done
这是我为这个问题提出的问题。它打开java文件,读取包名,生成结构并将文件复制到该结构。欢迎提出改进建议。:)
public final class FileListing {
private Map packageMap;
public void createPackageStructure(String sourceDir) throws FileNotFoundException
{
FileListing fileListing = new FileListing();
File startingDirectory= new File(sourceDir);
fileListing.packageMap = new HashMap();
List<File> files = fileListing.getFileListing(startingDirectory, fileListing.getPackageMap());
fileListing.moveFiles(fileListing.packageMap);
}
public List<File> getFileListing(File aStartingDir, Map packageMap) throws FileNotFoundException
{
validateDirectory(aStartingDir);
List<File> result = getFileListingNoSort(aStartingDir,packageMap);
Collections.sort(result);
return result;
}
private List<File> getFileListingNoSort(File aStartingDir, Map packageMap) throws FileNotFoundException
{
List<File> result = new ArrayList<File>();
File[] filesAndDirs = aStartingDir.listFiles();
List<File> filesDirs = Arrays.asList(filesAndDirs);
for(File file : filesDirs)
{
result.add(file);
if(file.isFile())
{
packageMap.put(file, readPackageName(file.getAbsolutePath()).replace(".", "/").replace(";", "/"));
}
else
{
//must be a directory
//recursive call!
List<File> deeperList = getFileListingNoSort(file,packageMap);
result.addAll(deeperList);
}
}
return result;
}
public String readPackageName(String filePath)
{
String packageName=null;
String line;
String temp[] = new String[2];
BufferedReader br=null;
try{
File javaFile = new File(filePath);
br = new BufferedReader(new FileReader(javaFile));
while((line=br.readLine())!=null)
{
if(line.indexOf("package")!=-1)
{
temp = line.split(" ");
break;
}
}
br.close();
}catch(FileNotFoundException fnfe)
{
fnfe.printStackTrace();
}catch(IOException ioe)
{
ioe.printStackTrace();
}
return temp[1];
}
public void moveFiles(Map packageMap)
{
Set keySet = packageMap.keySet();
Iterator it = keySet.iterator();
File sourceFile, destFile, destDirs;
InputStream in = null;
OutputStream out = null;
byte[] buf = new byte[1024];
int len;
try{
while(it.hasNext())
{
sourceFile = (File)it.next();
destDirs = new File("src/"+(String)packageMap.get(sourceFile));
destFile = new File("src/"+ (String)packageMap.get(sourceFile)+"/"+sourceFile.getName());
destDirs.mkdirs();
in = new FileInputStream(sourceFile);
out = new FileOutputStream(destFile);
while((len = in.read(buf)) > 0){
out.write(buf, 0, len);
}
}
}catch(FileNotFoundException fnfe)
{
fnfe.printStackTrace();
}catch(IOException ioe)
{
ioe.printStackTrace();
}
}
static private void validateDirectory (File aDirectory) throws FileNotFoundException
{
if (aDirectory == null) {
throw new IllegalArgumentException("Directory should not be null.");
}
if (!aDirectory.exists()) {
throw new FileNotFoundException("Directory does not exist: " + aDirectory);
}
if (!aDirectory.isDirectory()) {
throw new IllegalArgumentException("Is not a directory: " + aDirectory);
}
if (!aDirectory.canRead()) {
throw new IllegalArgumentException("Directory cannot be read: " + aDirectory);
}
}
public Map getPackageMap()
{
return this.packageMap;
}
}