2016-09-17 2 views
0

Я пишу программу, которая требуется для сохранения проекта в выбранном каталоге. Каждый каталог проекта должен содержать HTML-файл, который может иметь разные элементы в зависимости от состояния проекта, а также стандартную библиотеку файлов JavaScript в подкаталоге.Как создать структуру каталогов, которая включает копии определенных файлов?

Я не знаком со средствами, с помощью которых это обычно можно выполнить на Java (или даже как это можно было бы сделать в теории). Есть ли какой-то конкретный инструмент, техника или библиотека, подходящие для этой задачи? Обратите внимание, что я использую Eclipse в качестве моей IDE. Я думал о создании файлов, требуемых с использованием каких-то шаблонов, и/или извлечения их из пакета, но я очень новичок в этой проблеме и не знаю, как исходить из этого.

EDIT: Разрабатывая дальнейшие

Мой проект является небольшая утилита для моего личного использования, так ремонтопригодности не будет большой проблемой. Я использую Java 8. В рамках каждого проекта, созданного пользователем, в библиотеке будет только три неизменных .js-файла и небольшой html-файл, который будет запущен в браузере для запуска скриптов вместе с созданным пользователем .js-файлом. Очень простой материал.

EDIT: Проблема решена ... Я думаю

Я пришел с моим собственным частичным решением, и я думаю, что я могу понять остальное отсюда, но после DB был еще информативным и полезно, поэтому я принимаю это как ответ.

Я понимаю, что мой первоначальный вопрос был недостаточно конкретным. Я надеялся скрыть свои статические ресурсы сценария и шаблон для HTML-файла, чтобы они не могли быть напрямую доступны из файловой системы. Я рассматривал возможность размещения их в каком-то файле пакета, который будет находиться в том же каталоге, что и приложение. Однако мне показалось, что я могу просто разместить их в папке с ресурсами в самой банке.

Создание каталога библиотек в пределах заданной пользователем директории проекта:

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(); 
    } 
} 

Приложение будет работать с проектом во временном каталоге до тех пор, пока пользователь не решит сохранить это, и в этом случае я буду использовать предложения БД для копирования файлов проекта в новый каталог.

ответ

0

Как вы продвигаетесь полностью зависит от вас и ваших требований к проекту. Это действительно зависит от того, для чего эти файлы будут использоваться, как они будут поддерживаться и т. Д. Использование шаблонов, похоже, будет хорошим решением, так как вы можете просто заменить переменные/токены в шаблоне при создании нового набора проектов файлы. Независимо от того, каким образом эти шаблоны каким-то образом упакованы/застегнуты на молнии, это снова зависит от вас. Если у вас есть веская причина, чтобы упаковать или почерпнуть их, сделайте это, если нет, тогда нет причин, по которым они должны быть.

Если вы используете шаблоны, основным способом будет: прочитать шаблон, обработать шаблон, заменив переменные/токены на значения, записать полученные данные в новый файл.

Если вы используете Java 1.7 или выше, посмотрите на пакет java.nio и tutorial for Java file I/O featuring NIO, так как он очень хорош и поможет вам понять API и как его использовать для управления файлами.

Надеюсь, это поможет вам начать работу.

EDIT - Вот обновление я обещал в моем комментарии:

Как я понимаю, программа должна копировать набор статических файлов в новый каталог. Поскольку у вас есть концепция «проекта», я не думаю, что код должен заменить существующие файлы, поэтому, если файлы проекта уже существуют, эта программа выйдет из строя.

Предположение:

  1. статические файлы шаблон будет находиться в папке, которая существует внутри текущей рабочей директории для файла приложение банки. То есть, если ваша исполняемая баня живет в папке C: \ MyProgram (при условии файловой системы Windows), то ваши шаблоны будут существовать в папке внутри этой папки - например, C: \ MyProgram \ templates.
  2. Программа должна создать всю структуру дерева каталогов вплоть до папки «проект».

Вот код:

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; 
    } 
} 
+0

Спасибо, это хорошо, чтобы знать, что я по крайней мере WASN» t заголовок слишком далеко вниз по неправильной дорожке. Поддержание работоспособности не будет большой проблемой, так как мой проект является лишь небольшим личным, создавая полезность для моего удобства. Я просто надеюсь немного научиться на этом пути и попытаюсь следовать хорошей практике. Я уточню свой вопрос, чтобы лучше отразить мои требования к проекту. – pigasus

+0

Рад, что я мог бы помочь! Я должен не просто согласиться с тем, что ремонтопригодность не является большой проблемой, потому что вы никогда не знаете, когда будете думать о новой новой функции, которую вы хотите добавить, или найти ошибку, которую вам нужно исправить. Как сказал мой профессор в колледже, хорошие программы никогда не заканчиваются. Если вы хорошо напишете свой код и напишите хорошие комментарии, вы сможете легко вернуться назад и обновить, добавить или исправить ситуацию. Я обновляю сообщение, чтобы предоставить примерное решение на основе вашего обновления. –

Смежные вопросы