You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中是否有等价于C# StreamWriter.BaseStream.Length的流长度获取方法?

Java中获取流长度的替代方案(对应C#的StreamWriter.BaseStream.Length)

嘿,我完全懂你想要的效果——Java里确实没有像C# StreamWriter.BaseStream.Length那样直接暴露的长度属性,但咱们有几种靠谱的替代方法,得根据你使用的具体流类型来选择:

  • 针对文件流(FileOutputStream):用FileChannel获取大小
    如果你的Writer底层是FileOutputStream,可以通过FileChannel来获取文件的当前长度。但要注意先flush缓冲区,不然BufferedWriter里未写入的内容会导致长度不准确:

    FileOutputStream fos = new FileOutputStream("test.txt");
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos));
    
    // 先flush确保缓冲区内容写入文件
    writer.flush();
    long streamLength = fos.getChannel().size();
    
  • 针对内存流(ByteArrayOutputStream):直接调用size()
    要是用的是内存输出流,它本身就提供了size()方法来获取已写入的字节数,同样记得先flush:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    OutputStreamWriter osw = new OutputStreamWriter(baos);
    BufferedWriter writer = new BufferedWriter(osw);
    
    writer.write("一些测试内容");
    writer.flush();
    long streamLength = baos.size();
    
  • 通用拆包方案(针对包装过的流)
    如果你手里只有一个Writer对象,不知道底层流类型,可以尝试逐层拆包找到底层的OutputStream,但这种方法不保证适用于所有场景:

    Writer writer = ...; // 你的Writer实例
    
    // 逐层拆包BufferedWriter和OutputStreamWriter
    while (writer instanceof BufferedWriter) {
        writer = ((BufferedWriter) writer).getWriter();
    }
    if (writer instanceof OutputStreamWriter) {
        OutputStream underlyingStream = ((OutputStreamWriter) writer).getOutputStream();
        // 判断底层流类型并获取长度
        if (underlyingStream instanceof FileOutputStream) {
            ((FileOutputStream) underlyingStream).getChannel().size();
        } else if (underlyingStream instanceof ByteArrayOutputStream) {
            ((ByteArrayOutputStream) underlyingStream).size();
        }
    }
    

重要提醒

不是所有流都能获取长度!比如网络流(Socket输出流)这种流式传输的场景,本身没有“总长度”的概念,也就没法获取类似的数值。只有那些有固定存储介质(文件、内存缓冲区)的流才能拿到准确的长度。

内容的提问来源于stack exchange,提问作者M14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:29:44