RandomAccessFile用多线程读取文件,然后在合并成一个文件存储。。。。怎么实现啊。。。

RandomAccessFile用多线程读取文件,然后在合并成一个文件存储。。。。怎么实现啊。。。,第1张

package com.example.PhoneSafe.test

import java.io.*

/**

 * Created with IntelliJ IDEA.

 * User: Administrator

 * Date: 13-8-7

 * Time: 上午10:58

 * To change this template use File | Settings | File Templates.

 */

public class RandomAccessFileTest {

    public static void main(String [] args){

        try{

            int fileSize //描述文件大小

            int startPos //文件开始写入位置

            Thread [] threads = new Thread[5] //定义一个线程数组

            File file = new File("E:\\baby\\info.txt")  //需要复制的文件

            FileInputStream fis = new FileInputStream(file)   //装载到的文件

            fileSize = (int) file.length()/5+1 //获得单个线程写入文件的单元大小

            //采用for循环来实习多线程的启动

            for(int i=0i<5i++){

                startPos = i*fileSize  //线程写入的起始位置

                threads[i] = new Thread(new DownloadFile(fis,new RandomAccessFile("E:\\baby\\info_copy.txt","rw"),startPos,fileSize))

                threads[i].start()

            }

        }catch(Exception e){

            e.printStackTrace()

        }

    }

}

class DownloadFile implements Runnable{

    private FileInputStream is   //文件输入流

    private RandomAccessFile rAF   //文件输出流

    private int startPos

    private int fileUnitSize

    private int length

    public DownloadFile(FileInputStream is,RandomAccessFile rAF,int startPos,int fileUnitSize){

        this.is = is

        this.rAF = rAF

        this.startPos = startPos

        this.fileUnitSize = fileUnitSize

    }

    @Override

    public void run() {

        try{

            is.skip(startPos)

            rAF.seek(startPos)

            byte [] buffer = new byte[1024]

            int hasbyte = 0

            while((hasbyte=is.read(buffer))!=-1){

                rAF.write(buffer,0,hasbyte)

                length +=hasbyte

                if(length<fileUnitSize){

                   return

                }

            }

        }catch(IOException e){

            e.printStackTrace()

        } finally{

            System.out.println("end")

            try{

                rAF.close()

            }catch(IOException e){

              e.printStackTrace()

            }

        }

    }

}

个人认为,此类和字节流一样,你只能从里面得到字节.你要 *** 作字符流,可以用现成的Reader

以下是java文档的解释:

public final String readLine()

throws IOException

从此文件读取文本的下一行。此方法可以从该文件的当前文件指针处成功地读取字节,直到到达行结束符或文件的末尾。每个字节都转换为一个字符,方法是采用该字符的低八位字节值,并将该字符的高八位设置为零。因此,此方法不支持完整的 Unicode 字符集。

文本行由回车字符 ('\r') 和一个新行字符 ('\n') 结束,回车字符后面紧跟一个新行字符,或者是文件的末尾。不使用行结束符,并且在返回的字符串中不包括结束符。

在读取了一个新行字符、读取了一个回车符和它后面的字节(查看是否为一个新行),到达文件的末尾或者抛出异常之前,此方法一直阻塞。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11774573.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存