ByteArrayInputStream を使って文字列 String を作る

未知の byte配列のデータ、制御文字が入っているかもしれない byte配列のデータ、
ただし制御文字以外は ASCIIコードだけであるとします。

これをそのまま文字列として print してしまうと制御文字が含まれてしまうので制御文字を取り除いた
String を求めたい課題があります。

まだ、Java8 ですが、ByteArrayInputStream で以下のようすることができます。

byte[]  data;
/* data に、制御文字を含む ASCIIコードデータが入るものとします。*/

ByteArrayInputStream inst = new ByteArrayInputStream(data.getBytes());
int[] iary = Stream.generate(inst::read).limit(inst.available())
             .filter(b->0x20 <= b && b <= 0x7f)
             .mapToInt(i->i).toArray();
String str = new String(iary, 0, iary.length);

int[] を一旦作成するというのが、気に入りません。そこで考えたのが、、

ByteArrayInputStream inst = new ByteArrayInputStream(data.getBytes());
String str = Stream.generate(inst::read).limit(inst.available())
.filter(b->0x20 <= b && b <= 0x7f)
.map(i->String.valueOf((char)i.intValue()))
.collect(Collectors.joining());

これで、String str を作ってしまいます。