31_io_四个节点流_01

复制代码
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}毫秒")
}
复制代码

 

posted @   学而不思则罔!  阅读(37)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示