前提
Javaで、以下のサイトを参考に標準入出力を変えました。
【Java】標準入力&標準出力をJUnitでテストしたい
ですが、入出力のテストを行ったところ、日本語を入力すると出力が文字化けしました。
出力
想定される出力:
abcdあいうえお abcdあいうえお どうして
得られた出力:
abcdBDFHJ abcdBDFHJ どうして
該当のソースコード
Main.java
Java
1package inout; 2 3import java.io.PrintStream; 4import java.util.Scanner; 5 6public class Main { 7 8 public static void main( String[] args) { 9 StandardOutputStream out = new StandardOutputStream(); 10 11 StandardInputStream in = new StandardInputStream(); 12 13 PrintStream defaultOut = System.out; 14 15 System.setOut( out); 16 System.setIn( in); 17 18 in.inputln( "abcdあいうえお"); 19 Scanner scanner = new Scanner( in); 20 String input = scanner.nextLine(); 21 defaultOut.println( input); 22 System.out.println( input); 23 defaultOut.println( out.readLine()); 24 out.append( "どうして"); 25 defaultOut.println( out.readLine()); 26 } 27}
StandardInputStream.java
Java
1package inout; 2 3import java.io.IOException; 4import java.io.InputStream; 5 6/** 7 * 標準入力を変えるためのStream 8 */ 9public class StandardInputStream extends InputStream { 10 /** バッファ */ 11 private StringBuilder buffer = new StringBuilder(); 12 13 /** 改行文字 */ 14 private static String crlf = System.getProperty( "line.separator"); 15 16 /** 17 * 文字列を入力する 18 * @param str 文字列 19 */ 20 public void inputln( String str) { 21 buffer.append( str).append( crlf); 22 } 23 24 @Override 25 public int read() throws IOException { 26 if ( buffer.length() == 0) { 27 return -1; 28 } 29 int result = buffer.charAt( 0); 30 buffer.deleteCharAt( 0); 31 return result; 32 } 33}
StandardOutputStream.java
Java
1package inout; 2 3import java.io.BufferedReader; 4import java.io.ByteArrayOutputStream; 5import java.io.IOException; 6import java.io.PrintStream; 7import java.io.StringReader; 8 9/** 10 * 標準出力を変えるためのStream 11 */ 12public class StandardOutputStream extends PrintStream { 13 private BufferedReader buffer = new BufferedReader( new StringReader( "")); 14 15 public StandardOutputStream() { 16 super( new ByteArrayOutputStream()); 17 } 18 19 /** 20 * 1行文の文字列を読み込む 21 * @return 文字列 22 */ 23 public String readLine() { 24 try { 25 String line = ""; 26 if ( (line = buffer.readLine()) != null) { 27 return line; 28 } 29 buffer = new BufferedReader( new StringReader( out.toString())); 30 (( ByteArrayOutputStream) out).reset(); 31 return buffer.readLine(); 32 } 33 catch ( IOException e) { 34 throw new RuntimeException( e); 35 } 36 } 37}
試したこと
Mainで試したように、StandardOutputStreamの方は単体では日本語を出力できているように見えます。
問題なのは、StandardInputStreamに日本語を入力する方だと思います。
補足情報(FW/ツールのバージョンなど)
OSはWindows11、実行環境はEclipse 2023-03で、JavaSE-11を使用しています。
回答1件
あなたの回答
tips
プレビュー