RandomAccessFile基本用法
IO中有许多类可以帮我们写入数据到文件中,FileWriter,FileOutputStream以及各种被装饰的类。其中RandomAccessFile可以帮我们实现在指定位置写入内容。
从字面意思来看,通过这个类我们可以对文件进行随机访问。
RandomAccessFile对象包含了一个指针,当新建了一个RandomAccessFile对象,这个指针指向文件的开始处,即0字节的位置,当读/写了n个字节,这个指针后移到n,除此之外,指针可以根据需要自由移动到指定位置。
RandomAccessFile有两个构造器,通过传入一个File对象参数构造,或者通过String指定文件名,另外还需要指定一个参数mode,指定RandomFileAccess的访问模式,"r"为只读,"rw"为读写。
通过下面的代码,可以了解RandomAccessFile类的基本用法。
另外需要注意的一点是:
RandomAccessFile的write(byte[] arr)方法默认参数数组的编码格式为"ISO-8859-1",而中文编码格式默认为GBK,String的getBytes()方法默认编码格式为"ISO-8859-1”,因此在写入中文时,需要这一行
String.getBytes("GBK"),对编码格式进行统一!
1 /** 2 * RandomAccessFile:可以访问文件任意位置的类 3 */ 4 public class RandomAccessFileTest { 5 public static void main(String[] args) { 6 insertAtPos(new File("F:/java.txt"),8,"沧海月明珠有泪\r\n蓝田日暖玉生烟\r\n"); 7 // appendContent(new File("F:/java.txt")); 8 } 9 10 11 //使用范例 12 public static void test1() { 13 try ( 14 RandomAccessFile raf = 15 new RandomAccessFile("F:/Code for SE/codeByVi/src/com/vi/io/RandomAccessFileTest.java", "r"); 16 ) { 17 //获取当前指针位置 18 long index = raf.getFilePointer(); 19 System.out.println("当前指针的位置:" + index); 20 //设置指针的位置 21 raf.seek(300); 22 System.out.println("现在指针的位置:" + raf.getFilePointer()); 23 int hasRead = 0; 24 byte[] buffer = new byte[1024]; 25 while ((hasRead = raf.read(buffer)) != -1) { 26 System.out.print(new String(buffer, 0, hasRead)); 27 } 28 } catch (Exception e) { 29 e.printStackTrace(); 30 } 31 } 32 33 /** 34 * 在文件末尾追加内容 35 */ 36 public static void appendContent(File file) { 37 try ( 38 RandomAccessFile raf = new RandomAccessFile(file, "rw"); 39 ) { 40 raf.seek(raf.length()); 41 String content = new String("此情可待成追忆".getBytes("GBK"),"ISO8859-1"); 42 raf.write("三人行必有我师".getBytes("GBK")); 43 System.out.println("追加成功!"); 44 } catch (Exception e) { 45 e.printStackTrace(); 46 } 47 } 48 49 /** 50 * 将指定字符串插入文件的指定位置 51 * @param file 52 * @param pos 53 * @param content 54 */ 55 public static void insertAtPos(File file,int pos,String content) { 56 try ( 57 RandomAccessFile raf = new RandomAccessFile(file,"rw"); 58 FileInputStream fr = new FileInputStream(new File("F:/temp.txt")); 59 FileOutputStream bw = new FileOutputStream(new File("F:/temp.txt")); 60 ) { 61 raf.seek(pos); 62 byte[] buffer = new byte[64]; 63 int hasRead = 0; 64 //将指定位置后的内容写入到临时文件中去 65 while((hasRead = raf.read(buffer)) != -1) { 66 bw.write(buffer,0,hasRead); 67 } 68 //重新定位 69 raf.seek(pos); 70 //将目标内容写入到目标文件中 71 raf.write("沧海月明珠有泪".getBytes("GBK")); 72 //将临时文件中的内容写入到目标文件的末尾 73 while ((hasRead = fr.read(buffer)) != -1) { 74 raf.write(buffer,0,hasRead); 75 } 76 new File("F:/temp.txt").delete(); 77 System.out.println("写入完成!"); 78 } catch (Exception e) { 79 e.printStackTrace(); 80 } 81 } 82 }
posted on 2019-11-01 22:49 nameless_vi 阅读(750) 评论(0) 编辑 收藏 举报