如何从一个InputStream流中从指位置截取指定长度的流

时间:2021-09-22 10:41:25
java中,对于一个InputStream流,需要从中间的第n个字节开始,截取到第m个字节,如何处理?

8 个解决方案

#2


可以的。

Test.java


public class Test {
public static void main(String[] args)  {
try {
byte []data = new byte[10];
FileInputStream fis = new FileInputStream("c:\\test.txt");
fis.skip(6);
fis.read(data);
fis.close();

for(int i=0;i<data.length;i++) {
System.out.print((char)data[i]);
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}


c:\test.txt

hello,world.wellcome.good job.


执行结果
output:

world.well


Good Luck.

#3


或者从一个文件的第n个字节截取到第m个字节

#4


引用 1 楼 ctkqqq 的回复:
这里API和源码例子
一个英文的,一个翻译的:
http://apicode.gicp.net/class.do?api=selectByfatherIndex&amp;father=255
http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&amp;father=255

ls的地址收藏了。

#5


2楼正解

#6


read(byte[] b, int off, int len) 
          将最多 len 个数据字节从此输入流读入字节数组。

#7


引用 6 楼 superman1986 的回复:
read(byte[] b, int off, int len) 
          将最多 len 个数据字节从此输入流读入字节数组。


的确有这个问题。那应该考虑buffer
以下代码解决这个问题。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Test {
private final static int BUFFER_SIZE = 10;
    public static void main(String[] args)  {
        try {
         int need2read = 22;
         int probe = 0;
            byte []data = new byte[BUFFER_SIZE];
            FileInputStream fis = new FileInputStream("c:\\test.txt");
            fis.skip(6);
            
            while((probe<need2read/BUFFER_SIZE) && (fis.read(data)!=-1)) {
             for(int i=0;i<data.length;i++) {
             System.out.print((char)data[i]);
             }
             probe++;
            }
            
            //
            int overage = need2read%BUFFER_SIZE;
            if(overage != 0) {
             int ir = fis.read(data,0,overage);
            for(int i=0;i< ir;i++) {
         System.out.print((char)data[i]);
         }
            }
            
            fis.close();
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}

#8


也在考虑这个问题。只能skip掉吗?

#1


#2


可以的。

Test.java


public class Test {
public static void main(String[] args)  {
try {
byte []data = new byte[10];
FileInputStream fis = new FileInputStream("c:\\test.txt");
fis.skip(6);
fis.read(data);
fis.close();

for(int i=0;i<data.length;i++) {
System.out.print((char)data[i]);
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}


c:\test.txt

hello,world.wellcome.good job.


执行结果
output:

world.well


Good Luck.

#3


或者从一个文件的第n个字节截取到第m个字节

#4


引用 1 楼 ctkqqq 的回复:
这里API和源码例子
一个英文的,一个翻译的:
http://apicode.gicp.net/class.do?api=selectByfatherIndex&amp;father=255
http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&amp;father=255

ls的地址收藏了。

#5


2楼正解

#6


read(byte[] b, int off, int len) 
          将最多 len 个数据字节从此输入流读入字节数组。

#7


引用 6 楼 superman1986 的回复:
read(byte[] b, int off, int len) 
          将最多 len 个数据字节从此输入流读入字节数组。


的确有这个问题。那应该考虑buffer
以下代码解决这个问题。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Test {
private final static int BUFFER_SIZE = 10;
    public static void main(String[] args)  {
        try {
         int need2read = 22;
         int probe = 0;
            byte []data = new byte[BUFFER_SIZE];
            FileInputStream fis = new FileInputStream("c:\\test.txt");
            fis.skip(6);
            
            while((probe<need2read/BUFFER_SIZE) && (fis.read(data)!=-1)) {
             for(int i=0;i<data.length;i++) {
             System.out.print((char)data[i]);
             }
             probe++;
            }
            
            //
            int overage = need2read%BUFFER_SIZE;
            if(overage != 0) {
             int ir = fis.read(data,0,overage);
            for(int i=0;i< ir;i++) {
         System.out.print((char)data[i]);
         }
            }
            
            fis.close();
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}

#8


也在考虑这个问题。只能skip掉吗?