class

IO

Inherits Reference < Object

The IO class is the basis for all input and output in Crystal.

This class is inherited by types like File, Socket and IO::Memory and provides many useful methods for reading from and writing to an IO, like print, puts, gets and printf.

The only requirement for a type including the IO module is to define these two methods:

  • read(slice : Bytes): read at most slice.size bytes from IO into slice and return the number of bytes read
  • write(slice : Bytes): write the whole slice into the IO

For example, this is a simple IO on top of a Bytes:

class SimpleSliceIO < IO
  def initialize(@slice : Bytes)
  end

  def read(slice : Bytes)
    slice.size.times { |i| slice[i] = @slice[i] }
    @slice += slice.size
    slice.size
  end

  def write(slice : Bytes) : Nil
    slice.size.times { |i| @slice[i] = slice[i] }
    @slice += slice.size
  end
end

slice = Slice.new(9) { |i| ('a'.ord + i).to_u8 }
String.new(slice) # => "abcdefghi"

io = SimpleSliceIO.new(slice)
io.gets(3) # => "abc"
io.print "xyz"
String.new(slice) # => "abcxyzghi"

Encoding

An IO can be set an encoding with the #set_encoding method. When this is set, all string operations (gets, gets_to_end, read_char, <<, print, puts printf) will write in the given encoding, and read from the given encoding. Byte operations (read, write, read_byte, write_byte, getb_to_end) never do encoding/decoding operations.

If an encoding is not set, the default one is UTF-8.

Mixing string and byte operations might not give correct results and should be avoided, as string operations might need to read extra bytes in order to get characters in the given encoding.

Instance methods

read_angle
Source
read_bool
Source
read_f32
Source
read_f64
Source
read_i16
Source
read_i32
Source
read_i64
Source
read_i8
Source
read_n_bytes(size : Int) : Bytes
Source
read_u16
Source
read_u32
Source
read_u64
Source
read_u8
Source
read_uuid
Source
read_var_int
Source
read_var_long
Source
read_var_string
Source
write_bool(i : Bool) : Nil
Source
write_f32(i : Float32) : Nil
Source
write_f64(i : Float64) : Nil
Source
write_i16(i : Int16) : Nil
Source
write_i32(i : Int32) : Nil
Source
write_i64(i : Int64) : Nil
Source
write_i8(i : Int8) : Nil
Source
write_u16(i : UInt16) : Nil
Source
write_u32(i : UInt32) : Nil
Source
write_u64(i : UInt64) : Nil
Source
write_u8(i : UInt8) : Nil
Source
write_var_int(value : Int32) : Nil
Source
write_var_int(value : UInt32) : Nil
Source
write_var_string(s : String) : Nil
Source

Nested types