我正在编写将项目保存在所选目录中所需的程序。每个项目目录必须包含一个HTML文件,该文件可能具有不同的元素,具体取决于项目的状态,以及子目录中的标准JavaScript文件库。
我不熟悉通常用Java完成的方法(甚至不知道如何在理论上完成)。是否有适合此任务的特定工具,技术或库?请注意,我使用Eclipse作为我的IDE。我一直在考虑使用某种模板生成所需的文件,和/或从包中提取它们,但我对这类问题很新,不知道如何从这里开始。
编辑:进一步阐述
我的项目是一个供个人使用的小工具,因此可维护性不会成为一个问题。我使用的是Java 8.在每个用户创建的项目中,库中只有三个不变的.js文件和一个小的html文件,它将在浏览器中启动以运行脚本,以及用户生成的.js文件。非常基本的东西。
编辑:问题解决了......我想
我已经提出了我自己的部分解决方案,我想我可以从这里找出其余部分,但是DB的帖子仍然提供了信息和帮助,所以我接受了它作为答案。
我意识到我原来的问题不够具体。我希望隐藏我的静态脚本资源和HTML文件的模板,以便无法从文件系统直接访问它们。我一直在考虑将它们放在某种类型的包文件中,该文件与应用程序jar位于同一目录中。然而,我想到了我可以简单地将它们放在jar本身的资源文件夹中。
在用户指定的项目目录中创建libraries目录:
libraryDir = projectDir.resolve("libraries");
new File(libraryDir.toUri()).mkdirs(); // Create libraries directory
// Unpack library resources to project
unpackLibrary("file1.js");
unpackLibrary("file2.js");
unpackLibrary("file3.js");
unpackLibrary函数:
private void unpackLibrary(String scriptName) {
String resourcePath = "/libraries/" + scriptName;
Path fileName = Paths.get(resourcePath).getFileName();
try (InputStream in = getClass().getResourceAsStream(resourcePath);) {
Files.copy(in, libraryDir.resolve(fileName));
}
catch (FileAlreadyExistsException e) {
System.out.println("File unpack failed: File already exists (" + e.getFile() + ")");
}
catch (IOException e) {
e.printStackTrace();
}
}
应用程序将在临时目录中使用项目,直到用户决定保存它为止,在这种情况下,我将使用D.B。的建议将项目文件复制到新目录。
答案 0 :(得分:0)
如何继续完全取决于您和您的项目要求。这实际上取决于这些文件将被用于什么,它们将如何被维护等。使用模板似乎是一个很好的解决方案,因为在生成一组新项目时,您可以简单地替换模板中的变量/标记文件。这些模板是否以某种方式打包/压缩再次取决于您。如果你有充分的理由打包或拉链,那么就这样做,如果没有,那么他们真的没理由这么做。
如果使用模板,基本技术将是:读取模板,通过用值替换变量/标记来处理模板,将结果数据写入新文件。
如果您正在使用Java 1.7或更高版本,请查看java.nio包和tutorial for Java file I/O featuring NIO,因为它非常好,将帮助您了解API以及如何使用它来操纵文件。
希望这有助于您入门。
编辑 - 以下是我在评论中承诺的更新:
据我所知,程序必须将一组静态文件复制到一个新目录中。因为你有一个"项目"正在进行的概念我不认为代码应该替换现有文件,因此如果项目文件已经存在,则该程序将失败。
假设:
以下是代码:
<强> SaveProjectFolderMain.java 强>
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class SaveProjectFolderMain {
//Note: In eclipse your templates folder must be inside the eclipse project's root directory
// in order for this path to be correct. E.g. myProject/templates
// If this program is run outside of eclipse it will look for a templates folder
// in the current working directory - the directory in which the jar resides.
// E.g. if you jar lives in C:\myProgram then your templates should live in
// C:\myProgram\templates (obviously this is a Windows file system example)
private static final Path TEMPLATES_DIR = Paths.get("templates");
public static void main(String[] args) {
//Copies the template files to a new folder called "testProject"
// creating the project folder if it does not exist.
saveProjectDir(Paths.get("testProject"));
}
public static void saveProjectDir(Path dirToSaveTo){
try {
if(!Files.exists(dirToSaveTo)){
System.out.println("The directory " + dirToSaveTo.toAbsolutePath() + " does not exist, it is being created.");
Files.createDirectories(dirToSaveTo);
}
Files.walkFileTree(TEMPLATES_DIR, new CopyFileVisitor(dirToSaveTo));
} catch (IOException e) {
System.err.println("Unable to copy template files to the save location: " + dirToSaveTo.toAbsolutePath());
e.printStackTrace();
}
}
}
<强> CopyFileVisitor.java 强>
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class CopyFileVisitor extends SimpleFileVisitor<Path> {
private final Path targetPath;
private Path sourcePath = null;
public CopyFileVisitor(Path targetPath) {
this.targetPath = targetPath;
}
@Override
public FileVisitResult preVisitDirectory(final Path dir,
final BasicFileAttributes attrs) throws IOException {
if (sourcePath == null) {
sourcePath = dir;
} else {
Path destDir = targetPath.resolve(sourcePath.relativize(dir));
System.out.println("Creating directory: " + destDir);
Files.createDirectories(destDir);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(final Path file,
final BasicFileAttributes attrs) throws IOException {
Path destFilePath = targetPath.resolve(sourcePath.relativize(file));
System.out.println("Copying " + file.toAbsolutePath() + " to " + destFilePath.toAbsolutePath());
Files.copy(file, destFilePath);
return FileVisitResult.CONTINUE;
}
}