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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:05:26