用scala讀取一個只有字符的文件,該文件是已經清洗完的數據,有規律,一行是一條數據。
現在的需求是一次讀取文件中的一部分,依次讀取完。
之前用字節流偶爾出現亂碼,最後改成一次讀取一行了。
import java.io.{BufferedReader, InputStreamReader}
import org.apache.hadoop.fs.FSDataInputStream
/**
* Created by wx on 2017/7/25.
*/
object ReadHDFSFileByLine {
def main(args: Array[String]) {
var inputStream: FSDataInputStream = null
var bufferedReader: BufferedReader = null
try {
/* inputStream = HDFSUtil.getFSDataInputStream("hdfs://master:9000/TestData/aviation7/part-00018")
bufferedReader = new BufferedReader(new InputStreamReader(inputStream))
var lineTxt:String=null
var count = 1
// 這樣寫就是死循環,無法跳出,我很鬱悶改用下面的就好了
while ((lineTxt= bufferedReader.readLine()) != null) {
println(count + "\t" + lineTxt)
count += 1
//讓程序暫停睡眠一下
Thread.sleep(1)
}*/
//獲取到HDFS的輸入流,可以參考上一篇文檔
inputStream = HDFSUtil.getFSDataInputStream("hdfs://master:9000/TestData/aviation7/part-00018")
//轉成緩衝流
bufferedReader = new BufferedReader(new InputStreamReader(inputStream))
//一次讀取一行
var lineTxt: String = bufferedReader.readLine()
var count = 1
while (lineTxt != null) {
println(count + "\t" + lineTxt)
count += 1
lineTxt = bufferedReader.readLine()
//讓程序暫停睡眠一下
Thread.sleep(1)
}
} catch {
case e: Exception => e.printStackTrace()
} finally {
if (bufferedReader != null) {
bufferedReader.close()
}
if (inputStream != null) {
HDFSUtil.close
}
}
}
}