如何读取包含新行的文本文件中的所有字节?

时间:2015-05-05 21:50:52

标签: java file scala newline eol

我正在尝试编写一个简单的类来检测文本文件的行终止符。 这个想法非常简单:计算这三种模式的出现次数〜\ n〜\ r~ \ r \ n 在文件的开头并返回与较高计数器关联的模式。

我在两天内没有得到的是如何读取变量中的LF字符(\ n)(我在OS X上)。到目前为止我尝试过的所有东西似乎都避免读取LF。我知道这是Reader类的典型行为,但我也使用DataInputStream

也遇到了同样的问题
import java.io.File
import java.io.InputStream
import java.io.FileInputStream
import java.io.BufferedInputStream
import scala.io.Codec

object EolDetection {

  def detect(file: File)(implicit codec: Codec): String = {
    detect(new FileInputStream(file))
  }
  def detect(is: InputStream)(implicit codec: Codec): String = {
    detect( new BufferedInputStream(is))
  }  
  def detect(bs: BufferedInputStream): String = {
    var LFcnt = 0 ; var CRLFcnt = 0 ; var CRcnt = 0 ; var wasCR = false
    try {
      var ascii = bs.read()
      while ( ascii > -1 && (LFcnt + CRLFcnt + CRcnt) < 11 ) {
        ascii match {
          case 13 => wasCR = true ; debug("A") 
          case 10 => if (wasCR) CRLFcnt += 1 else LFcnt += 1 ; wasCR = false ; debug("B")
          case  _ => if (wasCR) CRcnt += 1 ; wasCR = false; debug("C")
        }
        ascii = bs.read()
      }
      debug(s"\nLF=$LFcnt CRLF=$CRLFcnt CR=$CRcnt\n")
      var sep = "\n"
      if (LFcnt > CRLFcnt && LFcnt > CRcnt) sep = "\n"
      if (CRLFcnt > LFcnt && CRLFcnt > CRcnt) sep = "\r\n"
      if (CRcnt > CRLFcnt && CRcnt > LFcnt) sep = "\r"
      sep
    } finally {
      bs.close()
    }
  }

  def debug(msg: String) = printf(msg)
}

有什么建议吗?如果您知道具有此类功能的项目要添加为依赖项,请告知我们。

0 个答案:

没有答案