복붙노트

[SCALA] 스칼라 : 하나의 문에서 파일에 쓰기 문자열

SCALA

스칼라 : 하나의 문에서 파일에 쓰기 문자열

스칼라에서 파일을 읽을 경우,이

Source.fromFile("file.txt").mkString

파일에 문자열을 쓸 수있는 동등한하고 간결한 방법이 있나요?

대부분의 언어는 그런 일을 지원합니다. 내가 제일 좋아하는 그루비입니다 :

def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"

나는 한 줄의 코드의 짧은 페이지에 이르기까지 다양한 프로그램에 대한 코드를 사용하고 싶습니다. 여기에 이해가되지 않습니다 자신의 라이브러리를 사용하지. 나는 현대적인 언어가 나를 편리하게 파일에 뭔가를 쓸 수 있도록 기대합니다.

이 이와 유사한 게시물이 있지만, 그들은 내 정확한 질문에 대답하지 않는 이상 스칼라 버전에 초점을 맞추고있다.

예를 들면 :

해결법

  1. ==============================

    1.간결한 하나의 라인 :

    간결한 하나의 라인 :

    import java.io.PrintWriter
    new PrintWriter("filename") { write("file contents"); close }
    
  2. ==============================

    2.아무도 (자바 7부터 사용 가능) NIO.2 작업을 제안 없었다 이상한입니다 :

    아무도 (자바 7부터 사용 가능) NIO.2 작업을 제안 없었다 이상한입니다 :

    import java.nio.file.{Paths, Files}
    import java.nio.charset.StandardCharsets
    
    Files.write(Paths.get("file.txt"), "file contents".getBytes(StandardCharsets.UTF_8))
    

    나는 이것이 지금까지 가장 간단하고 가장 쉽고 관용적 인 방법이라고 생각, 그것은 종속성 산세 자바 자체가 필요하지 않습니다.

  3. ==============================

    3.여기에 간결한 한 줄 사용 reflect.io.file, 스칼라 2.12이 작품은 다음과 같습니다

    여기에 간결한 한 줄 사용 reflect.io.file, 스칼라 2.12이 작품은 다음과 같습니다

    reflect.io.File("filename").writeAll("hello world")
    

    당신은 자바 라이브러리를 사용하려는 경우 또는이 해킹을 수행 할 수 있습니다 :

    Some(new PrintWriter("filename")).foreach{p => p.write("hello world"); p.close}
    
  4. ==============================

    4.당신 그루비 구문 같은 경우 스칼라에 가져 오기 위하여 포주 - 내 - 도서관 디자인 패턴을 사용할 수 있습니다 :

    당신 그루비 구문 같은 경우 스칼라에 가져 오기 위하여 포주 - 내 - 도서관 디자인 패턴을 사용할 수 있습니다 :

    import java.io._
    import scala.io._
    
    class RichFile( file: File ) {
    
      def text = Source.fromFile( file )(Codec.UTF8).mkString
    
      def text_=( s: String ) {
        val out = new PrintWriter( file , "UTF-8")
        try{ out.print( s ) }
        finally{ out.close }
      }
    }
    
    object RichFile {
    
      implicit def enrichFile( file: File ) = new RichFile( file )
    
    }
    

    예상대로 작동합니다 :

    scala> import RichFile.enrichFile
    import RichFile.enrichFile
    
    scala> val f = new File("/tmp/example.txt")
    f: java.io.File = /tmp/example.txt
    
    scala> f.text = "hello world"
    
    scala> f.text
    res1: String = 
    "hello world
    
  5. ==============================

    5.

    import sys.process._
    "echo hello world" #> new java.io.File("/tmp/example.txt") !
    
  6. ==============================

    6.마이크로 라이브러리 내가 쓴 : https://github.com/pathikrit/better-files

    마이크로 라이브러리 내가 쓴 : https://github.com/pathikrit/better-files

    file.write("Hi!")
    

    또는

    file << "Hi!"
    
  7. ==============================

    7.당신은 쉽게 아파치 파일의 Utils를 사용할 수 있습니다. 기능 writeStringToFile 봐. 우리는 우리의 프로젝트에이 라이브러리를 사용합니다.

    당신은 쉽게 아파치 파일의 Utils를 사용할 수 있습니다. 기능 writeStringToFile 봐. 우리는 우리의 프로젝트에이 라이브러리를 사용합니다.

  8. ==============================

    8.이 간결에 충분한 것 같아요 :

    이 간결에 충분한 것 같아요 :

    scala> import java.io._
    import java.io._
    
    scala> val w = new BufferedWriter(new FileWriter("output.txt"))
    w: java.io.BufferedWriter = java.io.BufferedWriter@44ba4f
    
    scala> w.write("Alice\r\nBob\r\nCharlie\r\n")
    
    scala> w.close()
    
  9. ==============================

    9.하나는 간결하고 아름답게 기록 기본 라이브러리 (소스 코드 참조) 모두가이 형식을 가지고 있습니다 :

    하나는 간결하고 아름답게 기록 기본 라이브러리 (소스 코드 참조) 모두가이 형식을 가지고 있습니다 :

    import scalax.io.Codec
    import scalax.io.JavaConverters._
    
    implicit val codec = Codec.UTF8
    
    new java.io.File("hi-file.txt").asOutput.write("I'm a hi file! ... Really!")
    
  10. ==============================

    10.당신은 자바와 스칼라 라이브러리의 혼합이 작업을 수행 할 수 있습니다. 당신은 문자 인코딩을 완전히 제어 할 수 있습니다. 그러나 불행하게도, 파일 핸들이 제대로 닫히지 않습니다.

    당신은 자바와 스칼라 라이브러리의 혼합이 작업을 수행 할 수 있습니다. 당신은 문자 인코딩을 완전히 제어 할 수 있습니다. 그러나 불행하게도, 파일 핸들이 제대로 닫히지 않습니다.

    scala> import java.io.ByteArrayInputStream
    import java.io.ByteArrayInputStream
    
    scala> import java.io.FileOutputStream
    import java.io.FileOutputStream
    
    scala> BasicIO.transferFully(new ByteArrayInputStream("test".getBytes("UTF-8")), new FileOutputStream("test.txt"))
    
  11. ==============================

    11.나는 한 줄하지 알고 있지만, 지금까지 내가 말할 수있는 안전 문제를 해결;

    나는 한 줄하지 알고 있지만, 지금까지 내가 말할 수있는 안전 문제를 해결;

    // This possibly creates a FileWriter, but maybe not
    val writer = Try(new FileWriter(new File("filename")))
    // If it did, we use it to write the data and return it again
    // If it didn't we skip the map and print the exception and return the original, just in-case it was actually .write() that failed
    // Then we close the file
    writer.map(w => {w.write("data"); w}).recoverWith{case e => {e.printStackTrace(); writer}}.map(_.close)
    

    당신은 예외 처리에 대해 걱정하지 않은 경우 당신은 쓸 수 있습니다

    writer.map(w => {w.writer("data"); w}).recoverWith{case _ => writer}.map(_.close)
    
  12. ==============================

    12.업데이트 : 나는 때문에 내가 여기에 자세히 설명이있는에보다 효과적인 솔루션을 만들었습니다 https://stackoverflow.com/a/34277491/501113

    업데이트 : 나는 때문에 내가 여기에 자세히 설명이있는에보다 효과적인 솔루션을 만들었습니다 https://stackoverflow.com/a/34277491/501113

    나는 나 자신이 이클립스에 대한 스칼라 IDE 내에서 스칼라 워크 시트에 더 많은 작업 찾아 (내가하게 IntelliJ IDEA에서 뭔가 상당이 생각). 어쨌든, 내가 얻을로 출력 내용의 일부를 한 라이너를 할 수 있어야한다 "출력이 차단 제한을 초과합니다." 나는 특히 스칼라 컬렉션으로 상당한 아무것도하고 경우 메시지.

    나는이 문제를 단순화하기 위해 각각의 새로운 스칼라 워크 시트의 상단에 삽입 한 라이너를 함께했다 (그리고 난 아주 간단한 필요성에 대한 전체 외부 라이브러리 가져 오기 운동을 할 필요가 없습니다). 당신이 까다로운 사람과 기술적으로 두 줄 것을 통지하는 경우,이 포럼에서 더 읽을 수 있도록 단지입니다. 그것은 내 스칼라 워크 시트에서 하나의 라인입니다.

    def printToFile(content: String, location: String = "C:/Users/jtdoe/Desktop/WorkSheet.txt") =
      Some(new java.io.PrintWriter(location)).foreach{f => try{f.write(content)}finally{f.close}}
    

    그리고 사용법은 간단하다 :

    printToFile("A fancy test string\ncontaining newlines\nOMG!\n")
    

    이것은 내가 (완전히 파일을 메서드가 호출 될 때마다 덮어 쓰기) 기본 이외의 추가 파일을 갖고 싶어해야 나를 선택적으로 파일 이름을 제공 할 수 있습니다.

    그래서, 두 번째 사용법은 간단하다 :

    printToFile("A fancy test string\ncontaining newlines\nOMG!\n", "C:/Users/jtdoe/Desktop/WorkSheet.txt")
    

    즐겨!

  13. ==============================

    13.세미콜론의 마법을 통해, 당신은 당신이 한 줄처럼 아무것도 할 수 있습니다.

    세미콜론의 마법을 통해, 당신은 당신이 한 줄처럼 아무것도 할 수 있습니다.

    import java.io.PrintWriter
    import java.nio.file.Files
    import java.nio.file.Paths
    import java.nio.charset.StandardCharsets
    import java.nio.file.StandardOpenOption
    val outfile = java.io.File.createTempFile("", "").getPath
    val outstream = new PrintWriter(Files.newBufferedWriter(Paths.get(outfile)
      , StandardCharsets.UTF_8
      , StandardOpenOption.WRITE)); outstream.println("content"); outstream.flush(); outstream.close()
    
  14. from https://stackoverflow.com/questions/6879427/scala-write-string-to-file-in-one-statement by cc-by-sa and MIT license