如何在另一个 FilterInputStream 中使用 FilterInputStream 的自定义方法
How to use a custom method of a FilterInputStream inside another FilterInputStream
我有两个流扩展 FilterInputStream class。 A 正在从流中读取双打,B 应获取这些双打并对其应用随机噪声。问题是关于如何正确实现第二个流,因此 B 可以访问 A 返回双精度的自定义函数。链接如下:
源 ----> A ----> 双 ----> B ----> 加噪声加倍
最好的问候,Turakar
A FilteredInputStream
似乎不太适合你的问题,因为 InputStream
代表一个字节序列,但你需要的是 double
数字的序列。一种可能的替代方法是改为实现 Iterator
接口。因此 A
将变为:
import java.io.InputStream;
import java.util.Iterator;
import java.util.Scanner;
public class DoubleIterator implements Iterator<Double> {
private Scanner scanner;
public DoubleIterator(InputStream is) {
scanner = new Scanner(is);
}
@Override
public boolean hasNext() {
return scanner.hasNextDouble();
}
@Override
public Double next() {
return scanner.nextDouble();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
而 B
会变成
import java.util.Iterator;
import java.util.Random;
public class NoiseIterator implements Iterator<Double> {
Random r = new Random();
private Iterator<Double> source;
public NoiseIterator(Iterator<Double> source) {
this.source = source;
}
@Override
public boolean hasNext() {
return source.hasNext();
}
@Override
public Double next() {
return source.next()+r.nextGaussian();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
这些类可以按以下方式使用:
String s = "1 56 123 30 0";
Iterator<Double> it = new DoubleIterator(new ByteArrayInputStream(s.getBytes()));
while(it.hasNext()) {
System.out.println(it.next());
}
it = new NoiseIterator(new DoubleIterator(new ByteArrayInputStream(s.getBytes())));
while(it.hasNext()) {
System.out.println(it.next());
}
典型输出:
1.0
56.0
123.0
30.0
0.0
-0.011797617285828732
55.71721599815757
123.33995522117877
29.16152453760448
-0.9614750776766922
我有两个流扩展 FilterInputStream class。 A 正在从流中读取双打,B 应获取这些双打并对其应用随机噪声。问题是关于如何正确实现第二个流,因此 B 可以访问 A 返回双精度的自定义函数。链接如下:
源 ----> A ----> 双 ----> B ----> 加噪声加倍
最好的问候,Turakar
A FilteredInputStream
似乎不太适合你的问题,因为 InputStream
代表一个字节序列,但你需要的是 double
数字的序列。一种可能的替代方法是改为实现 Iterator
接口。因此 A
将变为:
import java.io.InputStream;
import java.util.Iterator;
import java.util.Scanner;
public class DoubleIterator implements Iterator<Double> {
private Scanner scanner;
public DoubleIterator(InputStream is) {
scanner = new Scanner(is);
}
@Override
public boolean hasNext() {
return scanner.hasNextDouble();
}
@Override
public Double next() {
return scanner.nextDouble();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
而 B
会变成
import java.util.Iterator;
import java.util.Random;
public class NoiseIterator implements Iterator<Double> {
Random r = new Random();
private Iterator<Double> source;
public NoiseIterator(Iterator<Double> source) {
this.source = source;
}
@Override
public boolean hasNext() {
return source.hasNext();
}
@Override
public Double next() {
return source.next()+r.nextGaussian();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
这些类可以按以下方式使用:
String s = "1 56 123 30 0";
Iterator<Double> it = new DoubleIterator(new ByteArrayInputStream(s.getBytes()));
while(it.hasNext()) {
System.out.println(it.next());
}
it = new NoiseIterator(new DoubleIterator(new ByteArrayInputStream(s.getBytes())));
while(it.hasNext()) {
System.out.println(it.next());
}
典型输出:
1.0
56.0
123.0
30.0
0.0
-0.011797617285828732
55.71721599815757
123.33995522117877
29.16152453760448
-0.9614750776766922