L'Isola di Niente
L'Isola di Niente » Gjs Tips » GIOChannel

GIOChannel

# 最終更新日 2017.02.05

GIOChannel はファイルディスクプリタという昔ながらの入出力。
Gio は gvfs による入出力という認識でいいようです。
JavaScript 文字列と UTF-8 文字列は全自動で相互変換されるようです。

標準入出力
#!/usr/bin/gjs

const GLib = imports.gi.GLib;

// ファイルディスクプリタの stdin=0 にアクセス
let channel = GLib.IOChannel.unix_new(0);
// プロンプトの表示
channel.write_chars("何か入力してください > ", -1);
// フラッシュしないと反映されない
channel.flush();

// stdout=1 のデータを読み込む
let channel2 = GLib.IOChannel.unix_new(1);
let [status, str_return] = channel2.read_line();
// 行末の \n を取り除く
let s = str_return.slice(0, -1);
print("[" + s + "]が入力されました");

// 抜けると自動破棄されるけど必要なら以下を
//channel.shutdown(true);
//channel2.shutdown(true);

ファイルの読み書き
#!/usr/bin/gjs

const GLib = imports.gi.GLib;

let s = "abcdefg\nあいうえお\n3行目";

let channel = GLib.IOChannel.new_file("output.txt", "w");
channel.write_chars(s, -1);
channel.shutdown(true);

let channel2 = GLib.IOChannel.new_file("output.txt", "r");
let [status, str_return] = channel2.read_to_end();
print(str_return);
/* 一行毎に処理したい場合
for (;;) {
	let [status, str_return] = channel2.read_line();
	if (status == GLib.IOStatus.EOF)
		break;
	// 行末の \n を取り除く
	print(str_return.slice(0, -1));
}*/
channel2.shutdown(true);

パイプ入力との振り分け
#!/usr/bin/gjs
 
const GLib = imports.gi.GLib;
 
// stdin=0 stdout=1 
let channel = GLib.IOChannel.unix_new(0);
 
if (channel.get_flags() == GLib.IOFlags.IS_READABLE) {
    /* --  Pipe -- */
    let [status, str_return] = channel.read_to_end();
    // toString が必要
    let s = str_return.toString().slice(0, -1);
    print("[" + s + "]がパイプから渡されました");
} else {
    /* -- stdin -- */
    print("パイプから渡してください");
}

Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.