대부분의 프로그래밍 언어에서 파일 작업의 흐름은 개방-사용-폐쇄라는 것은 상식입니다. 하지만 필자는 루비 코드에서 필적 할 수없는 File.open 호출을 여러 번 보았고, 또한 루비 문서 에서이 지식의 보석을 발견 했습니다 .
I / O 스트림은 가비지 수집기에서 요청하면 자동으로 닫힙니다.
darkredandyellow 친화적 인 irc가 문제를 해결합니다.
[17:12] 예, 또한 파일 설명 자의 수는 일반적으로 OS에 의해 제한됩니다.
[17:29] 가비지 수집기가 정리 되기 전에 사용 가능한 파일 설명자가 쉽게 부족할 수 있다고 가정 합니다. 쪽으로. 이 경우 직접 close를 사용하는 것이 좋습니다. “가비지 수집기에 의해 요구됩니다.” GC가 미래의 어느 시점에서 작동 함을 의미합니다. 그리고 비싸다. 명시 적으로 파일을 닫는 데는 많은 이유가 있습니다.
- 명시 적으로 닫아야합니까?
- 그렇다면 GC가 자동으로 닫히는 이유는 무엇입니까?
- 그렇지 않다면 왜 옵션입니까?
답변
나는 루비 코드에서 타의 추종을 불허하는
File.open
호출 에서 여러 번 보았다
예를 들어 줄 수 있습니까? 나는 “파일 작업을위한 흐름이 개방-사용- 폐쇄적 이라는”대부분의 프로그래밍 언어에 대한 상식이 부족한 초보자가 작성한 코드에서만 볼 수 있습니다.
숙련 된 Rubyists는 파일을 명시 적으로 닫거나, 더 관용적 File.open
으로는 파일을 자동으로 닫는 블록 형식을 사용 합니다. 구현은 기본적으로 다음과 같습니다.
def File.open(*args, &block)
return open_with_block(*args, &block) if block_given?
open_without_block(*args)
end
def File.open_without_block(*args)
# do whatever ...
end
def File.open_with_block(*args)
yield f = open_without_block(*args)
ensure
f.close
end
스크립트는 특별한 경우입니다. 스크립트는 일반적으로 너무 짧게 실행되며 스크립트가 종료 될 때 운영 체제가 닫을 것이기 때문에 파일 설명자를 너무 적게 사용하여 닫는 것이 의미가 없습니다.
명시 적으로 닫아야합니까?
예.
그렇다면 GC가 자동으로 닫히는 이유는 무엇입니까?
객체를 수집 한 후에는 더 이상 파일을 닫을 방법이 없으므로 파일 설명자가 유출 될 수 있습니다.
파일을 닫는 것은 가비지 수집기가 아닙니다. 가비지 수집기는 개체를 수집하기 전에 개체에 대한 종료자를 실행합니다. 그냥 그렇게하는 것이 어떻게 File
클래스 파일을 닫습니다 파이널 라이저를 정의합니다.
그렇지 않다면 왜 옵션입니까?
낭비되는 메모리는 저렴하지만 낭비되는 파일 설명자는 그렇지 않기 때문입니다. 따라서 파일 설명 자의 수명을 일부 메모리 청크의 수명과 연결하는 것은 의미가 없습니다.
당신은 단순히 예측할 수 없습니다 때 가비지 수집기가 실행됩니다. 당신도 예측할 수없는 경우 가 실행됩니다 전혀 : 당신이 메모리가 부족하지 않을 경우, 가비지 컬렉터가 실행되지 않습니다, 그러므로 파이널이 실행되지 않습니다 따라서 파일이 폐쇄되지 않습니다.
답변
사용 후에는 항상 파일 설명자를 닫아야합니다. 종종 사람들은 파일 설명자 수명을 처리하기 위해 File.open 또는 블록이있는 동등한 메서드를 사용합니다. 예를 들면 :
File.open('foo', 'w') do |f|
f.write "bar"
end
이 예에서는 파일이 자동으로 닫힙니다.
답변
http://ruby-doc.org/core-2.1.4/File.html#method-c-open 에 따르면
연관된 블록이없는 File.open은 :: new의 동의어입니다. 선택적 코드 블록이 제공되면 열린 파일이 인수로 전달되고 File 객체는 블록이 종료 될 때 자동으로 닫힙니다. 블록 값은 File.open에서 반환됩니다.
따라서, 블록이 종료되면 자동으로 닫힙니다 .D
답변
- 예
- 그렇지 않은 경우 또는 다른 실패가있는 경우
- 2를 참조하십시오.
답변
이 File.read()
함수를 사용하여 ruby ….. 파일을 읽을 수 있습니다.
file_variable = File.read("filename.txt")
이 예 file_variable
에서는 해당 파일의 전체 값을 가질 수 있습니다 ….