是否有任何API可以从Java源文件生成包结构

时间:2023-01-18 23:48:48

I have a source folder with Java source files. These Java files have different packages. Using javac command I can generate the package structure, but the packages will contain the class files not the source files.

我有一个包含Java源文件的源文件夹。这些Java文件具有不同的包。使用javac命令我可以生成包结构,但包将包含类文件而不是源文件。

Is there any API which generates package structure from Java files and puts Java files into the specific package

是否有任何API从Java文件生成包结构并将Java文件放入特定包中

2 个解决方案

#1


2  

Presuming that you're on Windows, I wrote a batch script to do that.

假设你在Windows上,我写了一个批处理脚本来做到这一点。

Copy the content below into source.bat, place source.bat in the same directory where you find all your .java files and just run it.

将下面的内容复制到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

If however you're on Unix/Linux, here is a bash script. I'm sure this can be done in a much better and concise way but it definitely works.

但是,如果您使用的是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

#2


1  

Here's what I came up for this problem.It opens the java file, reads the package name, generates the structure and copies the file to that structure. Suggestions for improvement are welcome. :)

这就是我提出的这个问题。它打开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;
}
} 

#1


2  

Presuming that you're on Windows, I wrote a batch script to do that.

假设你在Windows上,我写了一个批处理脚本来做到这一点。

Copy the content below into source.bat, place source.bat in the same directory where you find all your .java files and just run it.

将下面的内容复制到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

If however you're on Unix/Linux, here is a bash script. I'm sure this can be done in a much better and concise way but it definitely works.

但是,如果您使用的是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

#2


1  

Here's what I came up for this problem.It opens the java file, reads the package name, generates the structure and copies the file to that structure. Suggestions for improvement are welcome. :)

这就是我提出的这个问题。它打开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;
}
}