Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby의 입력 및 출력(IO):최종 가이드

I/O는 Input/Output의 약자입니다.

입력이란 무언가(컴퓨터, Ruby 방식, 두뇌)로 들어오는 모든 데이터 및 정보를 의미합니다.

입력의 예 :

  • 키보드에서 누르는 키
  • 마우스 클릭
  • 읽은 책

출력이란 입력의 결과로 나오는 모든 것을 의미합니다.

출력의 예 :

  • 1 + 1의 결과
  • 읽은 기사 요약하기
  • 커피

Ruby에서 i/o에 대해 이야기할 때 일반적으로 파일 읽기, 네트워크 소켓 작업 및 화면에 정보 인쇄를 참조합니다.

IO 클래스 이해

IO는 Ruby의 클래스이기도 합니다.

File과 같은 다른 객체의 부모 클래스입니다. &Socket .

모든 IO 개체에는 다음 작업이 있습니다. :

  • 열기/닫기
  • 읽기
  • 쓰기

IO 개체는 파일 설명자를 기반으로 합니다. .

컴퓨터에서 실행 중인 모든 프로세스에는 내부 정보 테이블이 있습니다.

이 표의 일부에는 파일 설명자 목록이 포함되어 있습니다.

파일 설명자는 정수와 파일 이름 간의 매핑입니다. .

Linux에서 이 파일 설명자 목록을 볼 수 있습니다.

이 명령으로 :

# Assuming you have irb open on another window

ls -lh /proc/`pgrep irb`/fd/

# lrwx------ 1 jesus jesus 64 Feb  3 15:54 0 -> /dev/pts/3
# lrwx------ 1 jesus jesus 64 Feb  3 15:54 1 -> /dev/pts/3
# lrwx------ 1 jesus jesus 64 Feb  3 15:54 2 -> /dev/pts/3

sysopen을 사용하여 Ruby에서 새 파일 설명자를 만들 수 있습니다. 방법.

:

fd = IO.sysopen('/dev/null', 'w')

# 10

이제 이 파일 설명자로 통신 채널을 열 수 있습니다(10 ).

좋아요 :

io = IO.new(fd)

그리고 쓰기 :

io << 'orange'

IO 파일 설명자가 실제 파일, 장치(예:하드 디스크) 또는 네트워크 소켓에 매핑되는지 여부는 상관하지 않습니다.

쓰기를 위해 파일 설명자를 여는 방법

sysopen을 사용하여 새 파일 설명자를 만들 때 , 또는 File.open을 사용하여 파일을 엽니다. , 몇 가지 옵션이 있습니다.

기본적으로 통신은 읽기 전용입니다.

모드를 지정할 수 있습니다. :

  • r (읽기, 기본값)
  • w (쓰기)
  • w+ (읽기 및 쓰기)
  • a (추가)

:

fd = IO.sysopen('/dev/tty1', 'w+')

그러면 /dev/tty1이 열립니다. 읽기 + 쓰기 모드로.

3 표준 IO 스트림

새 프로그램(편집기, 터미널, Ruby 인터프리터 등)을 열면 기본적으로 3개의 통신 채널이 열립니다.

3개의 파일 설명자.

그들은 :

  • stdin(입력)
  • stdout(출력)
  • stderr(오류)

Ruby에서는 상수 형식이나 전역 변수 형식을 사용하여 직접 액세스할 수 있습니다.

:

$stdout << "abc\n"

$stdout에 쓸 때 , puts 메소드를 호출하는 것과 같습니다.

표준 출력 터미널과 연결되어 있습니다.

lrwx------ 1 jesus jesus 64 Feb  3 15:54 0 -> /dev/pts/3

/dev/pts/3 터미널이 화면에 텍스트를 표시하기 위해 읽는 가상 장치입니다.

표준 오류 출력에도 사용되지만 터미널에서 더 큰 글꼴이나 일반 텍스트와 다른 색상과 같은 다른 방식으로 이 콘텐츠를 표시할 수 있습니다.

warn를 사용할 수 있습니다. 표준 오류로 인쇄하는 방법입니다.

표준 입력 사용자 입력을 읽는 곳입니다.

gets을 사용할 수 있습니다. 표준 입력에서 읽는 방법.

STDOUT을 플러시하고 버퍼링을 비활성화하는 방법

IO 개체에는 내부 버퍼가 있습니다.

일정량의 입력 데이터를 읽기 전에 저장합니다. .

이것이 때때로 puts를 사용하는 이유입니다. ...

하지만 프로그램이 끝나거나 버퍼가 가득 찰 때까지 아무 것도 볼 수 없습니다!

이와 같이 버퍼링을 비활성화할 수 있습니다. :

$stdout.sync = true

또는 수동으로 버퍼를 플러시할 수 있습니다. :

$stdout.flush

버퍼를 비활성화하면 기다릴 필요 없이 출력을 볼 수 있습니다.

청크 읽기

IO 개체에서 읽을 때 read 스트림이 END-OF-FILE(EOF) 신호로 끝날 때까지 스트림이 닫히거나 특정 양의 바이트를 수신합니다.

네트워크 프로그래밍 및 대용량 파일의 경우 작은 덩어리로 읽는 것이 도움이 됩니다.

이와 같은 청크로 읽을 수 있습니다. :

data = ""

until io.eof?
  data << io.read(2048)
end

이 코드를 사용하면 전체 다운로드가 완료될 때까지 기다릴 필요 없이 데이터가 사용 가능해지면 처리할 수 있습니다.

eof? "차단"합니다.

차단은 코드가 휴면 상태가 된다는 것을 의미합니다. 운영 체제에서 읽을 새 데이터가 있음을 알립니다. .

양방향 통신을 위해 IO 파이프를 사용하는 방법

Ruby를 사용하면 파이프를 만들 수 있습니다.

파이프는 서로 연결된 파일 설명자 쌍입니다.

IPC(프로세스 간 통신)에 사용됩니다.

:

read, write = IO.pipe

fork와 함께 사용할 수 있습니다. 메서드(Windows에서는 사용할 수 없음)를 사용하여 현재 프로세스의 복사본을 만듭니다.

이 두 프로세스는 파이프를 사용하여 통신할 수 있습니다.

:

if fork
  write.close

  puts "Message received: #{read.gets}"

  read.close
else
  read.close

  write << "Buy some bananas!"

  write.close
end

결과 :

# Message received: Buy some bananas!

커널 오픈 방식 사용 방법

Ruby에는 매우 유연한 open이 있습니다. 방법.

파일을 열고 URL에서 데이터를 읽을 수 있으며 파이프를 열어 외부 명령을 실행할 수도 있습니다.

:

open "abc.txt"

그렇기 때문에 이 방법은 피해야 합니다 .

이러한 모든 작업을 수행할 수 있다는 것은 보안상의 위험입니다.

대신 특정 open을 사용하는 것이 좋습니다. 필요한 방법입니다.

:

File.open           # File
IO.popen            # Process open
URI.parse(...).open # URL open

이들 모두는 IO를 반환합니다. 개체.

요약

Ruby의 입력/출력에 대해 배웠습니다! 파일 설명자 IO에 대해 배웠습니다. 클래스, 버퍼링, 청크 읽기 및 표준 IO 스트림.

Ruby의 입력 및 출력(IO):최종 가이드

이 기사가 마음에 들면 공유하는 것을 잊지 마십시오.

읽어주셔서 감사합니다.