Java ソース ファイルを含むソース フォルダーがあります。これらの Java ファイルには異なるパッケージがあります。javac コマンドを使用してパッケージ構造を生成できますが、パッケージにはソース ファイルではなくクラス ファイルが含まれます。
Java ファイルからパッケージ構造を生成し、Java ファイルを特定のパッケージに入れる API はありますか
Java ソース ファイルを含むソース フォルダーがあります。これらの Java ファイルには異なるパッケージがあります。javac コマンドを使用してパッケージ構造を生成できますが、パッケージにはソース ファイルではなくクラス ファイルが含まれます。
Java ファイルからパッケージ構造を生成し、Java ファイルを特定のパッケージに入れる API はありますか
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;
}
}