我正在为一个项目创建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数组中的所有数据。

非常感谢!

最佳答案

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

选项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字符。因此,如果您的目标是保留行终止符,那么这不是一个好选择。

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.
}

关于java - 如何从动态创建的字符串数组中创建datastore.Text对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25415370/

10-11 04:12
查看更多