小弟的需求如下:
    有一个大概500M的文件,里面有一些特殊字符需要进行替换,请教如何用java的多线程去实现啊。谢谢啦!

解决方案 »

  1.   

    就是利用多线程读这个文件吗?给个多线程读取文件的例子import java.io.*;
    class DownThread extends Thread {
    //定义字节数组(取水的竹筒)的长度
    private final int BUFF_LEN = 32;
    //定义读取的起始点
    private long start;
    //定义读取的结束点
    private long end;
    //读取文件对应的输入流
    private InputStream is;
    //将读取到的字节输出到raf中
    private RandomAccessFile raf; //构造器,传入输入流,输出流和读取起始点、结束点
    public DownThread(long start, long end, InputStream is, RandomAccessFile raf) {
    //输出该线程负责读取的字节位置
    System.out.println(start + "---->" + end);
    this.start = start;
    this.end = end;
    this.is = is;
    this.raf = raf;
    } public void run() {
    try {
    is.skip(start);
    raf.seek(start);
    //定义读取输入流内容的的缓存数组(竹筒)
    byte[] buff = new byte[BUFF_LEN];
    //本线程负责读取文件的大小
    long contentLen = end - start;
    //定义最多需要读取几次就可以完成本线程的读取
    long times = contentLen / BUFF_LEN + 4;
    //实际读取的字节数
    int hasRead = 0;
    for (int i = 0; i < times; i++) {
    hasRead = is.read(buff);
    //如果读取的字节数小于0,则退出循环!
    if (hasRead < 0) {
    break;
    }
    raf.write(buff, 0, hasRead);
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    //使用finally块来关闭当前线程的输入流、输出流
    finally {
    try {
    if (is != null) {
    is.close();
    }
    if (raf != null) {
    raf.close();
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    }
    }public class MutilDown {
    public static void main(String[] args) {
    final int DOWN_THREAD_NUM = 4;
    final String OUT_FILE_NAME = "d:/copy勇敢的心.rmvb";
    InputStream[] isArr = new InputStream[DOWN_THREAD_NUM];
    RandomAccessFile[] outArr = new RandomAccessFile[DOWN_THREAD_NUM];
    try { isArr[0] = new FileInputStream("d:/勇敢的心.rmvb");
    long fileLen = getFileLength(new File("d:/勇敢的心.rmvb"));
    System.out.println("文件的大小" + fileLen);
    //以输出文件名创建第一个RandomAccessFile输出流
    outArr[0] = new RandomAccessFile(OUT_FILE_NAME, "rw");
    //创建一个与文件相同大小的空文件
    for (int i = 0; i < fileLen; i++) {
    outArr[0].write(0);
    }
    //每线程应该读取的字节数
    long numPerThred = fileLen / DOWN_THREAD_NUM;
    //整个文件整除后剩下的余数
    long left = fileLen % DOWN_THREAD_NUM;
    for (int i = 0; i < DOWN_THREAD_NUM; i++) {
    //为每个线程打开一个输入流、一个RandomAccessFile对象,
    //让每个线程分别负责读取文件的不同部分。
    if (i != 0) { isArr[i] = new FileInputStream("d:/勇敢的心.rmvb");
    //以指定输出文件创建多个RandomAccessFile对象
    outArr[i] = new RandomAccessFile(OUT_FILE_NAME, "rw");
    }
    if (i == DOWN_THREAD_NUM - 1) {
    //最后一个线程读取指定numPerThred+left个字节
    new DownThread(i * numPerThred, (i + 1) * numPerThred
    + left, isArr[i], outArr[i]).start();
    } else {
    //每个线程负责读取一定的numPerThred个字节
    new DownThread(i * numPerThred, (i + 1) * numPerThred,
    isArr[i], outArr[i]).start();
    }
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    } public static long getFileLength(File file) {
    long length = 0;
    //获取文件的长度
    long size = file.length();
    length = size;
    return length;
    }
    }
      

  2.   

    我敢保证用多线程去读肯定没有使用 BufferedReader 单个线程去读来得快!
      

  3.   


    那这位兄台可否用介绍一下多线程对同一个任务处理的过程呢?比如说开2个线程对“我爱学习java,java是个好东西”,这句话中的“java”一字符串进行替换,该如何实现呢?,例如线程1读取到第一个java结束停止,在此做一个标记,线程二在接着标记处开始读。这样在单核机器上是没有单线程快。
    但是如果是个四核的服务器呢,要对"我爱学习java,java是个好东西”,这句话中的“java”一字符串进行替换的话该怎么实现呢?(因为同时可能有几个线程在运行)我现在就是这个地方不太明白。
    还有这个兄台以前(2007年?08忘记了)左右发的一个帖子上也谈到了读取大文件的,貌似多线程效率并不能彻底改善,那会儿说是单处理器,但是现在多核了,会不会变化呢?