Java中实现C# InputStream.Position偏移的等效方法是什么?
C#中
input.Position += 4的Java等效实现 我有一份用于文件转换的C#源码,现在要编写功能相同的Java应用,但不知道怎么实现C#里input.Position = input.Position + 4;这行代码的逻辑。相关C#代码片段如下:
//Open Files FileStream input = new FileStream(ltcFile, FileMode.Open); FileStream output = new FileStream(txtFile, FileMode.Create); //Skip LTC Header const int LTC_HEADER_LENGTH = 8; input.Position = input.Position + LTC_HEADER_LENGTH; //Write Unicode Text Header output.WriteByte(0xEF); output.WriteByte(0xBB); output.WriteByte(0xBF); //Get Data Size int b, dataSize; dataSize = 0; for (int i = 0; i < 4; i++) { b = input.ReadByte(); dataSize = dataSize + b * (int)System.Math.Pow(256, i); } //Set ID Table Position long idPos = dataSize + LTC_HEADER_LENGTH + 4; //Skip Unknown Data input.Position = input.Position + 4;
需要实现上述代码中//Skip Unknown Data部分的Java等效写法,允许使用mark()、skip()方法。
解决方案
方法1:通用skip()实现(适配多数InputStream)
Java的InputStream自带skip(long n)方法用于跳过指定字节,但该方法返回实际跳过的字节数,可能因流末尾等情况未完成跳过,因此建议循环确保跳过足够字节:
// 跳过4字节未知数据 long remaining = 4; while (remaining > 0) { long skipped = input.skip(remaining); if (skipped == 0) { // 已到流末尾,可根据业务需求处理(如抛出异常或终止) break; } remaining -= skipped; }
方法2:FileChannel直接设置位置(适配FileInputStream)
如果输入流是FileInputStream,可以通过FileChannel直接操作位置,和C#的Position逻辑完全一致:
FileInputStream input = new FileInputStream(ltcFile); FileChannel channel = input.getChannel(); // 直接将位置设置为当前位置+4 channel.position(channel.position() + 4);
补充说明
- 若使用
BufferedInputStream等支持mark()的流,也可以通过标记当前位置后读取4个字节的方式跳过,但效率不如上述两种方法,仅适用于特殊场景。 FileChannel的位置操作和C#FileStream.Position的行为高度匹配,是保证逻辑一致性的最优选择。
内容的提问来源于stack exchange,提问作者De-Bill
相关产品推荐
相关产品推荐

