import java.io._
// 1. FileReader & FileWriter
object FileReaderTest extends App {
// 读取文件
//1. 实例化File类对象,指明要操作的对象
private val file = new File("sparkcore/src/main/data/word.txt")
println(file.exists())
//2. 创建FileReader对象
private val reader = new FileReader(file)
//3. 读取数据
// read方法 按指定编码读取一个字符,并返回字符对应的int值,当没有数据时,返回-1
// 一个字符一个字符的读取
// 如果这块遇到错误,流将无法关闭,可能造成内存泄漏
/* private var i = reader.read()
while (i != -1) {
print(i.toChar)
i = reader.read()
}*/
//3.1 读取数据
// read(Array[]) 方法,每次读取字符个数为 字符数组长度 并将读取的字符存储到数组中
// 返回值为读取到的字符个数,读取不到时返回 -1
// 注意事项
// 1. 当读取字符 小于数组长度时,数组内会存留上次读取的内容
println("====================")
var arr: Array[Char] = new Array[Char](5)
private var i: Int = reader.read(arr)
while (i != -1) {
printf(s"${new String(arr, 0, i)}")
i = reader.read(arr)
}
println("")
//4. 关闭流!!!
reader.close()
println("完成读取")
// 写入文件
//1. 创建File对象,指定文件路径
private val outputfile: File = new File("sparkcore/src/main/data/wordNew.txt")
//2. 创建流对象
// 指定文件不存在,会创建文件
// append = true 追加写入 默认为 false(覆盖写入)
private val writer = new FileWriter(outputfile, true)
//3. 写入数据
writer.write(97) // 将指定int对应的字符写入到输出流
private val chars: Array[Char] = Array[Char]('a', 'b', 'c', '\n')
writer.write(chars) // 将字符数组中的数据写入到输出流
writer.write("中国人") // 将字符串写入到输出流
//4. 刷新缓冲区
writer.flush
//4. 关闭流
writer.close
println("写入完成")
}
// 2. FileInputStream & FileOutputStream
object FileInputStreamTest extends App {
//读取数据
//1. 创建file对象
private val file = new File("sparkcore/src/main/data/word.txt")
//2. 创建流对象
private val inStream = new FileInputStream(file)
//3. 读取数据
private val i: Int = inStream.read() // 从输入流中读取一个字节,返回这个字节对应的(无符号)int值
private val bytes = new Array[Byte](5) // 从输入流中读取b.length个字节,并将读取的字节存储到参数数组中,返回读取到字节的个数
inStream.read(bytes)
println(i)
println(bytes.mkString(" "))
//4. 关闭流
inStream.close
//写入数据
//1. 创建file对象
private val outfile = new File("sparkcore/src/main/data/wordbyte.txt")
//2. 创建FileOutputStream对象
private val outStream = new FileOutputStream(outfile)
//3. 写入数据
outStream.write(97) //将指定int对应的字节写入到输出流
private val valbytes: Array[Byte] = Array[Byte](98, 99, 100, 12)
outStream.write(valbytes) //将字节数组中的数据写入到输出流
//4. 刷新缓冲区
outStream.flush
//5. 关闭流
outStream.close
}
// 3. FileInputStream & FileOutputStream - 复制非文本文件 及测速 250毫秒
object CopyFileByStreamTest extends App {
// 定义方法
// 复制inPath指定的文件 到outPath指定的文件
def copyFile(inPath: String, outPath: String) = {
//1. 创建File对象 + FileInputSteam对象
val inStream = new FileInputStream(new File(inPath))
//2. 创建File对象 + FileOutputSteam对象
val outStream = new FileOutputStream(new File(outPath))
//3. 读取
var bytes = new Array[Byte](10)
var i: Int = inStream.read(bytes)
while (i != -1) {
outStream.write(bytes, 0, i)
i = inStream.read(bytes)
}
//4. 关闭流
inStream.close
outStream.close
}
//调用方法
val inPath = "sparkcore/src/main/data/yarn架构图.png"
val outPath = "sparkcore/src/main/data/yarn架构图1.png"
//计时
val start: Long = System.currentTimeMillis
copyFile(inPath, outPath)
val end: Long = System.currentTimeMillis
println(s"耗时 : ${end - start}毫秒")
}