我有一个包含Java源文件的源文件夹。这些Java文件具有不同的包。使用javac命令我可以生成包结构,但包将包含类文件而不是源文件。
是否存在从Java文件生成包结构并将Java文件放入特定包
的API答案 0 :(得分:2)
假设你在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
答案 1 :(得分:1)
以下是我为此问题提出的问题。它打开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;
}
}