如何从动态创建的字符串数组中创建datastore.Text对象?

时间:2014-08-20 22:16:46

标签: java string google-app-engine

我正在为一个项目创建一个Google App Engine服务器,我通过HTTP POST请求收到大量数据。

数据被分成几行,每行200个字符。线的数量可以达到数百个,所以总共有数十个字符。

我想要做的是将所有这些行连接成一个Text对象,因为Strings的最大长度为500个字符,但Text对象可以大到1MB。

这是我到目前为止的想法:

public void doPost(HttpServletRequest req, HttpServletResponse resp)
{
...

String[] audioSampleData = new String[numberOfLines];

for (int i = 0; i < numberOfLines; i++)
{
  audioSampleData[i] = req.getReader().readLine(); 
}

com.google.appengine.api.datastore.Text textAudioSampleData = new 
                         Text(audioSampleData[0] + audioSampleData[1] + ...);

...
}

但是正如你所看到的,我不知道如何在不知道前线数量的情况下做到这一点。有没有办法在Text构造函数中迭代String索引?我似乎无法找到任何东西。

值得注意的是,Text对象在创建后无法修改,并且必须有一个String作为构造函数的参数。 (文件here

有什么办法吗?我需要一个Text对象中String数组中的所有数据。

非常感谢!

2 个答案:

答案 0 :(得分:1)

使用StringBuilder构建字符串,然后转换为构造函数的String ...

StringBuilder audioSampleData = new StringBuilder();

for (int i = 0; i < numberOfLines; i++) {
  audioSampleData.append(req.getReader().readLine()); 
}

Text textAudioSampleData = new Text(audioSampleData.toString());

答案 1 :(得分:1)

以下是一些不同的方法。仅供参考,我只编译了这些,我没有运行它们。

选项A:可能是三个中最简单的

public void doPost(HttpServletRequest req, HttpServletResponse resp) {
    // change initialCapacity to reflect the likely final size
    int initialCapacity = 1024;
    StringBuilder builder = new StringBuilder(initialCapacity);

    try {
        BufferedReader reader = req.getReader();
        int c;

        while((c = reader.read()) != -1) {
            builder.append(c);
        }
    } catch (IOException e) {
        // your error handling here
    }

    String s = builder.toString();
    Text text = new Text(s);

    // etc etc.
}

选项B:这个一次转换一行,但如果内容实际上不是换行符,那么它将是一个非常大的单行。此外,当循环将每一行附加到StringBuilder时,请注意附加的字符串已删除\ n和\ r \ n字符。因此,如果你的目标是保留线路终结器,那么这个不是一个很好的选择。

public void doPost(HttpServletRequest req, HttpServletResponse resp) {
    // change initialCapacity to reflect the likely final size
    int initialCapacity = 1024; 

    StringBuilder builder = new StringBuilder(initialCapacity);

    try {
        BufferedReader reader = req.getReader();
        String line = null;

        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }
    } catch (IOException e) {
        // your error handling here
    }

    String s = builder.toString();
    Text text = new Text(s);
    // etc etc.
}

选项C:这个使用字符缓冲区从阅读器读取并批量写入字符串缓冲区。它还保留了终止字符的行。

public void doPost(HttpServletRequest req, HttpServletResponse resp) {
    // change initialCapacity to reflect the likely final size
    int initialCapacity = 1024;

    StringBuilder builder = new StringBuilder(initialCapacity);

    try {
        BufferedReader reader = req.getReader();
        char [] buffer = new char[1024];

        int charsRead = 0;
        do {
            charsRead = reader.read(buffer, 0, buffer.length);
            if (charsRead > 0) {
                builder.append(buffer, 0, charsRead);
            }
        } while (charsRead != -1);
    } catch (IOException e) {
        // your error handling here
    }

    String s = builder.toString();
    Text text = new Text(s);

    // etc etc.
}