Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Windows和Linux之间处理输入中的换行符_Java - Fatal编程技术网

Java 在Windows和Linux之间处理输入中的换行符

Java 在Windows和Linux之间处理输入中的换行符,java,Java,我认为这是一个标准的问题,以前可能有人问过,但我无法得到确切的答案,所以发布了这个问题 问题是我们的服务器运行在linux机器上。我们通过窗口框上的浏览器访问服务器,将数据输入到字段中,该字段应该包含多行,用户可以在每行之后按enter键输入 Abc Def GHI 在linux机器上读取此输入字段(这是一个文本区域)时,我们希望根据新行字符分割数据 我对此有三个问题 传入数据是否包含“\r\n”或“\n” 如果传入的数据确实包含“\r\n”,linux line.separator属性(vm属

我认为这是一个标准的问题,以前可能有人问过,但我无法得到确切的答案,所以发布了这个问题

问题是我们的服务器运行在linux机器上。我们通过窗口框上的浏览器访问服务器,将数据输入到字段中,该字段应该包含多行,用户可以在每行之后按enter键输入 Abc Def GHI

在linux机器上读取此输入字段(这是一个文本区域)时,我们希望根据新行字符分割数据

我对此有三个问题

  • 传入数据是否包含“\r\n”或“\n”

  • 如果传入的数据确实包含“\r\n”,linux line.separator属性(vm属性)将不适用于我,因为它会显示“\n”,因此可能会在数据中保留“\r”

  • 如果数据中保留“\r”,如果我在windows计算机上打开该文件,这是否意味着换行符


  • 最后,有人能告诉我处理这个问题的标准方法吗?

    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使用整数/指针的小端编码,但网络协议要求传输数据的大端性。真相仍在某处不幸的是,当我们使用这些相互连接和不同的系统时,我们不得不处理它们的怪癖。