복붙노트

[SCALA] 스칼라에서 전체 파일을 읽기?

SCALA

스칼라에서 전체 파일을 읽기?

스칼라에서 메모리에 전체 파일을 읽을 수있는 간단하고 표준적인 방법은 무엇입니까? (이상적으로, 문자 인코딩을 통해 제어).

I가 가지고 올 수있는 최선 :

scala.io.Source.fromPath("file.txt").getLines.reduceLeft(_+_)

또는 내가 할 수있는 최상의하는의 (외부 라이브러리를 사용하지 않고) 자바의 지독한 관용구 중 하나를 보인다 사용 하죠 :

import java.util.Scanner
import java.io.File
new Scanner(new File("file.txt")).useDelimiter("\\Z").next()

메일 링리스트의 토론을 읽고, 그 scala.io.Source 심지어 표준 I / O 라이브러리 있어야하는데 나에게 분명하지 않다. 나는 정확히 의도 된 목적이 무엇인지 이해하지 않습니다.

... 나는 죽은 간단하고 기억하기 쉬운 무언가를하고 싶습니다. 예를 들어, 이러한 언어는 관용구를 잊지 매우 어렵습니다 ...

Ruby    open("file.txt").read
Ruby    File.read("file.txt")
Python  open("file.txt").read()

해결법

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

    1.

    val lines = scala.io.Source.fromFile("file.txt").mkString
    

    그런데, "스칼라." 어쨌든 범위에 항상, 당신은, 물론, 완전히 또는 부분적으로 수입 IO의 내용,의와 것은 앞에 추가하는 것을 피하기 수있는, 정말 필요하지 않다 "IO를." 너무.

    위는 그러나, 파일을 열어 둡니다. 문제를 방지하려면이처럼 닫아야합니다 :

    val source = scala.io.Source.fromFile("file.txt")
    val lines = try source.mkString finally source.close()
    

    위의 코드의 또 다른 문제는 인해 구현 자연에 느린 끔찍한 것입니다. 큰 파일의 경우 하나를 사용해야합니다 :

    source.getLines mkString "\n"
    
  2. ==============================

    2.그냥 다니엘의 솔루션을 확장, 당신은 파일 조작을 필요로하는 파일에 다음 가져 오기를 삽입하여 일을 대단히까지 단축 할 수 있습니다 :

    그냥 다니엘의 솔루션을 확장, 당신은 파일 조작을 필요로하는 파일에 다음 가져 오기를 삽입하여 일을 대단히까지 단축 할 수 있습니다 :

    import scala.io.Source._
    

    이, 당신은 지금 할 수있는 :

    val lines = fromFile("file.txt").getLines
    

    나는 하나의 문자열로 전체 파일을 읽는주의 할 것이다. 그것은 매우 나쁜 습관, 빨리 물린 것 하나는 당신이 생각하는 것보다 더 어렵다. getLines 방법 유형 반복자 [문자열]의 값을 반환한다. 그것은 효과적으로 당신이 메모리 공급 과잉 위험없이 필요한 데이터 만 검사 할 수 있도록 파일에 게으른 커서입니다.

    아, 그리고 소스에 대해 암시 적 질문에 대답 : 예, 그것은 표준 I / O 라이브러리입니다. 대부분의 코드는 인해 낮은 수준의 인터페이스와 기존의 프레임 워크와의 호환성을 향상에 java.io를 사용하여 종료하지만 선택의 여지가있는 모든 코드는 특히 간단한 파일 조작을 위해, 소스를 사용한다.

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

    3.

    // for file with utf-8 encoding
    val lines = scala.io.Source.fromFile("file.txt", "utf-8").getLines.mkString
    
  4. ==============================

    4.(편집 : 이것은 아마 2.8 중 하나 스칼라 2.9에서 작동하지 않습니다)

    (편집 : 이것은 아마 2.8 중 하나 스칼라 2.9에서 작동하지 않습니다)

    트렁크를 사용합니다 :

    scala> io.File("/etc/passwd").slurp
    res0: String = 
    ##
    # User Database
    # 
    ... etc
    
  5. ==============================

    5.

    import java.nio.charset.StandardCharsets._
    import java.nio.file.{Files, Paths}
    
    new String(Files.readAllBytes(Paths.get("file.txt")), UTF_8)
    

    문자 인코딩에 대한 통제, 그리고 어떤 자원을 정리합니다. 또한, 아마도 (파일 크기에 적합한 바이트 배열을 할당 예컨대 Files.readAllBytes)을 최적화.

  6. ==============================

    6.나는 Source.fromFile가 문제가 있다고 들었다. 개인적으로, 나는 Source.fromFile로 큰 파일을 여는 문제가 있었 자바에는 InputStream에 의존해야했다.

    나는 Source.fromFile가 문제가 있다고 들었다. 개인적으로, 나는 Source.fromFile로 큰 파일을 여는 문제가 있었 자바에는 InputStream에 의존해야했다.

    또 다른 흥미로운 솔루션은 scalax을 사용하고 있습니다. 여기 scalax 헬퍼 파일을 열 때의 ManagedResource를 사용하여 로그 파일을 엽니 일부 주석이 잘 코드의 예 http://pastie.org/pastes/420714

  7. ==============================

    7.(\ n, \ r을 \ 연구 \ n 등) 줄 끝을 위해 사용 된 어떤 문자 scala.io.Source 버립니다에 getLines ()를 사용하여

    (\ n, \ r을 \ 연구 \ n 등) 줄 끝을 위해 사용 된 어떤 문자 scala.io.Source 버립니다에 getLines ()를 사용하여

    다음은 그것을 문자 수준을 유지해야하고, 과도한 문자열 연결을 (성능 문제)하지 않습니다

    def fileToString(file: File, encoding: String) = {
      val inStream = new FileInputStream(file)
      val outStream = new ByteArrayOutputStream
      try {
        var reading = true
        while ( reading ) {
          inStream.read() match {
            case -1 => reading = false
            case c => outStream.write(c)
          }
        }
        outStream.flush()
      }
      finally {
        inStream.close()
      }
      new String(outStream.toByteArray(), encoding)
    }
    
  8. ==============================

    8.그냥 CommonsIO 라이브러리를 사용하여, 자바 같은 :

    그냥 CommonsIO 라이브러리를 사용하여, 자바 같은 :

    FileUtils.readFileToString(file, StandardCharsets.UTF_8)
    

    또한, 많은 대답은 여기에 캐릭터 세트를 잊는다. 그것은 항상 명시 적으로 제공하는 것이 좋습니다, 또는 하루에 타격을 줄 것으로 예상된다.

  9. ==============================

    9.하나 더 : https://github.com/pathikrit/better-files#streams-and-codecs

    하나 더 : https://github.com/pathikrit/better-files#streams-and-codecs

    메모리에 내용을로드하지 않고 파일을 후루룩 소리 내며 먹기 다양한 방법 :

    val bytes  : Iterator[Byte]            = file.bytes
    val chars  : Iterator[Char]            = file.chars
    val lines  : Iterator[String]          = file.lines
    val source : scala.io.BufferedSource   = file.content 
    

    당신은 너무 읽기 / 쓰기 작업을 수행 아무것도 자신의 코덱을 제공 할 수 있습니다 (하나를 제공하지 않는 경우가 scala.io.Codec.default 가정) :

    val content: String = file.contentAsString  // default codec
    // custom codec:
    import scala.io.Codec
    file.contentAsString(Codec.ISO8859)
    //or
    import scala.io.Codec.string2codec
    file.write("hello world")(codec = "US-ASCII")
    
  10. ==============================

    10.루비 구문을 모방 (와 의미 전달) 개방을하고 파일을 읽기 위해,이 암시 적 클래스 (스칼라 2.10 상부를) 고려

    루비 구문을 모방 (와 의미 전달) 개방을하고 파일을 읽기 위해,이 암시 적 클래스 (스칼라 2.10 상부를) 고려

    import java.io.File
    
    def open(filename: String) = new File(filename)
    
    implicit class RichFile(val file: File) extends AnyVal {
      def read = io.Source.fromFile(file).getLines.mkString("\n")
    }
    

    이런 식으로,

    open("file.txt").read
    
  11. ==============================

    11.몇 사람이 언급 한 바와 같이 scala.io.Source 연결 누수로 인해 피해야하는 것이 가장 좋습니다.

    몇 사람이 언급 한 바와 같이 scala.io.Source 연결 누수로 인해 피해야하는 것이 가장 좋습니다.

    아마 공유지-IO와 같은 scalax 순수 자바 libs와 병합됩니다 새로운 인큐베이터 프로젝트까지 최고의 옵션 (예 : 스칼라-IO)가 있습니다.

  12. ==============================

    12.스칼라 읽고 프로세스 파일 io를에서 당신은 또한 경로를 사용할 수 있습니다.

    스칼라 읽고 프로세스 파일 io를에서 당신은 또한 경로를 사용할 수 있습니다.

    import scalax.file.Path
    

    지금 당신은이를 사용하여 파일 경로를 얻을 수 있습니다 : -

    val filePath = Path("path_of_file_to_b_read", '/')
    val lines = file.lines(includeTerminator = true)
    

    또한 터미네이터를 포함 할 수 있지만 기본적으로 false로 설정되어 있습니다 ..

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

    13.빠른 전체 읽기 / A (대형) 파일을 업로드, (Source.DefaultBufSize 2048로 설정) BUFFERSIZE의 크기를 늘리 예를 들어, 다음과 같이

    빠른 전체 읽기 / A (대형) 파일을 업로드, (Source.DefaultBufSize 2048로 설정) BUFFERSIZE의 크기를 늘리 예를 들어, 다음과 같이

    val file = new java.io.File("myFilename")
    io.Source.fromFile(file, bufferSize = Source.DefaultBufSize * 2)
    

    Source.scala을합니다. 자세한 설명은 스칼라 빠른 텍스트 파일을 읽고 메모리에 업로드를 참조하십시오.

  14. ==============================

    14.명백한 질문은 "왜 전체 파일에 읽고 싶어합니까?"인 파일이 매우 커질 경우 이것은 분명히 확장 가능한 솔루션이 아닙니다. scala.io.Source은 매우 유용하고 간결하다 getLines 방법에서 반복자 [문자열]을 다시 제공합니다.

    명백한 질문은 "왜 전체 파일에 읽고 싶어합니까?"인 파일이 매우 커질 경우 이것은 분명히 확장 가능한 솔루션이 아닙니다. scala.io.Source은 매우 유용하고 간결하다 getLines 방법에서 반복자 [문자열]을 다시 제공합니다.

    그것은 파일, Reader 또는 문자열로 InputStream를 변환하는 기본 자바 IO 유틸리티를 사용하여 암시 적 변환을 마련하는 작업의 많은 부분이 아니다. 나는 확장 성 부족들이 표준 API이를 추가하지 올바른 것을 의미한다고 생각합니다.

  15. ==============================

    15.당신은 모든 단일 라인을 구문 분석하고 다시 연결할 필요가 없습니다 ...

    당신은 모든 단일 라인을 구문 분석하고 다시 연결할 필요가 없습니다 ...

    Source.fromFile(path)(Codec.UTF8).mkString
    

    나는 이것을 사용하는 것을 선호 :

    import scala.io.{BufferedSource, Codec, Source}
    import scala.util.Try
    
    def readFileUtf8(path: String): Try[String] = Try {
      val source: BufferedSource = Source.fromFile(path)(Codec.UTF8)
      val content = source.mkString
      source.close()
      content
    }
    
  16. ==============================

    16.타사 종속성이 괜찮다면, 당신은 내 OS-lib 디렉토리의 라이브러리를 사용하는 것이 좋습니다. 이 파일을 작성하고 파일 시스템이 매우 편리 작업 / 독서 있습니다 :

    타사 종속성이 괜찮다면, 당신은 내 OS-lib 디렉토리의 라이브러리를 사용하는 것이 좋습니다. 이 파일을 작성하고 파일 시스템이 매우 편리 작업 / 독서 있습니다 :

    // Make sure working directory exists and is empty
    val wd = os.pwd/"out"/"splash"
    os.remove.all(wd)
    os.makeDir.all(wd)
    
    // Read/write files
    os.write(wd/"file.txt", "hello")
    os.read(wd/"file.txt") ==> "hello"
    
    // Perform filesystem operations
    os.copy(wd/"file.txt", wd/"copied.txt")
    os.list(wd) ==> Seq(wd/"copied.txt", wd/"file.txt")
    

    한 줄의 선을, 바이트를 읽어 덩어리를 읽고, 읽기위한 도우미, 그리고 다른 많은 유용한 / 일반적인 작업과

  17. ==============================

    17.모든 라인을 읽을 사용 자바의 BufferedReader처럼 모든 라인을 인쇄하고 인쇄 :

    모든 라인을 읽을 사용 자바의 BufferedReader처럼 모든 라인을 인쇄하고 인쇄 :

    scala.io.Source.fromFile("test.txt" ).foreach{  print  }
    

    동등한:

    scala.io.Source.fromFile("test.txt" ).foreach( x => print(x))
    
  18. ==============================

    18.

    import scala.io.source
    object ReadLine{
    def main(args:Array[String]){
    if (args.length>0){
    for (line <- Source.fromLine(args(0)).getLine())
    println(line)
    }
    }
    

    인수는 파일 경로를 제공 할 수 있으며 모든 행을 반환합니다

  19. from https://stackoverflow.com/questions/1284423/read-entire-file-in-scala by cc-by-sa and MIT license