2015-02-10 45 views
0

我有一个Servlet,其中InputStream是以XML格式获取我的表单数据。我能够以XML格式检索表单数据并能够在文件中写入相同的数据。如果我打开文件,我可以看到我的表单数据。java中的字符串缓冲区问题

现在的问题是,当我尝试追加表单数据到字符串缓冲区它不会发生。我试过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(); 
} 

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

+1

while循环不会被执行。 StringBuffer没有问题 – 2015-02-10 09:49:14

+1

使用StringBuilder代替StringBuffer。 – 2015-02-10 09:50:00

+0

是你的'in.read()'返回正确的值吗? – Vihar 2015-02-10 09:50:53

回答

3

下面是修改你的代码从文件中读取:

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!

我觉得还有另外一个问题,不在你的代码的这一部分。

您的代码的补充意见(不涉及这个问题):

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

不要关闭代码块中的资源,使用try-finally(或自从Java 7 try-with-resources)来保证资源始终关闭,即使在块中某处出现异常时也是如此。

+0

是否有机会获取字符串格式的值而不是整数值? – Vinod 2015-02-10 10:13:28

+0

在StringBuffer上使用StringBuilder在这里不会解决任何问题。我知道这样做会有非常小的速度增长(这将远远超过Web服务和文件操作的久坐速度),但这与这个问题无关。我向你投票,因为你的主要观点(“问题在别处”)是合理的。 – 2015-02-10 11:15:29

+0

这是无关紧要的,但仍然是很好的做法。另请参阅我刚刚添加的有关资源的评论。 – 2015-02-10 11:16:52