3

我的问题:如何强制输入流将行分隔符处理为系统标准行分隔符?

我将文件读入字符串,换行符被转换为\n但我System.getProperty("line.separator");的是\r\n. 我希望它是可移植的,所以我希望我的文件阅读器将换行符作为系统标准换行符读取(无论是什么)。我怎么能强迫它?这是我从Java Helper Library 中读取文件作为字符串的方法。

/**
* Takes the file and returns it in a string. Uses UTF-8 encoding
*
* @param fileLocation
* @return the file in String form
* @throws IOException when trying to read from the file
*/
public static String fileToString(String fileLocation) throws IOException {
  InputStreamReader streamReader = new InputStreamReader(new FileInputStream(fileLocation), "UTF-8");
  return readerToString(streamReader);
}

/**
* Returns all the lines in the Reader's stream as a String
*
* @param reader
* @return
* @throws IOException when trying to read from the file
*/
public static String readerToString(Reader reader) throws IOException {
  StringWriter stringWriter = new StringWriter();
  char[] buffer = new char[1024];
  int length;
  while ((length = reader.read(buffer)) > 0) {
    stringWriter.write(buffer, 0, length);
  }
  reader.close();
  stringWriter.close();
  return stringWriter.toString();
}
4

4 回答 4

2

建议以BufferedReader可移植的方式逐行读取文件,然后您可以使用读取的每一行使用您选择的行分隔符写入所需的输出

于 2012-06-25T16:12:58.017 回答
2

您的方法对行尾readerToString没有任何作用。它只是复制字符数据——仅此而已。完全不清楚您是如何诊断问题的,但该代码确实不会更改\n\r\n. 它必须\r\n在文件中 - 您应该在十六进制编辑器中查看。首先是什么创建了文件?您应该在那里查看如何表示任何换行符。

如果您想阅读行,请使用BufferedReader.readLine()which will 处理\r,\n\r\n.

请注意,Guava有很多有用的方法可以从 reader 读取所有数据,以及将 reader 拆分为行等。

于 2012-06-25T16:17:01.737 回答
1

使用Scanner#useDelimiter方法,您可以指定从 a FileorInputStream或其他内容读取时要使用的分隔符。

于 2012-06-25T16:14:08.520 回答
1

您可以使用 BufferedReader 逐行读取文件并转换行分隔符,例如:

public static String readerToString(Reader reader) throws IOException {
    BufferedReader bufReader = new BufferedReader(reader);
    StringBuffer stringBuf = new StringBuffer();
    String separator = System.getProperty("line.separator");
    String line = null;

    while ((line = bufReader.readLine()) != null) {
      stringBuf.append(line).append(separator);
    }
    bufReader.close();
    return stringBuf.toString();
}
于 2012-06-25T16:27:00.333 回答