This is a Ruby tree! It shows every object from the Ruby Programming Language in a tree format.

IO

        # IO < Object

---
# Includes:
(from ruby core)
    File::File::Constants
    Enumerable

(from ruby core)
---

Expect library adds the IO instance method #expect, which does similar
act to tcl's expect extension.

In order to use this method, you must require expect:

    require 'expect'

Please see #expect for usage.

The IO class is the basis for all input and output in Ruby. An I/O
stream may be *duplexed* (that is, bidirectional), and so may use more
than one native operating system stream.

Many of the examples in this section use the File class, the only
standard subclass of IO. The two classes are closely associated.  Like
the File class, the Socket library subclasses from IO (such as TCPSocket
or UDPSocket).

The Kernel#open method can create an IO (or File) object for these types
of arguments:

*   A plain string represents a filename suitable for the underlying
    operating system.

*   A string starting with `"|"` indicates a subprocess. The remainder
    of the string following the `"|"` is invoked as a process with
    appropriate input/output channels connected to it.

*   A string equal to `"|-"` will create another Ruby instance as a
    subprocess.


The IO may be opened with different file modes (read-only, write-only)
and encodings for proper conversion.  See IO.new for these options.  See
Kernel#open for details of the various command formats described above.

IO.popen, the Open3 library, or  Process#spawn may also be used to
communicate with subprocesses through an IO.

Ruby will convert pathnames between different operating system
conventions if possible.  For instance, on a Windows system the filename
`"/gumby/ruby/test.rb"` will be opened as `"\gumby\ruby\test.rb"`.  When
specifying a Windows-style filename in a Ruby string, remember to escape
the backslashes:

    "C:\\gumby\\ruby\\test.rb"

Our examples here will use the Unix-style forward slashes;
File::ALT_SEPARATOR can be used to get the platform-specific separator
character.

The global constant ARGF (also accessible as `$<`) provides an IO-like
stream which allows access to all files mentioned on the command line
(or STDIN if no files are mentioned). ARGF#path and its alias
ARGF#filename are provided to access the name of the file currently
being read.

## io/console

The io/console extension provides methods for interacting with the
console.  The console can be accessed from IO.console or the standard
input/output/error IO objects.

Requiring io/console adds the following methods:

*   IO::console
*   IO#raw
*   IO#raw!
*   IO#cooked
*   IO#cooked!
*   IO#getch
*   IO#echo=
*   IO#echo?
*   IO#noecho
*   IO#winsize
*   IO#winsize=
*   IO#iflush
*   IO#ioflush
*   IO#oflush


Example:

    require 'io/console'
    rows, columns = $stdout.winsize
    puts "Your screen is #{columns} wide and #{rows} tall"

## Example Files

Many examples here use these filenames and their corresponding files:

*   `t.txt`: A text-only file that is assumed to exist via:

        text = <<~EOT
          This is line one.
          This is the second line.
          This is the third line.
        EOT
        File.write('t.txt', text)

*   `t.dat`: A data file that is assumed to exist via:

        data = "\u9990\u9991\u9992\u9993\u9994"
        f = File.open('t.dat', 'wb:UTF-16')
        f.write(data)
        f.close

*   `t.rus`: A Russian-language text file that is assumed to exist via:

        File.write('t.rus', "\u{442 435 441 442}")

*   `t.tmp`: A file that is assumed *not* to exist.


## Modes

A number of IO method calls must or may specify a *mode* for the stream;
the mode determines how stream is to be accessible, including:

*   Whether the stream is to be read-only, write-only, or read-write.
*   Whether the stream is positioned at its beginning or its end.
*   Whether the stream treats data as text-only or binary.
*   The external and internal encodings.


### Mode Specified as an Integer

When `mode` is an integer it must be one or more (combined by bitwise OR
(`|`) of the modes defined in File::Constants:

*   `File::RDONLY`: Open for reading only.
*   `File::WRONLY`: Open for writing only.
*   `File::RDWR`: Open for reading and writing.
*   `File::APPEND`: Open for appending only.
*   `File::CREAT`: Create file if it does not exist.
*   `File::EXCL`: Raise an exception if `File::CREAT` is given and the
    file exists.


Examples:

    File.new('t.txt', File::RDONLY)
    File.new('t.tmp', File::RDWR | File::CREAT | File::EXCL)

Note: Method IO#set_encoding does not allow the mode to be specified as
an integer.

### Mode Specified As a String

When `mode` is a string it must begin with one of the following:

*   `'r'`: Read-only stream, positioned at the beginning; the stream
    cannot be changed to writable.
*   `'w'`: Write-only stream, positioned at the beginning; the stream
    cannot be changed to readable.
*   `'a'`: Write-only stream, positioned at the end; every write appends
    to the end; the stream cannot be changed to readable.
*   `'r+'`: Read-write stream, positioned at the beginning.
*   `'w+'`: Read-write stream, positioned at the end.
*   `'a+'`: Read-write stream, positioned at the end.


For a writable file stream (that is, any except read-only), the file is
truncated to zero if it exists, and is created if it does not exist.

Examples:

    File.open('t.txt', 'r')
    File.open('t.tmp', 'w')

Either of the following may be suffixed to any of the above:

*   `'t'`: Text data; sets the default external encoding to
    `Encoding::UTF_8`; on Windows, enables conversion between EOL and
    CRLF.
*   `'b'`: Binary data; sets the default external encoding to
    `Encoding::ASCII_8BIT`; on Windows, suppresses conversion between
    EOL and CRLF.


If neither is given, the stream defaults to text data.

Examples:

    File.open('t.txt', 'rt')
    File.open('t.dat', 'rb')

The following may be suffixed to any writable mode above:

*   `'x'`: Creates the file if it does not exist; raises an exception if
    the file exists.


Example:

    File.open('t.tmp', 'wx')

Finally, the mode string may specify encodings -- either external
encoding only or both external and internal encodings -- by appending
one or both encoding names, separated by colons:

    f = File.new('t.dat', 'rb')
    f.external_encoding # => #<Encoding:ASCII-8BIT>
    f.internal_encoding # => nil
    f = File.new('t.dat', 'rb:UTF-16')
    f.external_encoding # => #<Encoding:UTF-16 (dummy)>
    f.internal_encoding # => nil
    f = File.new('t.dat', 'rb:UTF-16:UTF-16')
    f.external_encoding # => #<Encoding:UTF-16 (dummy)>
    f.internal_encoding # => #<Encoding:UTF-16>

The numerous encoding names are available in array Encoding.name_list:

    Encoding.name_list.size    # => 175
    Encoding.name_list.take(3) # => ["ASCII-8BIT", "UTF-8", "US-ASCII"]

## Encodings

When the external encoding is set, strings read are tagged by that
encoding when reading, and strings written are converted to that
encoding when writing.

When both external and internal encodings are set, strings read are
converted from external to internal encoding, and strings written are
converted from internal to external encoding. For further details about
transcoding input and output, see Encoding.

If the external encoding is `'BOM|UTF-8'`, `'BOM|UTF-16LE'` or
`'BOM|UTF16-BE'`, Ruby checks for a Unicode BOM in the input document to
help determine the encoding.  For UTF-16 encodings the file open mode
must be binary. If the BOM is found, it is stripped and the external
encoding from the BOM is used.

Note that the BOM-style encoding option is case insensitive, so
'bom|utf-8' is also valid.)

## Open Options

A number of IO methods accept an optional parameter `opts`, which
determines how a new stream is to be opened:

*   `:mode`: Stream mode.
*   `:flags`: Integer file open flags; If `mode` is also given, the two
    are bitwise-ORed.
*   `:external_encoding`: External encoding for the stream.
*   `:internal_encoding`: Internal encoding for the stream. `'-'` is a
    synonym for the default internal encoding. If the value is `nil` no
    conversion occurs.
*   `:encoding`: Specifies external and internal encodings as
    `'extern:intern'`.
*   `:textmode`: If a truthy value, specifies the mode as text-only,
    binary otherwise.
*   `:binmode`: If a truthy value, specifies the mode as binary,
    text-only otherwise.
*   `:autoclose`: If a truthy value, specifies that the `fd` will close
    when the stream closes; otherwise it remains open.


Also available are the options offered in String#encode, which may
control conversion between external internal encoding.

## Getline Options

A number of IO methods accept optional keyword arguments that determine
how a stream is to be treated:

*   `:chomp`: If `true`, line separators are omitted; default is 
    `false`.


## Position

An IO stream has a *position*, which is the non-negative integer offset
(in bytes) in the stream where the next read or write will occur.

Note that a text stream may have multi-byte characters, so a text stream
whose position is `n` (*bytes*) may not have `n` *characters* preceding
the current position -- there may be fewer.

A new stream is initially positioned:

*   At the beginning (position `0`) if its mode is `'r'`, `'w'`, or
    `'r+'`.
*   At the end (position `self.size`) if its mode is `'a'`, `'w+'`, or
    `'a+'`.


Methods to query the position:

*   IO#tell and its alias IO#pos return the position for an open stream.
*   IO#eof? and its alias IO#eof return whether the position is at the
    end of a readable stream.


Reading from a stream usually changes its position:

    f = File.open('t.txt')
    f.tell     # => 0
    f.readline # => "This is line one.\n"
    f.tell     # => 19
    f.readline # => "This is the second line.\n"
    f.tell     # => 45
    f.eof?     # => false
    f.readline # => "Here's the third line.\n"
    f.eof?     # => true

Writing to a stream usually changes its position:

    f = File.open('t.tmp', 'w')
    f.tell         # => 0
    f.write('foo') # => 3
    f.tell         # => 3
    f.write('bar') # => 3
    f.tell         # => 6

Iterating over a stream usually changes its position:

    f = File.open('t.txt')
    f.each do |line|
      p "position=#{f.pos} eof?=#{f.eof?} line=#{line}"
    end

Output:

    "position=19 eof?=false line=This is line one.\n"
    "position=45 eof?=false line=This is the second line.\n"
    "position=70 eof?=true line=This is the third line.\n"

The position may also be changed by certain other methods:

*   IO#pos= and IO#seek change the position to a specified offset.
*   IO#rewind changes the position to the beginning.


## Line Number

A readable IO stream has a *line* *number*, which is the non-negative
integer line number in the stream where the next read will occur.

A new stream is initially has line number `0`.

Method IO#lineno returns the line number.

Reading lines from a stream usually changes its line number:

    f = File.open('t.txt', 'r')
    f.lineno   # => 0
    f.readline # => "This is line one.\n"
    f.lineno   # => 1
    f.readline # => "This is the second line.\n"
    f.lineno   # => 2
    f.readline # => "Here's the third line.\n"
    f.lineno   # => 3
    f.eof?     # => true

Iterating over lines in a stream usually changes its line number:

    f = File.open('t.txt')
    f.each_line do |line|
      p "position=#{f.pos} eof?=#{f.eof?} line=#{line}"
    end

Output:

    "position=19 eof?=false line=This is line one.\n"
    "position=45 eof?=false line=This is the second line.\n"
    "position=70 eof?=true line=This is the third line.\n"

## What's Here

First, what's elsewhere. Class IO:

*   Inherits from [class
    Object](Object.html#class-Object-label-What-27s+Here).
*   Includes [module
    Enumerable](Enumerable.html#module-Enumerable-label-What-27s+Here),
    which provides dozens of additional methods.


Here, class IO provides methods that are useful for:

*   [Creating](#class-IO-label-Creating)
*   [Reading](#class-IO-label-Reading)
*   [Writing](#class-IO-label-Writing)
*   [Positioning](#class-IO-label-Positioning)
*   [Iterating](#class-IO-label-Iterating)
*   [Settings](#class-IO-label-Settings)
*   [Querying](#class-IO-label-Querying)
*   [Buffering](#class-IO-label-Buffering)
*   [Low-Level Access](#class-IO-label-Low-Level+Access)
*   [Other](#class-IO-label-Other)


### Creating

    ::new (aliased as ::for_fd)
:       Creates and returns a new IO object for the given integer file
        descriptor.

    ::open
:       Creates a new IO object.

    ::pipe
:       Creates a connected pair of reader and writer IO objects.

    ::popen
:       Creates an IO object to interact with a subprocess.

    ::select
:       Selects which given IO instances are ready for reading,

    writing, or have pending exceptions.


### Reading

    ::binread
:       Returns a binary string with all or a subset of bytes from the
        given file.

    ::read
:       Returns a string with all or a subset of bytes from the given
        file.

    ::readlines
:       Returns an array of strings, which are the lines from the given
        file.

    #getbyte
:       Returns the next 8-bit byte read from `self` as an integer.

    #getc
:       Returns the next character read from `self` as a string.

    #gets
:       Returns the line read from `self`.

    #pread
:       Returns all or the next *n* bytes read from `self`, not updating
        the receiver's offset.

    #read
:       Returns all remaining or the next *n* bytes read from `self` for
        a given *n*.

    #read_nonblock
:       the next *n* bytes read from `self` for a given *n*, in
        non-block mode.

    #readbyte
:       Returns the next byte read from `self`; same as #getbyte, but
        raises an exception on end-of-file.

    #readchar
:       Returns the next character read from `self`; same as #getc, but
        raises an exception on end-of-file.

    #readline
:       Returns the next line read from `self`; same as #getline, but
        raises an exception of end-of-file.

    #readlines
:       Returns an array of all lines read read from `self`.

    #readpartial
:       Returns up to the given number of bytes from `self`.



### Writing

    ::binwrite
:       Writes the given string to the file at the given filepath, in
        binary mode.

    ::write
:       Writes the given string to `self`.

    [:<<](#method-i-3C-3C)
:       Appends the given string to `self`.

    #print
:       Prints last read line or given objects to `self`.

    #printf
:       Writes to `self` based on the given format string and objects.

    #putc
:       Writes a character to `self`.

    #puts
:       Writes lines to `self`, making sure line ends with a newline.

    #pwrite
:       Writes the given string at the given offset, not updating the
        receiver's offset.

    #write
:       Writes one or more given strings to `self`.

    #write_nonblock
:       Writes one or more given strings to `self` in non-blocking mode.



### Positioning

    #lineno
:       Returns the current line number in `self`.

    #lineno=
:       Sets the line number is `self`.

    #pos (aliased as #tell)
:       Returns the current byte offset in `self`.

    #pos=
:       Sets the byte offset in `self`.

    #reopen
:       Reassociates `self` with a new or existing IO stream.

    #rewind
:       Positions `self` to the beginning of input.

    #seek
:       Sets the offset for `self` relative to given position.



### Iterating

    ::foreach
:       Yields each line of given file to the block.

    #each (aliased as #each_line)
:       Calls the given block with each successive line in `self`.

    #each_byte
:       Calls the given block with each successive byte in `self` as an
        integer.

    #each_char
:       Calls the given block with each successive character in `self`
        as a string.

    #each_codepoint
:       Calls the given block with each successive codepoint in `self`
        as an integer.



### Settings

    #autoclose=
:       Sets whether `self` auto-closes.

    #binmode
:       Sets `self` to binary mode.

    #close
:       Closes `self`.

    #close_on_exec=
:       Sets the close-on-exec flag.

    #close_read
:       Closes `self` for reading.

    #close_write
:       Closes `self` for writing.

    #set_encoding
:       Sets the encoding for `self`.

    #set_encoding_by_bom
:       Sets the encoding for `self`, based on its Unicode
        byte-order-mark.

    #sync=
:       Sets the sync-mode to the given value.



### Querying

    #autoclose?
:       Returns whether `self` auto-closes.

    #binmode?
:       Returns whether `self` is in binary mode.

    #close_on_exec?
:       Returns the close-on-exec flag for `self`.

    #closed?
:       Returns whether `self` is closed.

    #eof? (aliased as #eof)
:       Returns whether `self` is at end-of-file.

    #external_encoding
:       Returns the external encoding object for `self`.

    #fileno (aliased as #to_i)
:       Returns the integer file descriptor for `self`

    #internal_encoding
:       Returns the internal encoding object for `self`.

    #pid
:       Returns the process ID of a child process associated with
        `self`, if `self` was created by ::popen.

    #stat
:       Returns the File::Stat object containing status information for
        `self`.

    #sync
:       Returns whether `self` is in sync-mode.

    #tty (aliased as #isatty)
:       Returns whether `self` is a terminal.



### Buffering

    #fdatasync
:       Immediately writes all buffered data in `self` to disk.

    #flush
:       Flushes any buffered data within `self` to the underlying
        operating system.

    #fsync
:       Immediately writes all buffered data and attributes in `self` to
        disk.

    #ungetbyte
:       Prepends buffer for `self` with given integer byte or string.

    #ungetc
:       Prepends buffer for `self` with given string.



### Low-Level Access

    ::sysopen
:       Opens the file given by its path, returning the integer file
        descriptor.

    #advise
:       Announces the intention to access data from `self` in a specific
        way.

    #fcntl
:       Passes a low-level command to the file specified by the given
        file descriptor.

    #ioctl
:       Passes a low-level command to the device specified by the given
        file descriptor.

    #sysread
:       Returns up to the next *n* bytes read from self using a
        low-level read.

    #sysseek
:       Sets the offset for `self`.

    #syswrite
:       Writes the given string to `self` using a low-level write.



### Other

    ::copy_stream
:       Copies data from a source to a destination, each of which is a
        filepath or an IO-like object.

    ::try_convert
:       Returns a new IO object resulting from converting the given
        object.

    #inspect
:       Returns the string representation of `self`.



---
# Constants:

EWOULDBLOCKWaitReadable
:   EAGAINWaitReadable

EWOULDBLOCKWaitWritable
:   EAGAINWaitWritable

PRIORITY
:   [not documented]
READABLE
:   [not documented]
SEEK_CUR
:   Set I/O position from the current position

SEEK_DATA
:   Set I/O position to the next location containing data

SEEK_END
:   Set I/O position from the end

SEEK_HOLE
:   Set I/O position to the next hole

SEEK_SET
:   Set I/O position from the beginning

WRITABLE
:   [not documented]


# Class methods:

    binread
    binwrite
    console
    console_size
    copy_stream
    default_console_size
    for_fd
    foreach
    new
    open
    pipe
    popen
    read
    readlines
    select
    sysopen
    try_convert
    write

# Instance methods:

    <<
    advise
    autoclose=
    autoclose?
    beep
    binmode
    binmode?
    check_winsize_changed
    clear_screen
    close
    close_on_exec=
    close_on_exec?
    close_read
    close_write
    closed?
    console_mode
    console_mode=
    cooked
    cooked!
    cursor
    cursor=
    cursor_down
    cursor_left
    cursor_right
    cursor_up
    each
    each_byte
    each_char
    each_codepoint
    each_line
    echo=
    echo?
    eof
    eof?
    erase_line
    erase_screen
    expect
    external_encoding
    fcntl
    fdatasync
    fileno
    flush
    fsync
    getbyte
    getc
    getch
    getpass
    gets
    goto
    goto_column
    iflush
    inspect
    internal_encoding
    ioctl
    ioflush
    isatty
    lineno
    lineno=
    noecho
    nonblock
    nonblock=
    nonblock?
    nread
    oflush
    pathconf
    pid
    pos
    pos=
    pread
    pressed?
    print
    printf
    putc
    puts
    pwrite
    raw
    raw!
    read
    read_nonblock
    readbyte
    readchar
    readline
    readlines
    readpartial
    ready?
    reopen
    rewind
    scroll_backward
    scroll_forward
    seek
    set_encoding
    set_encoding_by_bom
    stat
    sync
    sync=
    sysread
    sysseek
    syswrite
    tell
    to_i
    to_io
    tty?
    ungetbyte
    ungetc
    wait
    wait_priority
    wait_readable
    wait_writable
    winsize
    winsize=
    write
    write_nonblock


      

This is MURDOC! A Ruby documentation browser inspired by Smalltalk-80. It allows you to learn about Ruby by browsing through its class hierarchies, and see any of its methods.