2016-07-24 2 views
2

에서이 코드가 : 대신 내가 읽기 전용 슬라이스를 받아들이라는 오류를 가지고, 내가는/dev/urandom을 장치 \ 파일에서 첫 1024 바이트를 얻을 것으로 예상크리스탈 읽기 X 바이트 파일

a = File.open("/dev/urandom") 
b = a.read(1024) 
a.close 

puts b 

을 정수가 아닙니다.

b = a.read(("a" * 1000).to_slice)

을하지만 내가 다시 "1000"출력에있어 : ​​

그래서 나는 그런 식으로 그것을 할 노력했다.

Crystal의 파일에서 x 바이트를 읽는 올바른 방법은 무엇입니까?

답변

8

당신이 한 일은별로 이상적이지는 않지만 실제로 효과가있었습니다. IO#read(Slice(UInt8))은 파일이 요청한 것보다 작거나 다른 이유로 인해 데이터를 사용할 수없는 경우 실제로 읽은 바이트 수를 반환합니다. 다시 말해 부분 읽기입니다. 따라서 전달한 슬라이스가 1000 바이트로 채워 졌으므로 1000b으로 표시됩니다. 가능하면 많은 요청을 이행 할 때까지 차단하는 IO#read_fully(Slice(UInt8))이 있지만 어떤 경우에도이를 보장 할 수는 없습니다.

더 나은 방법은 다음과 같습니다

File.open("/dev/urandom") do |io| 
    buffer = Bytes.new(1000) # Bytes is an alias for Slice(UInt8) 
    bytes_read = io.read(buffer) 
    # We truncate the slice to what we actually got back, 
    # /dev/urandom never blocks, so this isn't needed in this specific 
    # case, but good practice in general 
    buffer = buffer[0, bytes_read] 
    pp buffer 
end 

IO는 다양한 인코딩에서, 한계에 특정 토큰 될 때까지 또는 최대 문자열을 읽기위한 다양한 편의 기능을 제공합니다. 또한 많은 유형은 from_io 인터페이스를 구현하므로 구조화 된 데이터를 쉽게 읽을 수 있습니다.