IO とネットワーク
一般的な IO
Base.stdout
── 定数
Base.stderr
── 定数
Base.stdin
── 定数
Base.open
── 関数
open(f::Function, args...; kwargs....)
関数 f
を open(args...; kwargs...)
が返すファイル記述子に適用し、完了したらそのファイル記述子を閉じます。
例
julia> open("myfile.txt", "w") do io
write(io, "Hello world!")
end;
julia> open(f->read(f, String), "myfile.txt")
"Hello world!"
julia> rm("myfile.txt")
open(filename::AbstractString; lock = true, keywords...) -> IOStream
五つのキーワード引数で指定されるモードでファイルを開きます:
キーワード引数 | 説明 | デフォルト値 |
---|---|---|
read |
読み込みのために開く | !write |
write |
書き込みのために開く | truncate | append |
create |
ファイルが存在しなければ作成する | !read & write | truncate | append |
truncate |
サイズをゼロに切り捨てる | !read & write |
append |
末尾にシークする | false |
キーワード引数が一つも指定されないときのデフォルトは読み込み専用でファイルを開く処理です。開かれたファイルにアクセスするためのストリームを返します。
キーワード引数 lock
は安全なマルチスレッドアクセスのためにファイル操作をロックするかどうかを制御します。
キーワード引数 lock
は Julia 1.5 以降でサポートされます。
open(filename::AbstractString, [mode::AbstractString]; lock = true) -> IOStream
五つの真偽値ではなく文字列でオプションを指定するバージョンの open
です。mode
には fopen(3)
や Perl の open
で使われるのと同じ値を指定でき、次のように真偽値グループと対応します:
モード | 説明 | キーワード引数 |
---|---|---|
r |
読み込み | 無し |
w |
書き込み・作成・上書き | write = true |
a |
書き込み・作成・追記 | append = true |
r+ |
読み込み・書き込み | read = true, write = true |
w+ |
読み込み・書き込み・作成・上書き | truncate = true, read = true |
a+ |
読み込み・書き込み・作成・追記 | append = true, read = true |
キーワード引数 lock
は安全なマルチスレッドアクセスのためにファイル操作をロックするかどうかを制御します。
例
julia> io = open("myfile.txt", "w");
julia> write(io, "Hello world!");
julia> close(io);
julia> io = open("myfile.txt", "r");
julia> read(io, String)
"Hello world!"
julia> write(io, "This file is read only")
ERROR: ArgumentError: write failed, IOStream is not writeable
[...]
julia> close(io)
julia> io = open("myfile.txt", "a");
julia> write(io, "This stream is not read only")
28
julia> close(io)
julia> rm("myfile.txt")
キーワード引数 lock
は Julia 1.5 以降でサポートされます。
open(fd::OS_HANDLE) -> IO
生のファイル記述子を受け取り、それを Julia が認識できる IO 型にラップしたものを返します。そのときハンドル fd
の所有権は Julia に移ります。元のハンドルの所有権を手放したくない場合には open(Libc.dup(fd))
を使ってください。
システムの他の部分が所有しているハンドルに対してこのメソッドを呼び出してはいけません。
open(command, mode::AbstractString, stdio=devnull)
command
を非同期的に実行します。open(command, stdio; read, write)
と同様ですが、読み込みと書き込みのフラグをキーワード引数ではなくモード文字列で表す点が異なります。指定できるモード文字列とその意味は次の通りです:
モード | 説明 | キーワード引数 |
---|---|---|
r |
読み込み | 無し |
w |
書き込み | write = true |
r+ |
読み込み・書き込み | read = true, write = true |
w+ |
読み込み・書き込み | read = true, write = true |
open(command, stdio=devnull; write::Bool = false, read::Bool = !write)
command
の実行を非同期に開始し、process::IO
オブジェクトを返します。read
が true
なら新しいプロセスの標準出力に書き込まれたデータを process
オブジェクトから読み込めるようになり、省略可能引数 stdio
は新しいプロセスの標準入力ストリームとなります。write
が true
なら process
オブジェクトを通して新しいプロセスの標準入力に書き込めるようになり、省略可能引数 stdio
は新しいプロセスの標準出力ストリームとなります。プロセスの標準エラーストリームは現在のグローバル変数 stderr
に接続されます。
open(f::Function, command, args...; kwargs...)
open(command, args...; kwargs...)
と同じ処理を行い、返り値のストリームに対して f
を適用し、関数が返ったら入力ストリームを閉じてプロセスの完了を待ちます。f
が返す値を返します。
Base.IOStream
── 型
Base.IOBuffer
── 型
IOBuffer([data::AbstractVector{UInt8}]; keywords...) -> IOBuffer
インメモリの IO ストリームを作成します。既存の配列を使うこともできます。
省略可能なキーワード引数は次の通りです:
-
read
,write
,append
: バッファに対して行える操作を制限します。詳細はopen
を参照してください。 truncate
: バッファを長さゼロに切り捨ててから使います。maxsize
: バッファの最大サイズを指定します。バッファはこのサイズより大きくなることができません。sizehint
: バッファの容量を提案します (data
はsizehint!(data, size)
を実装している必要があります)。
data
が与えられないと、バッファはデフォルトで読み込み可能かつ書き込み可能となります。
例
julia> io = IOBuffer();
julia> write(io, "JuliaLang is a GitHub organization.", " It has many members.")
56
julia> String(take!(io))
"JuliaLang is a GitHub organization. It has many members."
julia> io = IOBuffer(b"JuliaLang is a GitHub organization.")
IOBuffer(data=UInt8[...], readable=true, writable=false, seekable=true, append=false, size=35, maxsize=Inf, ptr=1, mark=-1)
julia> read(io, String)
"JuliaLang is a GitHub organization."
julia> write(io, "This isn't writable.")
ERROR: ArgumentError: ensureroom failed, IOBuffer is not writeable
julia> io = IOBuffer(UInt8[], read=true, write=true, maxsize=34)
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=34, ptr=1, mark=-1)
julia> write(io, "JuliaLang is a GitHub organization.")
34
julia> String(take!(io))
"JuliaLang is a GitHub organization"
julia> length(read(IOBuffer(b"data", read=true, truncate=false)))
4
julia> length(read(IOBuffer(b"data", read=true, truncate=true)))
0
IOBuffer(string::String)
指定された文字列 string
から読み込み専用の IOBuffer
を作成します。
例
julia> io = IOBuffer("Haho");
julia> String(take!(io))
"Haho"
julia> String(take!(io))
"Haho"
Base.take!
── メソッド
take!(b::IOBuffer)
IOBuffer
の内容を配列として取得します。コピーは起きません。この関数を実行した IOBuffer
は初期状態にリセットされます。
例
julia> io = IOBuffer();
julia> write(io, "JuliaLang is a GitHub organization.", " It has many members.")
56
julia> String(take!(io))
"JuliaLang is a GitHub organization. It has many members."
Base.fdio
── 関数
Base.flush
── 関数
Base.close
── 関数
Base.write
── 関数
write(io::IO, x)
write(filename::AbstractString, x)
値の正準バイナリ表現を指定された IO ストリームもしくはファイルに書き込みます。ストリームに書き込まれたデータのバイト数を返します。テキスト表現を書き込む場合は print
を使ってください (print
では書き込まれる形式が io
によって変わります)。
書き込まれる値のエンディアンはホストシステムのエンディアンによって決まります。プラットフォーム間で一貫した結果を保証するには、書き込み/読み込み時に (htol
や ltoh
などで) 固定されたエンディアンへの変換を行ってください。
一度の write
の呼び出しで複数の値を書き込むことができます。つまり次の二つは等価です:
write(io, x, y...)
write(io, x) + write(io, y...)
例
一貫したシリアライズの例を示します:
julia> fname = tempname(); # ランダムな一時ファイルの名前を取得する。
julia> open(fname,"w") do f
# 64 ビットの整数をリトルエンディアンのバイトオーダーで書き込む。
write(f,htol(Int64(42)))
end
8
julia> open(fname,"r") do f
# ホストのバイトオーダーで読み込み、ホストの整数型に変換する。
Int(ltoh(read(f,Int64)))
end
42
一度の呼び出しで複数の値を書き込む例を示します:
julia> io = IOBuffer();
julia> write(io, "JuliaLang is a GitHub organization.", " It has many members.")
56
julia> String(take!(io))
"JuliaLang is a GitHub organization. It has many members."
julia> write(io, "Sometimes those members") + write(io, " write documentation.")
44
julia> String(take!(io))
"Sometimes those members write documentation."
ユーザー定義のプレーンデータは、write
メソッドを持たなくても Ref
で包めば書き込めます:
julia> struct MyStruct; x::Float64; end
julia> io = IOBuffer()
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)
julia> write(io, Ref(MyStruct(42.0)))
8
julia> seekstart(io); read!(io, Ref(MyStruct(NaN)))
Base.RefValue{MyStruct}(MyStruct(42.0))
Base.read
── 関数
read(io::IO, T)
型 T
の値を io
から一つ読みます。値は正準バイナリ表現として読み込まれます。
Julia はエンディアンの変換を行わないことに注意してください。エンディアンの変換には ntoh
または ltoh
が利用できます。
read(io::IO, String)
io
からデータを全て読み、String
として返します。
例
julia> io = IOBuffer("JuliaLang is a GitHub organization");
julia> read(io, Char)
'J': ASCII/Unicode U+004A (category Lu: Letter, uppercase)
julia> io = IOBuffer("JuliaLang is a GitHub organization");
julia> read(io, String)
"JuliaLang is a GitHub organization"
read(filename::AbstractString, args...)
ファイルを開き、その内容を読みます。args
は read
に渡されます。この関数は open(io->read(io, args...), filename)
と等価です。
read(filename::AbstractString, String)
ファイルのデータを全て読み、文字列として返します。
read(s::IOStream, nb::Integer; all=true)
s
から最大で nb
バイトを読み、結果を読んだバイト数と等しい長さの Vector{UInt8}
として返します。
all
が true
(デフォルト値) だと、この関数は要求されたバイト数を読むまで (もしくはエラーまたは EOF が発生するまで) 何度も読み込みを行い、その間ブロックします。all
が false
なら read
は一度だけ呼ばれ、返るデータの量はデバイス依存となります。なお全てのストリーム型が all
オプションをサポートするわけではありません。
Base.read!
── 関数
read!(stream::IO, array::AbstractArray)
read!(filename::AbstractString, array::AbstractArray)
IO ストリームあるいはファイルからバイナリデータを読み、array
に保存します。
Base.readbytes!
── 関数
readbytes!(stream::IO, b::AbstractVector{UInt8}, nb=length(b))
stream
から最大 nb
バイトを b
に読み込み、読み込んだバイト数を返します。b
のサイズは必要なら (つまり nb
が length(b)
より大きいとき) 大きくなりますが、小さくなることはありません。
readbytes!(stream::IOStream, b::AbstractVector{UInt8}, nb=length(b); all::Bool=true)
stream
から最大 nb
バイトを b
に読み込み、読み込んだバイト数を返します。b
のサイズは必要なら (つまり nb
が length(b)
より大きいとき) 大きくなりますが、小さくなることはありません。
all
が true
(デフォルト値) だと、この関数は要求されたバイト数を読むまで (もしくはエラーまたは EOF が発生するまで) 何度も読み込みを行い、その間ブロックします。all
が false
なら read
は一度だけ呼ばれ、返るデータの量はデバイス依存となります。なお全てのストリーム型が all
オプションをサポートするわけではありません。
Base.unsafe_read
── 関数
unsafe_read(io::IO, ref, nbytes::UInt)
ストリームオブジェクト IO
から ref
(をポインタに変換した場所) へ nbytes
バイトのデータをコピーします。
部分型 T <: IO
では unsafe_read(s::T, p::Ptr{UInt8}, n::UInt)
というシグネチャを持つメソッドをオーバーライドして高速な実装を提供することが推奨されます。
Base.unsafe_write
── 関数
unsafe_write(io::IO, ref, nbytes::UInt)
ref
(をポインタに変換した場所) からストリームオブジェクト IO
へ nbytes
バイトのデータをコピーします。
部分型 T <: IO
では unsafe_write(s::T, p::Ptr{UInt8}, n::UInt)
というシグネチャを持つメソッドをオーバーライドして高速な実装を提供することが推奨されます。
Base.peek
── 関数
peek(stream[, T=UInt8])
ストリームから T
型の値を一つ読んで返します。ただしそのときストリームの現在位置を動かしません。
例
julia> b = IOBuffer("julia");
julia> peek(b)
0x6a
julia> position(b)
0
julia> peek(b, Char)
'j': ASCII/Unicode U+006A (category Ll: Letter, lowercase)
peek
の引数 T
は Julia 1.5 以降でサポートされます。
Base.position
── 関数
position(s)
ストリームの現在位置を取得します。
例
julia> io = IOBuffer("JuliaLang is a GitHub organization.");
julia> seek(io, 5);
julia> position(io)
5
julia> skip(io, 10);
julia> position(io)
15
julia> seekend(io);
julia> position(io)
35
Base.seek
── 関数
seek(s, pos)
与えられた位置にストリームをシークします。
例
julia> io = IOBuffer("JuliaLang is a GitHub organization.");
julia> seek(io, 5);
julia> read(io, Char)
'L': ASCII/Unicode U+004C (category Lu: Letter, uppercase)
Base.seekstart
── 関数
seekstart(s)
ストリームを先頭にシークします。
例
julia> io = IOBuffer("JuliaLang is a GitHub organization.");
julia> seek(io, 5);
julia> read(io, Char)
'L': ASCII/Unicode U+004C (category Lu: Letter, uppercase)
julia> seekstart(io);
julia> read(io, Char)
'J': ASCII/Unicode U+004A (category Lu: Letter, uppercase)
Base.seekend
── 関数
Base.skip
── 関数
skip(s, offset)
ストリームを現在位置からの相対位置にシークします。
例
julia> io = IOBuffer("JuliaLang is a GitHub organization.");
julia> seek(io, 5);
julia> skip(io, 10);
julia> read(io, Char)
'G': ASCII/Unicode U+0047 (category Lu: Letter, uppercase)
Base.mark
── 関数
Base.unmark
── 関数
Base.reset
── 関数
Base.ismarked
── 関数
Base.eof
── 関数
eof(stream) -> Bool
IO ストリームがファイル終端 (EOF) を指すかどうかを判定します。ストリームを使い切っていないなら、データが利用可能になるのを必要なら待った上で false
を返します。そのため、eof
が false
返したときはストリームから一バイトを安全に読み込むことができます。stream
の内部バッファにデータが残っている限り、たとえその時点で接続のリモート終端が閉じられていたとしても、eof
は false
を返します。
Base.isreadonly
── 関数
isreadonly(io) -> Bool
ストリームが読み込み専用かどうかを判定します。
例
julia> io = IOBuffer("JuliaLang is a GitHub organization");
julia> isreadonly(io)
true
julia> io = IOBuffer();
julia> isreadonly(io)
false
Base.iswritable
── 関数
iswritable(io) -> Bool
IO オブジェクトが書き込み可能 (であることが判定できる) なら true
を返します。
例
julia> open("myfile.txt", "w") do io
print(io, "Hello world!");
iswritable(io)
end
true
julia> open("myfile.txt", "r") do io
iswritable(io)
end
false
julia> rm("myfile.txt")
Base.isreadable
── 関数
isreadable(io) -> Bool
IO オブジェクトが読み込み可能 (であることが判定できる) なら true
を返します。
例
julia> open("myfile.txt", "w") do io
print(io, "Hello world!");
isreadable(io)
end
false
julia> open("myfile.txt", "r") do io
isreadable(io)
end
true
julia> rm("myfile.txt")
Base.isopen
── 関数
isopen(object) -> Bool
ストリームやタイマーのようなオブジェクトが閉じられていないかどうかを判定します。一度閉じられたオブジェクトは二度と新しいイベントを生成しません。ただし閉じられたストリームのバッファに読み込めるデータが残っている可能性があるので、データが読み込めるかどうかの判定には eof
を使うべきです。ストリームが書き込みあるいは読み込み可能になった (可能性がある) ときに通知を受け取るには FileWatching
パッケージを使ってください。
例
julia> io = open("my_file.txt", "w+");
julia> isopen(io)
true
julia> close(io)
julia> isopen(io)
false
Base.fd
── 関数
fd(stream)
ストリームあるいはファイルのファイル記述子を返します。この関数は同期的な File
および IOStream
にだけ適用でき、非同期的なストリームには適用できないことに注意してください。
Base.redirect_stdout
── 関数
Base.redirect_stdout
── メソッド
Base.redirect_stderr
── 関数
redirect_stderr([stream]) -> (rd, wr)
redirect_stdout
と同様の処理を stderr
に対して行います。
stream
は TTY
・Pipe
・ソケットのいずれかである必要があります。
Base.redirect_stderr
── メソッド
Base.redirect_stdin
── 関数
redirect_stdin([stream]) -> (rd, wr)
redirect_stdout
と同様の処理を stdin
に対して行います。返り値の順序は (rd, wr)
で変わらないことに注意してください。つまり stdin
から読まれるべきデータを wr
に書き込みます。
stream
は TTY
・Pipe
・ソケットのいずれかである必要があります。
Base.redirect_stdin
── メソッド
Base.readchomp
── 関数
readchomp(x)
x
が持つ全てのデータを文字列として読み、最後に改行があればそれを一つだけ削除して返します。chomp(read(x, String))
と等価です。
例
julia> open("my_file.txt", "w") do io
write(io, "JuliaLang is a GitHub organization.\nIt has many members.\n");
end;
julia> readchomp("my_file.txt")
"JuliaLang is a GitHub organization.\nIt has many members."
julia> rm("my_file.txt");
Base.truncate
── 関数
truncate(file, n)
第一引数 file
が示すファイルまたはバッファのサイズをちょうど n
バイトに変更します。ファイルまたはバッファが大きくなる場合には、新しい空間を '\0'
で埋めます。
例
julia> io = IOBuffer();
julia> write(io, "JuliaLang is a GitHub organization.")
35
julia> truncate(io, 15)
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=15, maxsize=Inf, ptr=16, mark=-1)
julia> String(take!(io))
"JuliaLang is a "
julia> io = IOBuffer();
julia> write(io, "JuliaLang is a GitHub organization.");
julia> truncate(io, 40);
julia> String(take!(io))
"JuliaLang is a GitHub organization.\0\0\0\0\0"
Base.skipchars
── 関数
skipchars(predicate, io::IO; linecomment=nothing)
次に読む文字が predicate
に対して false
を返す文字となるまでストリーム io
を進めます。キーワード引数 linecomment
を指定すると、その文字から次の改行までの全ての文字が無視されます。
例
julia> buf = IOBuffer(" text")
IOBuffer(data=UInt8[...], readable=true, writable=false, seekable=true, append=false, size=8, maxsize=Inf, ptr=1, mark=-1)
julia> skipchars(isspace, buf)
IOBuffer(data=UInt8[...], readable=true, writable=false, seekable=true, append=false, size=8, maxsize=Inf, ptr=5, mark=-1)
julia> String(readavailable(buf))
"text"
Base.countlines
── 関数
countlines(io::IO; eol::AbstractChar = '\n')
ストリームまたはファイルの終端まで io
を読み、行数を計算します。第一引数にファイル名を渡せばその名前のファイルを処理できます。'\n'
以外の改行マーカーを使う場合は第二引数に指定します。io
の最後の空でない行は改行マーカーで終わらなくとも行としてカウントされます。このため countlines
の返り値は eachline
や readlines
の返り値の長さと一致します。
例
julia> io = IOBuffer("JuliaLang is a GitHub organization.\n");
julia> countlines(io)
1
julia> io = IOBuffer("JuliaLang is a GitHub organization.");
julia> countlines(io)
1
julia> countlines(io, eol = '.')
0
Base.PipeBuffer
── 関数
Base.readavailable
── 関数
readavailable(stream)
ストリームで利用可能なデータを全て読み込みます。利用可能なデータが存在しなければ、そのときに限ってブロックします。返り値は Vector{UInt8}
です。
Base.IOContext
── 型
Base.IOContext
── メソッド
IOContext(io::IO, KV::Pair...)
与えられたストリームを包む IOContext
を、与えられた key=>value
の組をストリームのプロパティに追加した状態で作成します (io
自身が IOContext
であっても構いません)。
- 特定のプロパティの組が
io
に含まれるかどうかを判定するには(key => value) in io
を使ってください。 - 特定のキーに対する最も新しい値を取得するには
get(io, key, default)
を使ってください。
次のプロパティがよく使われます:
:compact
: 値をコンパクトに (例えば数値は少ない桁数で) 出力すべきかどうかを指定する真偽値です。このプロパティは配列の要素を出力するときに設定されます。:compact
な出力は改行を含まないものとされます。:limit
: コンテナを切り捨てる (例えば多数ある配列の要素を…
とする) べきかどうかを指定する真偽値です。-
:displaysize
: テキスト出力の表示範囲の行数と列数を与えるTuple{Int,Int}
型の値です。この値は別の関数を呼び出すときに表示範囲のサイズを上書きするためにも利用できます。スクリーンサイズはdisplaysize
関数で取得します。 :typeinfo
: 既に出力された型情報を表すType
型の値であり、現在処理中のオブジェクトの出力はこの情報を元に適切に短縮されます。このプロパティを使うと同じ型を持つオブジェクトのコレクション表示で冗長な型情報を避けられるので有用です。例えば[Float16(0)]
は"Float16[Float16(0.0)]"
ではなく"Float16[0.0]"
と表示できます: そうするには、配列の要素を表示している間:typeinfo
プロパティをFloat16
に設定します。:color
: ANSI カラーコードおよびエスケープコードがサポートされる/期待されるかどうかを指定する真偽値です。デフォルトではjulia
が起動されたときにコマンドライン引数--color
が付いていたかどうか、そしてio
が互換性のあるターミナルかどうかで判定されます。
例
julia> io = IOBuffer();
julia> printstyled(IOContext(io, :color => true), "string", color=:red)
julia> String(take!(io))
"\e[31mstring\e[39m"
julia> printstyled(io, "string", color=:red)
julia> String(take!(io))
"string"
julia> print(IOContext(stdout, :compact => false), 1.12341234)
1.12341234
julia> print(IOContext(stdout, :compact => true), 1.12341234)
1.12341
julia> function f(io::IO)
if get(io, :short, false)
print(io, "short")
else
print(io, "loooooong")
end
end
f (generic function with 1 method)
julia> f(stdout)
loooooong
julia> f(IOContext(stdout, :short => true))
short
Base.IOContext
── メソッド
テキスト IO
Base.show
── メソッド
show([io::IO = stdout], x)
値 x
のテキスト表現を出力ストリーム io
に書き込みます。新しい型 T
は show(io::IO, x::T)
をオーバーロードするべきです。show
が生成するテキスト表現は一般に Julia 特有のフォーマットと型情報を持ち、可能ならば Julia コードとしてパースできるべきとされます。
repr
は show
の結果を文字列として返します。
T
型のオブジェクトの人間が読むためのテキスト出力をカスタマイズするには、二引数の show(io::IO, x::T)
ではなく三引数の show(io::IO, ::MIME"text/plain", ::T)
を定義してください。::MIME"text/plain"
を受け取るメソッドでは IOContext
の io
が持つ :compact
プロパティを確認することが推奨されます。コンテナ型が要素を出力するときは :compact => true
としてこのメソッドを呼び出される可能性があるためです。
装飾されていない表現を書き込む print
も参照してください。
例
julia> show("Hello World!")
"Hello World!"
julia> print("Hello World!")
Hello World!
Base.summary
── 関数
summary(io::IO, x)
str = summary(x)
値 x
の簡単な説明をストリーム io
に出力するか、文字列として返します。デフォルトでは "Int64"
のように string(typeof(x))
で得られる文字列を返します。
配列に対しては 10-element Array{Int64,1}
のようにサイズと型の情報からなる文字列を返します。
例
julia> summary(1)
"Int64"
julia> summary(zeros(2))
"2-element Array{Float64,1}"
Base.print
── 関数
print([io::IO], xs...)
正準な (装飾されていない) テキスト表現を io
に (io
が与えられなければ stdout
に) 書き込みます。print
が生成するテキスト表現はフォーマットを最小限にして、Julia 特有の詳細を追加するのを避けるべきです。
print
は show
にフォールバックします。そのため多くの型では show
を定義すれば十分です。もし考えている型が "プレーンな" 表現を持つなら print
を定義してください。例えば show
はクオートした文字列を表示しますが、print
はクオートせずに文字列を表示します。
string
は print
の出力を文字列として返します。
例
julia> print("Hello World!")
Hello World!
julia> io = IOBuffer();
julia> print(io, "Hello", ' ', :World!)
julia> String(take!(io))
"Hello World!"
Base.println
── 関数
Base.printstyled
── 関数
printstyled([io], xs...; bold::Bool=false, color::Union{Symbol,Int}=:normal)
シンボルまたは整数で指定される色を使って xs
の各要素を出力します。出力は太字にもできます。
color
に指定できるシンボルの値は :normal
, :default
, :bold
, :black
, :blink
, :blue
, :cyan
, :green
, :hidden
, :light_black
, :light_blue
, :light_cyan
, :light_green
, :light_magenta
, :light_red
, :light_yellow
, :magenta
, :nothing
, :red
, :reverse
, :underline
, :white
, :yellow
で、整数の値は 0
から 255
(境界含む) です。256 色の全てをサポートしないターミナルもあるので注意してください。キーワード引数 bold
が true
だと、出力は太字で表示されます。
Base.sprint
── 関数
sprint(f::Function, args...; context=nothing, sizehint=0)
関数 f
を IO ストリームと args
を引数として呼び出します。f
に渡される IO へ書き込まれたデータを文字列として返します。省略可能なキーワード引数 context
に指定できるのは
- 組
:key=>value
IO
オブジェクト-
IOContext
オブジェクト
のいずれかであり、:key=>value
という属性 (あるいは io
に含まれる属性) が f
に渡される IO ストリームで使われます。sizehint
は文字列を書き込むときに使われるバッファの容量を提案します (単位はバイト)。
例
julia> sprint(show, 66.66666; context=:compact => true)
"66.6667"
julia> sprint(showerror, BoundsError([1], 100))
"BoundsError: attempt to access 1-element Array{Int64,1} at index [100]"
Base.showerror
── 関数
showerror(io, e)
例外オブジェクト e
を説明する表現を表示します。このメソッドは throw
が呼ばれた後に例外を表示するために使われます。
例
julia> struct MyException <: Exception
msg::AbstractString
end
julia> function Base.showerror(io::IO, err::MyException)
print(io, "MyException: ")
print(io, err.msg)
end
julia> err = MyException("test exception")
MyException("test exception")
julia> sprint(showerror, err)
"MyException: test exception"
julia> throw(MyException("test exception"))
ERROR: MyException: test exception
Base.dump
── 関数
dump(x; maxdepth=8)
値の表現を省略せずに表示します。出力は深さ maxdepth
で打ち切られます。
例
julia> struct MyStruct
x
y
end
julia> x = MyStruct(1, (2,3));
julia> dump(x)
MyStruct
x: Int64 1
y: Tuple{Int64,Int64}
1: Int64 2
2: Int64 3
julia> dump(x; maxdepth = 1)
MyStruct
x: Int64 1
y: Tuple{Int64,Int64}
Base.Meta.@dump
── マクロ
Base.readline
── 関数
readline(io::IO=stdin; keep::Bool=false)
readline(filename::AbstractString; keep::Bool=false)
指定された IO ストリームあるいはファイルから一行のテキストを読みます。ファイルまたはストリームが指定されないときのデフォルト値は stdin
です。ファイルから読み込まれるテキストは UTF-8 でエンコードされると仮定されます。入力に含まれる '\n'
, "\r\n"
, EOF が行の終わりを表します。keep
が false
(デフォルト値) だと、行末の改行を削除して返します。keep
が true
だと、改行も行の一部として返ります。
例
julia> open("my_file.txt", "w") do io
write(io, "JuliaLang is a GitHub organization.\nIt has many members.\n");
end
57
julia> readline("my_file.txt")
"JuliaLang is a GitHub organization."
julia> readline("my_file.txt", keep=true)
"JuliaLang is a GitHub organization.\n"
julia> rm("my_file.txt")
Base.readuntil
── 関数
readuntil(stream::IO, delim; keep::Bool = false)
readuntil(filename::AbstractString, delim; keep::Bool = false)
IO ストリームまたはファイルから指定された区切り文字まで文字列を読みます。区切り文字に指定できるのは UInt8
/AbstractChar
/文字列/ベクトルです。キーワード引数 keep
は区切り文字を返り値に含めるかどうかを制御します。テキストは UTF-8 でエンコードされると仮定されます。
例
julia> open("my_file.txt", "w") do io
write(io, "JuliaLang is a GitHub organization.\nIt has many members.\n");
end
57
julia> readuntil("my_file.txt", 'L')
"Julia"
julia> readuntil("my_file.txt", '.', keep = true)
"JuliaLang is a GitHub organization."
julia> rm("my_file.txt")
Base.readlines
── 関数
readlines(io::IO=stdin; keep::Bool=false)
readlines(filename::AbstractString; keep::Bool=false)
IO ストリームあるいはファイルの全ての行からなる文字列のベクトルを返します。これは readline
を同じ引数で何度も呼び出し、結果を文字列のベクトルに格納し、結果を返すのと等価です。
例
julia> open("my_file.txt", "w") do io
write(io, "JuliaLang is a GitHub organization.\nIt has many members.\n");
end
57
julia> readlines("my_file.txt")
2-element Array{String,1}:
"JuliaLang is a GitHub organization."
"It has many members."
julia> readlines("my_file.txt", keep=true)
2-element Array{String,1}:
"JuliaLang is a GitHub organization.\n"
"It has many members.\n"
julia> rm("my_file.txt")
Base.eachline
── 関数
eachline(io::IO=stdin; keep::Bool=false)
eachline(filename::AbstractString; keep::Bool=false)
IO ストリームあるいはファイルを読んで各行を生成する EachLine
型の反復可能オブジェクトを作成します。反復すると readline
が同じストリームに対して呼び出され、そのとき行末を保持するかどうかを示す keep
引数も渡されます。ファイル名を指定して eachline
を呼び出すと、ファイルは反復の最初で開かれ、最後の反復で閉じられます。反復が中断されると、ファイルは EachLine
オブジェクトがガベージコレクトされるときに閉じられます。
例
julia> open("my_file.txt", "w") do io
write(io, "JuliaLang is a GitHub organization.\n It has many members.\n");
end;
julia> for line in eachline("my_file.txt")
print(line)
end
JuliaLang is a GitHub organization. It has many members.
julia> rm("my_file.txt");
Base.displaysize
── 関数
displaysize([io::IO]) -> (lines, columns)
IO
オブジェクトに出力するときに使うべきスクリーンサイズを返します。入力が与えられないと、環境変数 LINES
と COLUMNS
を返します。 もしこの二つの環境変数が定義されていないと、デフォルトのサイズ (24, 80)
が返ります。
例
julia> withenv("LINES" => 30, "COLUMNS" => 100) do
displaysize()
end
(30, 100)
TTY のサイズを取得するには次のようにしてください:
julia> displaysize(stdout)
(34, 147)
マルチメディア IO
テキスト形式の出力を行うのは print
であり、ユーザー定義型のテキスト表現は show
をオーバーロードすることで指定します。これと同様に、Julia はリッチなマルチメディア出力 (例えば画像や整形されたテキストから、音声や動画まで) を行うための標準化されたメカニズムを持ちます。このメカニズムは次の三つの部分からなります:
-
display(x)
は Julia オブジェクトx
に対して利用可能なマルチメディアディスプレイの中で最もリッチなものを利用します (フォールバックはプレーンテキストです)。 -
show
をオーバーロードすると、ユーザー定義型の (標準の MIME 型をキーとする) マルチメディア表現を自由に指定できます。 - マルチメディアに対応したディスプレイバックエンドを登録するには、それを表す型を汎用的な
AbstractDisplay
型の部分型として定義した上でpushdisplay
を使って表示バックエンドのスタックにプッシュします。
基礎的な Julia ランタイムはプレーンテキストのディスプレイだけを提供しますが、外部モジュールを読み込んだりグラフィカルな Julia 環境 (IPython ベースの IJulia ノートブックなど) を使ったりすればリッチなディスプレイを有効にできます。
Base.Multimedia.AbstractDisplay
── 型
Base.Multimedia.display
── 関数
display(x)
display(d::AbstractDisplay, x)
display(mime, x)
display(d::AbstractDisplay, mime, x)
ディスプレイスタックを上から順に調べ、最初に見つかった x
に適用可能なディスプレイを使って x
を表示します。通常は x
をサポートする最もリッチなマルチメディアディスプレイが使われ、プレーンテキストを stdout
に出力するディスプレイがフォールバックとなります。display(d, x)
の形式は指定されたディスプレイ d
だけを使って x
の表示を試み、d
が x
の型を表示できなければ MethodError
を送出します。
print(x)
や show(x)
と異なり、一般に display
の出力が stdout
に向かうことを仮定してはいけません。例えば display(x)
が異なるウィンドウで画像を開くこともあります。display(x)
は「現在の出力デバイスで可能な最も優れた方法で x
を表示せよ」を意味します。REPL と同じような stdout
に向かうテキスト出力を期待するなら、show(stdout, "text/plain", x)
を使ってください。
"image/png"
のような MIME タイプを表す文字列 mime
を引数に受け取る後ろの二つの形式では、指定された MIME タイプを使った x
の出力だけが試されます。指定した MIME タイプがディスプレイあるいは x
によって定義されていなければ MethodError
が送出されます。これらの形式を使うときは、指定した MIME タイプの "生の" データを指定することもできます。つまり text/html
や application/postscript
のようなテキストベースの格納形式を持つ MIME タイプでは x::AbstractString
を渡すことができ、バイナリの MIME タイプでは x::Vector{UInt8}
として渡すことができます。
マニュアルの独自型の出力の整形の節で説明されている通り、型のインスタンスの表示をカスタマイズするときは、display
ではなく show
をオーバーロードするべきです。
Base.Multimedia.redisplay
── 関数
redisplay(x)
redisplay(d::AbstractDisplay, x)
redisplay(mime, x)
redisplay(d::AbstractDisplay, mime, x)
デフォルトでは、redisplay
は display
を呼ぶだけです。ただし、ディスプレイバックエンドは redisplay
をオーバーライドして x
に対する既存の表示方法を変更できます。また redisplay
の利用は、x
が複数回表示される可能性があることをバックエンドに伝えるヒントでもあります。この場合バックエンドは表示を (例えば次の対話プロンプトまで) 遅らせることができます。
Base.Multimedia.displayable
── 関数
displayable(mime) -> Bool
displayable(d::AbstractDisplay, mime) -> Bool
文字列 mime
が表す MIME タイプが表示可能かどうかを示す真偽値を返します。一つ目の形式ではディスプレイスタックにあるディスプレイのどれかで表示可能かどうかが、二つ目の形式ではディスプレイ d
で表示可能かどうかが判定されます。
Base.show
── メソッド
show(io::IO, mime, x)
display
関数がオブジェクト x
を MIME タイプ mime
でストリーム io
(たいていはメモリバッファ) に書き込むとき、表示が可能な場合に最終的に呼ばれるのが show
関数です。ユーザー定義型にリッチなマルチメディア表現を追加するときは、T
型に対する新しい show
メソッドだけを追加すれば十分です: MIME タイプ mime
に対して show(io, ::MIME"mime", x::T) = ...
を定義して、x
の mime
における表現を write
といった関数で io
に書き込んでください (MIME"..."
を使った記法はリテラル文字列だけをサポートする点に注意が必要です。MIME
型の値を柔軟に構築するには MIME{Symbol("...")}
を使ってください)。
例えば独自型 MyImage
が定義されていて、それを PNG ファイルとして書き出す方法を知っているとします。このとき show(io, ::MIME"image/png", x::MyImage) = ...
を定義すれば、その型が表す画像を PNG に対応した AbstractDisplay
(例えば IJulia) で表示できるようになります。なお Julia 組み込みの他の関数と同じように、show
に新しいメソッドを追加するときは import Base.show
が必要です。
細かいことを言っておくと、MIME"mime"
マクロは与えられた文字列 mime
を表すシングルトン型を定義します。これと Julia ディスパッチ機構により、指定された型オブジェクトの表示方法の選択が可能になります。
デフォルトの MIME タイプは MIME"text/plain"
です。text/plain
に対しては二引数の show
を呼び出すフォールバックが定義されているので、メソッドの追加が必ず必要というわけではありません。ただし、人間が読むための通常とは異なる出力を考えている型 T
に追加できるなら、show(::IO, ::MIME"text/plain", ::T)
を定義するべきです。例えば Day
型の値 Day(1)
を MIME タイプ text/plain
で出力すると 1 day
となるのに対して、二引数の show
で出力すると Day(1)
となります。
一般にコンテナ型では三引数の show
を定義し、その本体で :compact => true
とした IOContext
を第一引数に用いた show(io, MIME"text/plain"(), x)
を各要素 x
に対して呼び出すべきです。
Base.Multimedia.showable
── 関数
Base.repr
── メソッド
repr(mime, x; context=nothing)
指定された MIME タイプにおける x
の表現を含んだ AbstractString
または Vector{UInt8}
を返します。返り値は show(io, mime, x)
を使って生成され、この形の show
が利用できなければ MethodError
が発生します。テキスト表現を持つ MIME タイプ (例えば "text/html"
や "application/postscript"
) に対しては AbstractString
が返り、そうでないバイナリ表現を持つ MIME タイプに対しては Vector{UInt8}
が返ります。特定の MIME タイプを Julia がテキストとして扱うかどうかは istextmime(mime)
で判定できます。
省略可能なキーワード引数 context
に設定できるのは :key=>value
という組あるいは IOContext
オブジェクトです。:key=>value
という属性 (あるいは io
に含まれる属性) が show
に渡される IO ストリームで使われます。
特別なケースとして、mime
がテキスト形式の MIME タイプで x
が AbstractString
のとき、および mime
がバイナリ形式の MIME タイプで x
が Vector{UInt8}
のとき、repr
関数は x
が最初から指定された MIME 形式を持つとみなし、x
をそのまま返します。この特別扱いは MIME タイプが "text/plain"
のときは起こりません。この振る舞いは生のデータが display(m::MIME, x)
に渡されたときに利用されます。
具体的な例を一つ挙げておくと、通常 repr("text/plain", x)
は人間が読むことを意図した "綺麗に成形された" バージョンの x
を返します。Julia コードで x
の値を入力するときにタイプする文字列に近いものを取得するには、show(x)
に対応する repr(x)
を使ってください。
例
julia> A = [1 2; 3 4];
julia> repr("text/plain", A)
"2×2 Array{Int64,2}:\n 1 2\n 3 4"
Base.Multimedia.MIME
── 型
Base.Multimedia.@MIME_str
── マクロ
上述したように、新しいディスプレイバックエンドを定義することもできます。例えば PNG 画像をウィンドウに表示できるモジュールがあるなら、その機能を Julia に登録することで、PNG 表現を持った型の値に対する display(x)
がそのモジュールのウィンドウを使って画像を表示するようにできます。
新しいディスプレイバックエンドを定義する方法を示します。
- まず
AbstractDisplay
型の部分型D
を作成します。 - 次に
D
が表示できる MIME タイプそれぞれについて、MIME タイプd
でx
を表示するメソッドdisplay(d::D, ::MIME"mime", x) = ...
を定義します。おそらくshow(io, mime, x)
やrepr(io, mime, x)
を使うことになるでしょう。指定された MIME タイプでx
を表示できない場合はMethodError
を送出するべきですが、この処理はshow
やrepr
を呼べば自動的に行われます。 - 最後にメソッド
display(d::D, x)
を定義します。このメソッドではD
がサポートする MIME タイプそれぞれに対してshowable(mime, x)
を問い合わせ、"最良の" ものを使ってx
を表示します。ここでもx
に対して使える MIME タイプが存在しなければMethodError
を送出してください。
さらに一部の型では redisplay(d::D, ...)
のオーバーライドが必要になります。なお、こういった関数の返り値は実装ごとに異なります (何らかの型の「ハンドル」を返せると便利な場合があるためです)。以上で D
に対する display
関数が直接呼び出せるようになります。さらに次の関数で新しいディスプレイをディスプレイスタックにプッシュすれば、display(x)
で新しいメソッドが自動的に呼ばれるようになります:
Base.Multimedia.pushdisplay
── 関数
pushdisplay(d::AbstractDisplay)
ディスプレイバックエンドを保持するグローバルなスタックに新しいディスプレイ d
をプッシュします。display(x)
あるいは display(mime, x)
を呼び出すと、スタックに含まれる x
を処理可能な (つまり MethodError
を送出しない) バックエンドの中で一番上にあるものを使って x
が表示されます。
Base.Multimedia.popdisplay
── 関数
popdisplay()
popdisplay(d::AbstractDisplay)
一つ目の形式では、ディスプレイバックエンドのスタックの一番上にあるディスプレイをポップします。二つ目の形式では一番上にある d
のコピーが取り除かれます。
Base.Multimedia.TextDisplay
── 型
TextDisplay(io::IO)
TextDisplay <: AbstractDisplay
型の値を返します。この型のディスプレイに対する display
は、任意のオブジェクトのテキスト表現を text/plain
(デフォルト) の MIME タイプで IO ストリームに書き込みます。Julia REPL でオブジェクトはこの型のディスプレイを使って出力されます。
Base.Multimedia.istextmime
── 関数
istextmime(m::MIME)
MIME タイプがテキストデータかどうかを判定します。テキストデータ (Unicode 含む) と認識される既知の MIME タイプ以外は全てバイナリデータと扱われます。
例
julia> istextmime(MIME("text/plain"))
true
julia> istextmime(MIME("img/png"))
false
ネットワーク IO
Base.bytesavailable
── 関数
bytesavailable(io)
ストリームあるいはバッファからブロックせずに読めるデータのバイト数を返します。
例
julia> io = IOBuffer("JuliaLang is a GitHub organization");
julia> bytesavailable(io)
34