k8king
6/27/2019 - 3:38 AM

scala-基本操作

  // 2. 编写一段程序,从文件中读取单词。用一个可变映射来清点每一个单词出现的频率。
  def fn2_1():Unit = {
    import java.nio.charset.CodingErrorAction
    import scala.io.Codec

    implicit val codec = Codec("UTF-8")
    codec.onMalformedInput(CodingErrorAction.REPLACE)
    codec.onUnmappableCharacter(CodingErrorAction.REPLACE)

    val path = "F:\\desktop\\123.txt"
    val sourceFile = scala.io.Source.fromFile(path)

    val map = new scala.collection.mutable.HashMap[String,Int]()
    try {
      for(line<-sourceFile.getLines()) {
        val arr = line.split("\\s+",-1)
        arr.map(str=>{
          val tmp = map.getOrElse(str,0)+1
          map.addOne(str,tmp)
        })
      }
      for((k,v)<-map) println(s"$k->$v")
    } catch {
      case ex:Exception => {
        println("Exception:  " + ex)
      }
    } finally {
      sourceFile.close()
    }
  }
  // 2. 编写一段程序,从文件中读取单词。用一个可变映射来清点每一个单词出现的频率。
  // 读取文件方式2
  def fn2_2():Unit = {
    import java.nio.charset.CodingErrorAction
    import java.nio.charset.Charset
    val codec = "GBK"
    val decoder = Charset.forName(codec).newDecoder()
      .onMalformedInput(CodingErrorAction.IGNORE)
      .onUnmappableCharacter(CodingErrorAction.REPLACE)
    val path = "F:\\desktop\\123.txt"
    val src = scala.io.Source.fromFile(path)(decoder)
    try {
      src.foreach(print)
    } finally {
      src.close()
    }
  }
  // 读取文件方式3
  def fn2_3():Unit = {

    import java.io.BufferedReader
    import java.io.FileInputStream
    import java.io.InputStreamReader
    import java.nio.charset.Charset
    import java.nio.charset.CodingErrorAction

    val codec = "UTF-8"
    val decoder = Charset.forName(codec).newDecoder()
    decoder.onMalformedInput(CodingErrorAction.REPLACE)
    decoder.onUnmappableCharacter(CodingErrorAction.REPLACE)

    val path = "F:\\desktop\\123.txt"
    val input = new FileInputStream(new File(path))
    val reader = new InputStreamReader(input, decoder)
    val bufferedReader = new BufferedReader(reader)

    try {
      var line = bufferedReader.readLine
      while ( line != null ) {
        // new String(oldstring.getBytes("ISO-8859-1"), "UTF-8")
        // decoder.decode( java.nio.ByteBuffer.wrap(oldstring.getBytes("ISO-8859-1")) ).toString
        println(line)
        line = bufferedReader.readLine
      }
    } catch {
      case e: Exception =>
        e.printStackTrace()
    } finally {
      bufferedReader.close()
      reader.close()
      input.close()
    }
  }
//文件写入
object PrintWriterConfig {
    import java.io.{BufferedWriter,FileOutputStream,OutputStreamWriter,PrintWriter}
    def getWriter(path:String,coding:String="UTF-8",appending:Boolean=true):PrintWriter={
      return new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path,appending), coding)))
    }
}

val content:String = "...."
val filePrinter = PrintWriterConfig.getWriter(path)
filePrinter.println
filePrinter.println(content)
filePrinter.close()
// 二进制对象
import scala.beans.BeanProperty
class Person(@BeanProperty var id:Int,@BeanProperty var name:String) extends Serializable {}
object Person {
  def apply(id: Int, name: String): Person = new Person(id,name)
}
val p1 = Person(1,"zhang")
val p2 = Person(2,"wang")
val p3 = Person(2,"li")
val content = Array(p1, p2, p3) 
// 文件路径
val path = "..." 
// 二进制文件写入
val out = new ObjectOutputStream(new FileOutputStream(path))
out.writeObject(all)
out.close()
// 二进制文件读取
val in = new ObjectInputStream(new FileInputStream(path))
val res = in.readObject().asInstanceOf[Array[Person]]
in.close()
// 将scala的Map[String,Any]转换为Java的Map(String,Object)
import scala.collection.JavaConverters._
val schema1:Array[String] = Array("id","name","telephone")
val row:Seq[Any] = Seq[Any](1,"xx","123")
schema.zip(row).toMap.mapValues(x=>x.asInstanceOf[AnyRef]).asJava

// 将Java List转换为Scala Seq
import scala.collection.JavaConverters._
public Seq<String> convertListToSeq(List<String> inputList) {
  return JavaConverters.asScalaIteratorConverter(inputList.iterator()).asScala().toSeq();
}