Java 如何将所有行输出到给定的写入程序并返回字节数

Java 如何将所有行输出到给定的写入程序并返回字节数,java,java-stream,Java,Java Stream,如何将列表中仅由拉丁字母或数字组成的所有行输出到给定的编写器,并使用lambda表达式返回第一个异常之前成功写入的字节数 我的代码: public int writeAllCountingBytesTransferred(Writer writer, List<String> list) { return list.stream().filter(x -> x.matches("^[a-zA-Z0-9]+$") ).forEach(x-> {

如何将列表中仅由拉丁字母或数字组成的所有行输出到给定的编写器,并使用lambda表达式返回第一个异常之前成功写入的字节数

我的代码:

public int writeAllCountingBytesTransferred(Writer writer, List<String> list) {     
    return list.stream().filter(x -> x.matches("^[a-zA-Z0-9]+$") ).forEach(x-> {
        try {
            writer.write(x);
            how do I count bytes?
        } catch (IOException e) {
            how do I return bytes?

        }
    });        
}
public int writealCountingByTestTransferred(Writer-Writer,List-List){
return list.stream().filter(x->x.matches(“^[a-zA-Z0-9]+$”).forEach(x->{
试一试{
write.write(x);
如何计算字节数?
}捕获(IOE异常){
如何返回字节?
}
});        
}

我将映射到字符串长度的
IntStream
,并
sum()
它:

return list.stream()
    .filter(x -> x.matches("^[a-zA-Z0-9]+$"))
    .mapToInt(x-> {
      try {
        writer.write(x);
        return x.length();
      } catch (IOException e) {
        return 0;
      }
    })
    .sum();
请注意,当字符串都是字母和数字时,字符长度和字节长度是相同的

public class CountingWriter extends FilterWriter {
    private long count;

    public CountingWriter(Writer out) {
        super(out);
    }

    /**
     * The number of chars written. For ASCII this is the number of bytes.
     * @return the char count.
     */
    public long getCount() {
        return count;
    }

    @Override
    public void write(int c) throws IOException {
        super.write(c);
        ++count;
    }

    @Override
    public void write(char[] cbuf, int off, int len) throws IOException {
        super.write(cbuf, off, len);
        count += len;
    }

    @Override
    public void write(String str, int off, int len) throws IOException {
        super.write(str, off, len);
        count += len;
    }
}

CountingWriter cWriter = new CountingWriter(writer);
...
long count = cWriter.getCount();
FilterWriter是一个很好的包装类,它委托给原始编写器,可以用于这种过滤目的


ASCII意味着每个字符都被写为一个字节。(如果文件的编码不是UTF-16LE之类的。)

这是否回答了您的问题?智能解决方案:)如果不知道
编写器的实际字符编码,就不能说字符长度和字节长度是否相同。例如,对于
UTF-16
,即使是拉丁字母和数字,每个字符也会产生两个字节。此外,对于任意的
编写器
,我们甚至不能假设纯文本输出格式。例如,编写器可以生成Base64输出。谁知道呢……此外,当遇到
IOException
时,你不能假设已经没有写任何东西了。@Holger都是真的,感谢你提出了这些更好的观点,但是如果
匹配(“^[a-zA-Z0-9]+$”)
和典型情况,我的代码将通过所有可能为它编写的测试。我总是力求简洁易懂,并积极应用。当您了解所有需求时,YAGNI很好,但在这里,我们只有一个
编写器
,没有更多信息。我们至少应该做的是记录解决方案的假设和限制。