我正在为一个项目创建一个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数组中的所有数据。
非常感谢!
答案 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.
}