public class everyline { public static void main(String[] args) throws IOException, IOException { // TODO Auto-generated method stub RandomAccessFile rf = new RandomAccessFile("E:\\databike.txt", "r"); String line=null; while((line=rf.readLine())!=null) { //System.out.println(line); System.out.println(new String(line.getBytes("ISO-8859-1"), "gbk")); } } }
讀取任意位置的數據java
/** * 讀的方法 * @param path 文件路徑 * @param pointe 指針位置 * **/ public static void randomRed(String path,int pointe){ try{ //RandomAccessFile raf=new RandomAccessFile(new File("D:\\3\\test.txt"), "r"); /** * model各個參數詳解 * r 表明以只讀方式打開指定文件 * rw 以讀寫方式打開指定文件 * rws 讀寫方式打開,並對內容或元數據都同步寫入底層存儲設備 * rwd 讀寫方式打開,對文件內容的更新同步更新至底層存儲設備 * * **/ RandomAccessFile raf=new RandomAccessFile(path, "r"); //獲取RandomAccessFile對象文件指針的位置,初始位置是0 System.out.println("RandomAccessFile文件指針的初始位置:"+raf.getFilePointer()); raf.seek(pointe);//移動文件指針位置 byte[] buff=new byte[1024]; //用於保存實際讀取的字節數 int hasRead=0; //循環讀取 while((hasRead=raf.read(buff))>0){ //打印讀取的內容,並將字節轉爲字符串輸入 System.out.println(new String(buff,0,hasRead)); } }catch(Exception e){ e.printStackTrace(); } }
追加數據數組
/** * 追加方式 * 寫的方法 * @param path 文件路徑 * ***/ public static void randomWrite(String path){ try{ /**以讀寫的方式創建一個RandomAccessFile對象**/ RandomAccessFile raf=new RandomAccessFile(path, "rw"); //將記錄指針移動到文件最後 raf.seek(raf.length()); raf.write("我是追加的 \r\n".getBytes()); }catch(Exception e){ e.printStackTrace(); } }
任意位置插入數據多線程
/** * 實現向指定位置 * 插入數據 * @param fileName 文件名 * @param points 指針位置 * @param insertContent 插入內容 * **/ public static void insert(String fileName,long points,String insertContent){ try{ File tmp=File.createTempFile("tmp", null); tmp.deleteOnExit();//在JVM退出時刪除 RandomAccessFile raf=new RandomAccessFile(fileName, "rw"); //建立一個臨時文件夾來保存插入點後的數據 FileOutputStream tmpOut=new FileOutputStream(tmp); FileInputStream tmpIn=new FileInputStream(tmp); raf.seek(points); /**將插入點後的內容讀入臨時文件夾**/ byte [] buff=new byte[1024]; //用於保存臨時讀取的字節數 int hasRead=0; //循環讀取插入點後的內容 while((hasRead=raf.read(buff))>0){ // 將讀取的數據寫入臨時文件中 tmpOut.write(buff, 0, hasRead); } //插入須要指定添加的數據 raf.seek(points);//返回原來的插入處 //追加須要追加的內容 raf.write(insertContent.getBytes()); //最後追加臨時文件中的內容 while((hasRead=tmpIn.read(buff))>0){ raf.write(buff,0,hasRead); } }catch(Exception e){ e.printStackTrace(); } }
咱們能夠用RandomAccessFile這個類,來實現一個多線程斷點下載的功能,用過下載工具的朋友們都知道,下載前都會創建兩個臨時文件,一個是與被下載文件大小相同的空文件,另外一個是記錄文件指針的位置文件,每次暫停的時候,都會保存上一次的指針,而後斷點下載的時候,會繼續從上一次的地方下載,從而實現斷點下載或上傳的功能,有興趣的朋友們能夠本身實現下。dom