【问题标题】:Why is missing the carriage return?为什么缺少回车符?
【发布时间】:2023-03-24 02:49:01
【问题描述】:

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

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

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

如果我执行 after.sql 的 cat,我会得到:

 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'

Hibernate 类是这样完成的:

@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-Start-Env 脚本用于 Env2-insert done3-update info done4-all 执行正确

此变量用于在单击 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

你有什么想法吗?谢谢

【问题讨论】:

  • requestInfo 变量是与System.out.println 一起输出还是在浏览器窗口中输出?
  • @ValentinCarnu 我更新了主题,我正在获取值并执行 getBytes 并将输出写入附件

标签: java mysql hibernate


【解决方案1】:

您的问题是换行符。

在文件中使用\r\n 代替\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 或其他),所以除非您要查看用户代理标头或其他东西,否则您总是会遇到一个系统的问题或另一个。

【讨论】:

  • 您阅读我的更新了吗?如果我做一个简单的 system.out,我可以看到带有回车的正确打印。无论如何我都会用 getBytes 测试这个
  • 尝试使用可以显示不可见字符的编辑器打开作为附件发送的文件,例如 Notepad++,并检查文件中是否存在换行符
  • 似乎可以解决这个问题。感谢您帮助我标记为分辨率
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多