2

我了解 Google App Engine (GAE) 允许您使用以下几种方法读取爆炸 WAR 中的任何文件:

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

问题是,我需要使用如下目录结构部署我的 Web 应用程序:

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句柄或字符串对象。有任何想法吗?提前致谢。

更新:使用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)

4

3 回答 3

1

看看以下选项是否适合您:

  1. 创建一个名为 的文件filelist.txt,该文件也存在于WEB-INF/profiles文件夹或以 . 开头的任何其他文件夹中wEB-INF。此文件可以包含文件/profiles夹中存在的文件名列表。每行一个文件名。这样您就可以将名称一一解析出来,然后读取文件。
  2. 创建一个包含您期望的文件名列表的数据存储实体,并按照与 1 相同的步骤操作,但文件名列表是从数据存储实体获取的。
  3. Google Drive(请参阅此App Engine 和 Google Drive API)是否适合您?另一种选择是谷歌云存储。
于 2013-02-20T14:13:49.400 回答
0

如果您可以将每个 .txt 放入单个 Zip-File 中,则可以使用 ZipInputStream 和 ZipEntry 列出 Zip-File 中的所有文件(或如果需要直接访问它们)。

于 2013-02-20T14:00:50.687 回答
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();
    }
}
于 2013-02-20T15:53:15.990 回答