改行で標準入力→リストで取得の Python スクリプト、改行2回で標準入力が完了するスクリプト
stdio.py
# -*- coding: UTF-8 -*- import sys class Stdio: # 標準入力 @staticmethod def input(): inlist = [] try: while True: i = input('') if i=='':break inlist.append(i) except EOFError: pass return inlist # list 改行無し標準出力 @staticmethod def out(list): for n in list: sys.stdout.write(n) # list 改行無し標準エラー出力 @staticmethod def err(list): for n in list: sys.stderr.write(n)
↑ を実行する Python
test.py
# -*- coding: UTF-8 -*- from stdio import Stdio list = Stdio.input() Stdio.out(list)
Pythonスクリプト test.py をJavaから実行、
Script_exec · yipuran/yipuran-core Wiki · GitHub を参照
int sts = ScriptExecutor.run(()->"python test.py" , ()->Arrays.asList("あabc", "A", "1", "\n").stream().map(e->e + "\n").collect(Collectors.toList()) , e->{ System.out.println(e); },(e, x)->{ System.out.println(e); x.printStackTrace(); });
標準出力結果
あabcA1
int sts = ScriptExecutor.run(()->"python test.py" , ()->Arrays.asList("あabc", "A", "1", "\n").stream().map(e->UnicodeTool.convertToUnicode(e) + "\n").collect(Collectors.toList()) , e->{ System.out.println(e); System.out.println(UnicodeTool.convertToOiginal(e)); },(e, x)->{ System.out.println(e); x.printStackTrace(); });
UnicodeToolは、
public final class UnicodeTool { private UnicodeTool(){} /** * Unicode文字列に変換する("あ" -> "\u3042") * @param original * @return */ public static String convertToUnicode(String string){ if (string==null || string.isEmpty()) return ""; StringBuilder sb = new StringBuilder(); for(int i = 0; i < string.length(); i++){ sb.append(String.format("\\u%04X", Character.codePointAt(string, i))); } String unicode = sb.toString(); return unicode; } /** * Unicode文字列から元の文字列に変換する ("\u3042" -> "あ") * @param unicode * @return */ public static String convertToOiginal(String unicode){ if (unicode==null || unicode.isEmpty()) return ""; String[] codeStrs = unicode.split("\\\\u"); int[] codePoints = new int[codeStrs.length - 1]; // 最初が空文字なのでそれを抜かす for(int i = 0; i < codePoints.length; i++){ codePoints[i] = Integer.parseInt(codeStrs[i + 1], 16); } String encodedText = new String(codePoints, 0, codePoints.length); return encodedText; } }
標準出力結果
\u3042\u0061\u0062\u0063\u0041\u0031\u000A あabcA1