【问题标题】:Issue with String Buffer in javajava中字符串缓冲区的问题
【发布时间】:2015-02-10 09:43:42
【问题描述】:

我有一个 servlet,我从 InputStream 中获取 XML 格式的表单数据。我能够以 XML 格式检索表单数据,并能够在文件中写入相同的数据。如果我打开文件,我可以看到我的表单数据。

现在的问题是,当我尝试将表单数据附加到字符串缓冲区时,它没有发生。我试过buffer.append()。在该方法之后当我尝试打印字符串缓冲区值时,控制台中没有显示/打印任何内容。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // TODO Auto-generated method stub
                 response.setContentType("html/text");
             PrintWriter out = response.getWriter();
             out.println("doPost Method is excecuting");
             DataInputStream in = new DataInputStream (request.getInputStream());
             StringBuffer buffer = new StringBuffer();
             File file = new File("reqOutput.txt");
             file.createNewFile();
             FileWriter writer = new FileWriter(file); 
             int value;
             while ((value=in.read()) != -1) {
                             buffer.append(value);
                        writer.write(value);
                      }
             System.out.println("Value is : "+ buffer.toString()); // Nothing is printing
             writer.flush();
             writer.close();
}

我的代码有什么问题。请提供任何建议。

【问题讨论】:

  • while 循环不会被执行。 StringBuffer 没有问题
  • 使用 StringBuilder 代替 StringBuffer。
  • 你的 'in.read()' 返回的值是否正确?
  • 你检查过控制台吗?如果它进入循环并且您的文件有内容,它应该打印?通过更改输出文件名进行检查。我猜你可能正在检查旧文件
  • 是的 read() 正在返回正确的值,我只在 While 循环中将表单数据写入文件。该文件已创建和适当的数据

标签: java inputstream stringbuffer


【解决方案1】:

这是您修改为从文件中读取的代码:

    public static void main(final String[] args) throws Exception {
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader("test"));
            final StringBuilder sb = new StringBuilder();
            String line;
            while ((line = in.readLine()) != null) {
                sb.append(line);
            }
            System.out.println("Value is : " + sb.toString());
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }

我在 FileReader 周围添加了一个 BufferedReader 以优化读取。 我从一次读取一个字符切换到逐行读取。 这也为您提供字符串形式的结果,因此您不必转换 int。

此外,我添加了资源处理(pre-7 风格并且没有异常处理)并切换到 StringBuilder。

输出:

你好世界! -> 值是:hello world!

我认为还有另一个问题,不在您的这部分代码中。

您的代码上的其他 cmets(与问题无关):

StringBuffer 是一个线程安全的实现。如果您不需要这个(就像在您的 servlet 示例中一样),您最好使用 StringBuilder。

不要关闭代码块内的资源,使用 try-finally(或自 Java 7 try-with-resources 起)确保资源始终关闭,即使代码块中某处发生异常。

【讨论】:

  • 是否有机会获取字符串格式的值而不是整数值?
  • 在 StringBuffer 上使用 StringBuilder 不会解决这里的任何问题。我知道这样做会带来非常微小的速度提升(这将远远超过 Web 服务和文件操作的久坐不动的速度),但这与这个问题无关。我投票给你是因为你的主要观点(“问题出在其他地方”)是正确的。
  • 这无关紧要,但仍然是很好的做法。另请参阅我刚刚添加的关于资源的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
相关资源
最近更新 更多