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') 结束,回车字符后面紧跟一个新行字符,或者是文件的末尾。不使用行结束符,并且在返回的字符串中不包括结束符。
在读取了一个新行字符、读取了一个回车符和它后面的字节(查看是否为一个新行),到达文件的末尾或者抛出异常之前,此方法一直阻塞。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)