当前位置: 代码迷 >> J2SE >> 怎么将文件的一部分作为输入流
  详细解决方案

怎么将文件的一部分作为输入流

热度:44   发布时间:2016-04-24 00:30:25.0
如何将文件的一部分作为输入流?
如题:
Java code
        BufferedReader in = new BufferedReader(new FileReader("test.data"));        String line = null;        boolean opStream = false;        while ((line = in.readLine()) != null)        {            boolean bool = .....            if (bool)            {               //开始截取文件                opStream = true;            }                        if (opStream)            {               //TODO 想在此处做处理。  如果不能做到,请提供一个简单的demo。非常感谢。             }            if (!bool)            {                //停止截取文件                opStream = false;            }        }另有一个API方法,void read(InputStream in);void read(Reader in);


------解决方案--------------------
用ByteArrayOutputStream和ByteArrayInputStream来实现
for example

Java code
ByteArrayOutputStream bos = new ByteArrayOutputStream();BufferedReader in = new BufferedReader(new FileReader("test.data"));String line = null;boolean opStream = false;long size = 0;while ((line = in.readLine()) != null) {    boolean bool = (size + line.getBytes() <= 1024); //假设让文件的前1k作为输入流    if (bool) {        bos.write(line.getBytes());    } else {        break;    }}in.close();ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); //把bos的信息转成输入流//可以用bis作为参数变成各种输入流,如DataInputStream dis = new DataInputStream(bis);...
------解决方案--------------------
上面在while的循环最后加上 size += line.getBytes().length; 否则size没有发生变化
------解决方案--------------------
另一个可以考虑的使用:RandomAccessFile 该类本身就已经实现了 InputStream 接口。

可以用 seek()进行快速定位,然后直接按照InputStream进行流式读取操作,控制好读取长度即可。

这种做法的好处是整个过程可以完全流式操作,不需要预先将部分数据全部读取到内存中。



如果想做的更完美点,可以自己封装一个LimitInputStream(InputStream is, int limit)类来限制读取长度。

这样的话总体上就是:
RandomAccessFile raf = new RandomAccessFile("文件");
raf.seek(起始位置);
LimitInputStream lis = new LimitInputStream(raf, 最大读取长度);
然后把lis给出去就行了。



------解决方案--------------------
java.nio.channels.FileChannel

MappedByteBuffer map(FileChannel.MapMode mode, long position, long size)
Maps the file into memory.

可以指定把一个文件的一部分加载入内存变成一个 ByteBuffer.而这个ByteBuffer基本上你可以当成输入流一样来读取其中的内容。
  相关解决方案