目錄
在本篇文章中你將會學習并了解常用的文件處理任務(wù),例如讀取文件的一行文本,本博客的要點包含:
1.Source.fromFile(...).getLines.toArray 輸出文件所有行
2.Source.fromFile(...).mkString 以字符串形式輸出文件內(nèi)容
3.將字符串轉(zhuǎn)換為數(shù)字,可以使用toInt或toDouble方法
4.使用java的PrintWriter寫入文本文件
5.“正則”.r是一個Regex對象
6.若你的正則表達式包含反斜杠或者引號,請用"""..."""
7.正則模式包含分組,可以使用for(regex(變量1...,變量2)- 字符串)
本篇文章要點如下:
讀取行
// 讀取文件所有的行,可以調(diào)用scala.io.Source對象的getLines方法:
val source = Source.fromFile("a.txt","utf-8")
val lineIterator = source.getLines
結(jié)果是迭代器可以使用for循環(huán)處理這些行
for(i - lineIterator) println(i)
也可以使用迭代器應(yīng)用toArray或toBuffer方法,將這些行放到數(shù)組力或者數(shù)組緩沖行中,若想將讀取的的文件作為一個字符串,只需val conents = source.mkString
下面是簡單的代碼實例:讀取桌面上的a.txt
object ReadFile {
def main(args: Array[String]): Unit = {
val read = new ReadFile()
val resource: String = "C:\\Users\\DonnieGao\\Desktop\\a.txt"
val encode = "UTF-8"
read.readFile(resource, encode)
println(read.readFileToStr(resource, encode))
}
}
class ReadFile {
/**
* 一行行讀取文件的內(nèi)容
*
* @param resource 文件路徑
* @param code 文件編碼格式
*/
def readFile(resource: String, code: String): Unit = {
var source: BufferedSource = null
try {
// 獲取文件的Source對象,第一個參數(shù)是文件的路徑,第二個文件的編碼格式
source = Source.fromFile(resource, code)
val lineIterator = source.getLines()
while (true) {
if (lineIterator.hasNext) {
println(lineIterator.next())
} else {
return
}
}
} finally {
// 釋放資源
source.close()
}
}
/**
* 將文本文件所有內(nèi)容作為字符串
*
* @param resource 文件路徑
* @param code 文件編碼格式
* @return
*/
def readFileToStr(resource: String, code: String): String = {
// 獲取文件的Source對象,第一個參數(shù)是文件的路徑,第二個文件的編碼格式
var source: BufferedSource = null
try {
source = Source.fromFile(resource, code)
source.mkString
} finally {
source.close()
}
}
}
讀取字符
要將文件中讀取單個字符,可以把Source對象當作迭代器,若僅僅只是想查看字符可以調(diào)用Source對象的buffered方法。
讀取詞法單元和數(shù)字
讀取源文件中所有空格隔開的詞法單元
val tokens = source.mkString.split("\\s+")
若有個基本都是浮點型的文件,可以將其讀取到數(shù)組中:
val numbers = for (w - tokens) yield w.toDouble 或者也可
val numbers = token.map(_.toDouble)
讀取二進制文件
Scala并沒有提供讀取二進制文件的方法,可以使用java讀取二進制的方法,代碼示例
val file = new File(fileName)
val in = new FileInputStream(file)
val bytes = new Array[Byte](file.length.toInt)
in.read(bytes)
in.close()
寫入文本文件
Scala沒有內(nèi)建對寫入文件的支持,可借助java進行文件寫入操作例如使用java.io.PrintWriter
/**
* Scala寫入文借助java的PrintWriter
*/
def write(): Unit = {
val out = new PrintWriter("C:\\Users\\DonnieGao\\Desktop\\test.txt")
for (i - 0 to 100) out.println(i)
out.close()
}
訪問文件目錄
Scala中沒有直接訪問某個目錄下的所有文件的方式或者遞歸遍歷有目錄的類
/**
* 使用java列舉下所有的文件夾
* @param dir 文件目錄路徑
*/
def dir(dir:String) = {
val dirFile = new File(dir)
val arrayFile= dirFile.listFiles()
for (i - arrayFile){println(arrayFile.toBuffer)}
}
序列化
在java中聲明一個可以被序列號的類通常是下面這種:
public class Person implements java.io.Serializable {
private static final long serialVersionUID = 4436475322569107137L;
}
Scala中聲明一個可以被序列化的類通常是下面這種:
@SerialVersionUID(12356L) class ReadFile extends Serializable {
}
正則表達式
Scala中提供了正則操作處理scala.util.matching.Regex讓這件事情可以變得簡單。構(gòu)造一個Regex對象,用String類的r方法即可
object RegexDemo {
def main(args: Array[String]): Unit = {
// 初始化正則對象
val numPattern = "[0-9]+".r
val regex = "13 welcome to beijing"
// findAllIn方法返回遍歷所有匹配的迭代器,可以在for循環(huán)中使用
for (matchString - numPattern.findAllIn(regex)) {
println(matchString)
}
// 查詢字符串首個匹配項
println(numPattern.findFirstIn(regex))
// 檢查某個字符串的開始部分能匹配,可以使用findPrefixOf
println(numPattern.findPrefixOf(regex))
}
總結(jié)
以上所述是小編給大家介紹的Scala的文件讀寫操作與正則表達式 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
您可能感興趣的文章:- 淺談Scala的Class、Object和Apply()方法
- PHP警告Cannot use a scalar value as an array的解決方法
- php下關(guān)于Cannot use a scalar value as an array的解決辦法
- ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之間的區(qū)別