我正在为一个项目创建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/