为什么缺少回车?

时间:2019-02-12 11:19:04

标签: java mysql hibernate

我有一条SQL命令,该命令将字段更新到表中,并根据“ cat file.txt”填充该表。该文件有很多行,我希望稍后进入hibernate字段,但似乎从db hibernate中读取文件后,删除所有回车符。

这是我从shell脚本(bash)执行的脚本:

 REQUEST_FILE=`cat file.txt`
 echo "UPDATE table SET request_info='$REQUEST_FILE'  WHERE id=1;" > ./after.sql 

如果我做after.sql的猫,我会得到:

 UPDATE table SET request_info='1-Start-Env Script for Env
 2-insert done
 3-update info done
 4-all performed correctly'  WHERE id=29;

这是数据库表结构:

Table: table
Columns:
id int(11) AI PK 
submit_date datetime 
request_type varchar(45) 
request_info longtext

这是存储在db上的数据,行如何:

# id, submit_date,request_type, request_info
'29', '2019-02-11 04:55:21', 'check', '1-Start-Env Script for Env\n2-insert done\n3-update info done\n4-all performed correctly'

所以直到这一步,我都认为一切正常,因为字段包含“ \ n”

休眠类是通过以下方式完成的:

@Entity
@Table(name="table")
@NamedQuery(name="Table.findAll", query="SELECT u FROM Table u")
public class Table implements Serializable {
   private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue
   private int id;

   @Column(name="request_info")
   private String requestInfo;

   @Column(name="request_type")
   private String requestType;

   @Temporal(TemporalType.TIMESTAMP)
   @Column(name="submit_date")
   private Date submitDate;

当我访问requestInfo变量时,输出为:

  

1-Env的1-Start-Env脚本2-插入完成3-更新信息完成4-全部正确执行

此变量用于在JSF页面上单击按钮后创建文件:

  HttpServletResponse response = (HttpServletResponse) 
  fc.getExternalContext().getResponse();

    response.reset();
    response.setContentType("text/plain");
    response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

    OutputStream output = response.getOutputStream();

     output.write(request.getRequestInfo().getBytes());

    output.flush();
    output.close();

如果我在System.out中看到正确的数据,那么我猜想是getBytes函数没有返回回车符:

         System.out.println("file content:" +request.getRequestInfo());

输出:

file content:1-Start-Env Script for Env 
2-insert done 
3-update info done 
4-all performed correctly

你有什么主意吗?谢谢

1 个答案:

答案 0 :(得分:1)

您的问题是换行符。

在文件的新行中使用\n代替\r\n

但是,这不能在所有平台上解决此问题,仅在您要测试的平台上解决即可。

有关换行符和不同平台的更多信息,请参见此处:

https://superuser.com/questions/374028/how-are-n-and-r-handled-differently-on-linux-and-windows

您还可以尝试以下操作:

output.write(request.getRequestInfo().replaceAll("(\\\\r\\\\n|\\\\n)", "\\\n"));

同样,您的servlet不知道浏览器在哪个平台上运行(Windows,Mac或其他),因此除非您要查看用户代理标头或某个系统或任何系统总是有问题,否则另一个。