Java 在Windows和Linux之间处理输入中的换行符
我认为这是一个标准的问题,以前可能有人问过,但我无法得到确切的答案,所以发布了这个问题 问题是我们的服务器运行在linux机器上。我们通过窗口框上的浏览器访问服务器,将数据输入到字段中,该字段应该包含多行,用户可以在每行之后按enter键输入 Abc Def GHI 在linux机器上读取此输入字段(这是一个文本区域)时,我们希望根据新行字符分割数据 我对此有三个问题Java 在Windows和Linux之间处理输入中的换行符,java,Java,我认为这是一个标准的问题,以前可能有人问过,但我无法得到确切的答案,所以发布了这个问题 问题是我们的服务器运行在linux机器上。我们通过窗口框上的浏览器访问服务器,将数据输入到字段中,该字段应该包含多行,用户可以在每行之后按enter键输入 Abc Def GHI 在linux机器上读取此输入字段(这是一个文本区域)时,我们希望根据新行字符分割数据 我对此有三个问题 传入数据是否包含“\r\n”或“\n” 如果传入的数据确实包含“\r\n”,linux line.separator属性(vm属
最后,有人能告诉我处理这个问题的标准方法吗?Linux使用
\n
Windows使用
\r\n
因此,除非您在linux中进行了一些调整,否则它应该在\n
中出现
您可以将\r\n
和\n
进行正则表达式,并替换为您想要避免问题3的任何内容
标准的
java.io.DataInputStream
和java.io.BufferedInputReader
都通过readLine()方法自动处理此问题。您确实不应该为此使用DataInputStream
,因为它不正确支持字符集,而且它的readLine()已经被弃用很长时间了
对于文本输出,您可以使用java.io.PrintWriter
,其中它是printLn(),以及带有参数的相关方法,为当前平台输出正确的换行符序列java.io.BufferedWriter
也能正确处理此问题,并提供了一个public
newLine()方法。可能尝试一下吗
String[] lines = inputString.split("\r?\n");
虽然不能100%确定语法,但正则表达式的基本思想是:“零或一,正好是一”。或者,如果您只想规范化输入:
inputString = inputString.replace("\r?\n", "\n");
对我来说似乎不是很痛苦 谢谢各位的回复。。最后看看Kevin给出的建议,我们在上面使用了StringReader和BufferedReader包装器来解决这个问题。我们使用字符串读取器,因为数据是作为字符串从请求中读取的
希望这个问题将来能帮助人们而不是使用正则表达式,您还可以通过执行以下操作来简化它
StringBuilder sb=new StringBuilder();
// append your texts here and to go to a new line use
if(System.getProperty("os.name").startsWith("Windows")){
sb.insert("\r\n");
}
else {
sb.insert("\n");
}
因此,如果您的本地环境是windows,您可以让它在本地工作,如果您部署到不同的基于linux的环境,它也可以工作。我认为这取决于您使用的语言(Java应用程序、HTML页面或其他东西中的“文本区域”)我们使用的是基于java的web应用程序及其html页面。没有其他的UI工具包被使用,我们正计划这样做,但在我看来,这个问题应该有一个更通用的语言修复内置。因为在windows上输入数据并在linux服务器上读取数据是非常常见的。也许我高估了语言能力,但在每个应用程序中处理这个问题听起来都很痛苦。当你没有什么要补充的时候,请不要发布你自己问题的答案。这就是评论的目的……我同意。这并不那么痛苦。但我不喜欢在使用像Java这样的语言时担心应用程序代码中的新行字符,因为Java已经存在了足够多年,可以提供更好的方法来解决这个问题:)。。。虽然从另一方面来说,操作系统处理新线的方式有所不同,但令人担忧的是,在可预见的未来,可能永远不会有一个良好的一致行为。我非常同意你的看法,但这仍然是操作系统间、网络间的问题。HTTP强制使用“\r\n”来终止行,但所有*nix系统在内部使用“\n”。或者,Windows使用整数/指针的小端编码,但网络协议要求传输数据的大端性。真相仍在某处不幸的是,当我们使用这些相互连接和不同的系统时,我们不得不处理它们的怪癖。