我正在尝试编写一个简单的类来检测文本文件的行终止符。 这个想法非常简单:计算这三种模式的出现次数〜\ 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)
}
有什么建议吗?如果您知道具有此类功能的项目要添加为依赖项,请告知我们。