abstract class IO
- IO
- Reference
- Object
Overview
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.
Direct Known Subclasses
Defined in:
stdlib/copy_file_range.crClass Method Summary
- 
        .copy(src, dst, limit : Int) : Int64
        
          Copy at most limit bytes from src to dst. 
- 
        .copy(src, dst) : Int64
        
          Copy all contents from src to dst. 
Class Method Detail
Copy at most limit bytes from src to dst.
io = IO::Memory.new "hello"
io2 = IO::Memory.new
IO.copy io, io2, 3
io2.to_s # => "hel"Copy all contents from src to dst.
io = IO::Memory.new "hello"
io2 = IO::Memory.new
IO.copy io, io2
io2.to_s # => "hello"