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
相关产品推荐
相关产品推荐

