Paepoi

Paepoi » Gjs Tips » GIOChannel(Gjs) Tips

GIOChannel(Gjs) Tips

# 最終更新日 2023.11.19

標準入出力
GIOChannel はファイルディスクリプタという UNIX 系の昔ながらの入出力
Gio は gvfs にて仮想化による柔軟な入出力、という認識でいいようです
JavaScript 文字列と UTF-8 文字列は全自動で相互変換される
#!/usr/bin/gjs -m
 
import GLib from 'gi://GLib';

const PROMPT = '何か入力してください > '
 
// ファイルディスクリプタの stdin=0 にアクセス
let channel = GLib.IOChannel.unix_new(0);
// プロンプトの表示
let encoder = new TextEncoder();
let prpt = encoder.encode(PROMPT);
channel.write_chars(prpt, prpt.length);
// フラッシュしないと反映されない、close は非推奨
channel.flush();
channel.shutdown(true);
 
// ファイルディスクリプタの stdout=1 にアクセス
let channel2 = GLib.IOChannel.unix_new(1);
// stdout のデータを読み込む
let [status, str_return] = channel2.read_line();
// 行末の \n を取り除く
let s = str_return.trimEnd();
print(`[${s}] が入力されました`);
channel2.shutdown(true);

ファイルの読み書き
一揆に読み込むとやはり Uint8Array で戻ってきます
一行毎に読み込みすればそのまま JavaScript 文字列として扱える
#!/usr/bin/gjs -m

import GLib from '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();
let dec = new TextDecoder();
let text = dec.decode(str_return);
print(text);
// 一行毎に処理の場合は js 文字列で戻ってくる、統一してよ...
/*
for (;;) {
	let [status, str_return] = channel2.read_line();
	if (status == GLib.IOStatus.EOF)
		break;
	// 行末の \n を取り除く
	print(str_return.trimEnd());
}*/
channel2.shutdown(true);

パイプ入力との振り分け
標準入力に値があるかどうかで見分けられます
#!/usr/bin/gjs -m
 
import GLib from '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();
    // 変換が必要
    let dec = new TextDecoder();
    let text = dec.decode(str_return).trimEnd();
    print(`[${text}] がパイプから渡されました`);
} else {
    /* -- stdin -- */
    print('パイプから渡してください');
}

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