2013-02-20 7 views
2

Я понимаю, что Google App Engine (GAE) позволяет прочитать любой файл в разобранном WAR, используя несколько методов, как:Читать все файлы в каталоге внутри Google App App Engine

String file = "/WEB-INF/name-of-my-filexml"; 
InputStream in = getClass().getResourceAsStream(file); 

Проблема в том, Мне нужно, чтобы развернуть мой веб-приложение со структурой каталогов, как это:

MyApp/ 
    WEB-INF/ 
     lib/ 
     classes/ 
     web.xml 
     appengine-web.xml 
     ... 

     profiles/ 
      fizz.txt 
      buzz.txt 
      foo.txt 
      ... dozens of other text files 

Мне нужен способ, чтобы прочитать каждый profiles/*.txt файл в строку Java. И перед тем, как кто-нибудь отметит ну почему бы не просто жестко записать строки, чувак ..., давайте просто скажем, что я вырезаю много предыстории здесь, чтобы опубликовать простой вопрос. Юмор меня, и давайте притвориться, что я не могу закодировать струны. Обычно, если бы я имел полный доступ к java.io.*, я бы просто сделать что-то вроде:

File profilesHome = new File("path/to/profiles"); 
File[] profiles = profilesHome.listFiles(); 
List<String> profileList = new ArrayList<String>(); 
for(File profile : profiles) 
    profileList.add(readFileIntoString(profile)); 

Но здесь, я не думаю, что я могу вызвать File#listFiles(), и если все у меня есть, InputStream, что я вернусь от getClass().getResourceAsStream(file), я не уверен, как превратить это в дескриптор File или объект String. Есть идеи? Заранее спасибо.

Update: используя ZipInputStream предложение:

InputStream inputStream = event.getServletContext() 
     .getResourceAsStream("/WEB-INF/profiles.zip"); 
ZipInputStream zipInputStream = new ZipInputStream(inputStream); 
List<String> list = new ArrayList<String>(); 
ZipEntry currEntry; 
try { 
    while((currEntry = zipInputStream.getNextEntry()) != null) 
     // TODO: How to convert the contents of currEntry to a string 
     // in a manner that is GAE-friendly? 
     list.add(convertEntryContentsToString(currEntry)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Теперь Как реализовать convertEntryContentsToString(ZipEntry)?

ответ

0

Может быть, этот фрагмент кода может помочь вам (возможно, вам придется добавить обработку исключений, закрывающий код, некоторые другие вещи, ...):

while ((zipEntry = zipStream.getNextEntry()) != null) { 
    String name = zipEntry.getName(); 
    if (!zipEntry.isDirectory()) { 
     Scanner scanner = new Scanner(zipStream); 
     StringBuilder builder = new StringBuilder(); 
     while (scanner.hasNextLine()) { 
      builder.append(scanner.nextLine()); 
     } 
     String YOURSTRING = builder.toString(); 
    } 
} 
0

Если вы можете поместить каждый .txt в один Zip-файл, вы можете использовать ZipInputStream и ZipEntry, чтобы перечислить все файлы в Zip-файле (или получить к ним доступ напрямую, если хотите).

+0

Благодаря @da_re (+1) - см. мое обновление в нижней части исходного вопроса. Да, я могу закрепить все в '/ WEB-INF/profiles.zip'. Теперь я просто пытаюсь преобразовать каждый 'ZipEntry' (который является * .txt-файлом) в строку java, используя читатели, которые являются« GAE-friendly »(то есть не ограничены песочницей). Есть идеи? Еще раз спасибо! – 2013-02-20 15:35:33

+0

Действительно классный раствор. благодаря – 2013-08-22 10:31:19

1

Смотрите, если следующие варианты работы для вас:

  1. Создайте файл с именем filelist.txt, который также присутствует в WEB-INF/profiles папку или любую другую папку, начиная с wEB-INF. Этот файл может содержать список имен файлов, присутствующих в папке /profiles. Одно имя файла в каждой строке. Таким образом вы можете разобрать имя по одному, а затем прочитать файлы.
  2. Создайте объект хранилища данных, который содержит список имен файлов, которые вы ожидаете, и выполните те же шаги, что и 1, за исключением того, что список имен файлов получен из объекта хранилища данных.
  3. Является Google Drive (см. Этот App Engine and Google Drive API) вариант для вас? Еще один вариант - Google Cloud Storage.