本人剛參加工作,面試的時候遇四道筆試題,其中就有這道多線程有序讀取文件的題目,初看時拿不準,感覺會,又感覺不會。于是放棄了這道題,今天閑下來好好做一遍。
//定義一個runnable接口的實現類
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RunnableImpl implements Runnable{
//定義文件讀取的游標位置
private static int now=0;
//定義即將被讀取的文件
static File file=new File("source/error.log");
//使用io包中的RandomAccessFile類,支持文件的隨機訪問
static RandomAccessFile raf=null;
//定義每次讀取的字節數
final static int len=256;
RunnableImpl() throws IOException{
raf=new RandomAccessFile(file, "rw");
}
@Override
public void run() {
while(true){
try {
//synchronized實現多線程的同步
synchronized (raf) {
//將文件內容讀取到b字節數組中
byte[] b = new byte[len];
//設置游標位置
raf.seek(now);
int temp=raf.read(b);
//如果沒讀取到,就結束線程
if(temp==-1){
return ;
}
//設置游標偏移量
now+=temp;
//打印文件內容
System.out.println(new String(b));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
運行程序,我使用了3個線程
public static void main(String[] args) throws IOException {
RunnableImpl run=new RunnableImpl();
new Thread(run).start();
new Thread(run).start();
new Thread(run).start();
}
文件內容截圖

輸出結果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。