如何利用java的多线程对单个文件进行读取 小弟的需求如下: 有一个大概500M的文件,里面有一些特殊字符需要进行替换,请教如何用java的多线程去实现啊。谢谢啦! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就是利用多线程读这个文件吗?给个多线程读取文件的例子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; }} 我敢保证用多线程去读肯定没有使用 BufferedReader 单个线程去读来得快! 那这位兄台可否用介绍一下多线程对同一个任务处理的过程呢?比如说开2个线程对“我爱学习java,java是个好东西”,这句话中的“java”一字符串进行替换,该如何实现呢?,例如线程1读取到第一个java结束停止,在此做一个标记,线程二在接着标记处开始读。这样在单核机器上是没有单线程快。但是如果是个四核的服务器呢,要对"我爱学习java,java是个好东西”,这句话中的“java”一字符串进行替换的话该怎么实现呢?(因为同时可能有几个线程在运行)我现在就是这个地方不太明白。还有这个兄台以前(2007年?08忘记了)左右发的一个帖子上也谈到了读取大文件的,貌似多线程效率并不能彻底改善,那会儿说是单处理器,但是现在多核了,会不会变化呢? 一个数组是12 22 22 2 4 6怎么输出他的所有排列 DOM4J 怎么添加一段Nodelist javamail发邮件正文的中文乱码 "class " or "interface"expected JAVA面试题求解! 五子棋代码请指点。 一组不知个数的String,最好用什么样的collection盛? 一个基本的问题,如何调用第三方编写包? 最简单的问题 有关wait的一些问题 是不是应该用throws声明一下? java调用c++,dll中的回调函数问题?
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个线程对“我爱学习java,java是个好东西”,这句话中的“java”一字符串进行替换,该如何实现呢?,例如线程1读取到第一个java结束停止,在此做一个标记,线程二在接着标记处开始读。这样在单核机器上是没有单线程快。
但是如果是个四核的服务器呢,要对"我爱学习java,java是个好东西”,这句话中的“java”一字符串进行替换的话该怎么实现呢?(因为同时可能有几个线程在运行)我现在就是这个地方不太明白。
还有这个兄台以前(2007年?08忘记了)左右发的一个帖子上也谈到了读取大文件的,貌似多线程效率并不能彻底改善,那会儿说是单处理器,但是现在多核了,会不会变化呢?