Java 如何识别文本文件';s线分离器?你能在写入文本文件时复制它吗?

Java 如何识别文本文件';s线分离器?你能在写入文本文件时复制它吗?,java,Java,在Java工作时,一个家庭作业问题要求我 读一个文件, 操纵其中的字符串和行(不是问题) 写入文件, 但是保留原始文件中使用的行分隔符,并在回写文件时使用它(大问题), Junit测试将使用多个不同的行分隔符作为文件输入 我的问题是,我可以使用什么方法来识别文本文件使用的行分隔符 我的项目正在输入和读取的文件文本可以有/r、/n、/r/n或+System.lineSeparator()。当我写入文本文件时,我还需要匹配原始的行分隔符,这样它就可以对操作系统友好 String data = "

在Java工作时,一个家庭作业问题要求我

读一个文件, 操纵其中的字符串和行(不是问题) 写入文件, 但是保留原始文件中使用的行分隔符,并在回写文件时使用它(大问题), Junit测试将使用多个不同的行分隔符作为文件输入

我的问题是,我可以使用什么方法来识别文本文件使用的行分隔符

我的项目正在输入和读取的文件文本可以有/r、/n、/r/n或+System.lineSeparator()。当我写入文本文件时,我还需要匹配原始的行分隔符,这样它就可以对操作系统友好

  String data = "";
    try { data = new String(Files.readAllBytes(Paths.get(path)));
    } catch (IOException e) { e.printStackTrace(); }
    //System.out.println("Text file as String in Java");
    //System.out.println(data);
    String linesep= "";
    if (data.contains("\n") == true){
        linesep="\n";
        //System.out.println("n detected");
    }else if((data.contains("\r") == true)){
        linesep="\r";
        //System.out.println("r detected");
         }
    else {
        linesep= System.lineSeparator();
        //System.out.println("line separator detected");
    }

您向我们展示的要求是:

Junit测试将使用多个不同的行分隔符作为文件输入

他们并没有说每个测试都会在整个文件中使用一致的行分隔符。他们也没有说最后一行总是以分隔符结尾

如果您编写代码试图找出使用了哪个分隔符,那么当文件包含混合分隔符时,它将中断

因此,您需要做的是在每行的末尾保留分隔符,包括空行。您需要处理可能没有分隔符的最后一行

提示:行分隔符只是字符,因此可以将它们包含在行字符串中。。。如果您决定将输入拆分为多行

。。。你能在写入文本文件时复制它吗


看上面

您向我们展示的要求是:

Junit测试将使用多个不同的行分隔符作为文件输入

他们并没有说每个测试都会在整个文件中使用一致的行分隔符。他们也没有说最后一行总是以分隔符结尾

如果您编写代码试图找出使用了哪个分隔符,那么当文件包含混合分隔符时,它将中断

因此,您需要做的是在每行的末尾保留分隔符,包括空行。您需要处理可能没有分隔符的最后一行

提示:行分隔符只是字符,因此可以将它们包含在行字符串中。。。如果您决定将输入拆分为多行

。。。你能在写入文本文件时复制它吗


看上面

据我所知,如果没有一些不在文件本身中的附加信息,就无法毫无疑问地说出特定文件的行分隔符是什么

正如其他人所指出的,回车符和换行符只是字符——它们没有什么特别之处。这只是一种惯例,即这些是分隔符,Windows上的惯例与Linux和Mac OS上的惯例不同

但是,特别是因为听起来您的程序将要编写文件,您可以尝试做出一些假设:

  • 每个文件将只使用三个“标准”行分隔符中的一个:\r\n或\r\n

  • 每个文件将不包含任何其他两个行分隔符

如果您可以安全地做出这些假设,那么您可以简单地读取文件(作为二进制文件,而不是文本文件)并检查字符,查找其中一个行尾

要使用匹配的分隔符将新行附加到文件中,可以使用设置系统行分隔符,例如

System.setProperty("line.separator", "\r\n");
使用在文件中找到的行分隔符


这将导致在您正常写入文件时使用新的分隔符。

据我所知,如果没有文件本身不包含的其他信息,就无法毫无疑问地确定特定文件的行分隔符是什么

正如其他人所指出的,回车符和换行符只是字符——它们没有什么特别之处。这只是一种惯例,即这些是分隔符,Windows上的惯例与Linux和Mac OS上的惯例不同

但是,特别是因为听起来您的程序将要编写文件,您可以尝试做出一些假设:

  • 每个文件将只使用三个“标准”行分隔符中的一个:\r\n或\r\n

  • 每个文件将不包含任何其他两个行分隔符

如果您可以安全地做出这些假设,那么您可以简单地读取文件(作为二进制文件,而不是文本文件)并检查字符,查找其中一个行尾

要使用匹配的分隔符将新行附加到文件中,可以使用设置系统行分隔符,例如

System.setProperty("line.separator", "\r\n");
使用在文件中找到的行分隔符


这将导致在您正常写入文件时使用新的分隔符。

能否详细说明必须应用的操作?简单地将行分隔符视为字符串的一部分可能是最容易的。步骤1:什么是标准行分隔符?(对于windows、macos和unix/linux,只有少数几种可能)第2步:检查数据,看看哪些数据实际上正在使用,因为您知道其中有行结尾的数据(回答第1步后,您会发现这一步应该非常简单,因为您不能使用“非行结尾”的行结尾.总是一行结尾)。第3步:现在差不多完成了。您需要直接从InputStream(而不是BufferedReader)读取文件,然后查看您找到的行尾。如果您可以将整个文件保存在内存中并进行编辑,您可以将其读入缓冲区并写入相同的缓冲区(更改内容后)。如果文件的可用内存不够大,您可以将其整个内容作为字节数组读取,并从这些字节中创建一个字符串(您可能需要知道其字符)