本文共 2815 字,大约阅读时间需要 9 分钟。
RandomAccessFile
1.RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
2.RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
3.如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。 如果写出到的文件存在,则会对原文件内容进行覆盖。(默认情况下,从头覆盖
4.可以通过相关的操作,实现RandomAccessFile“插入”数据的效果
典型代码1:
/*图片的复制: */@Testpublic void test1() { RandomAccessFile raf1 = null; RandomAccessFile raf2 = null; try { raf1 = new RandomAccessFile(new File("灿烈.jpg"), "r"); raf2 = new RandomAccessFile(new File("灿烈1.jpg"), "rw"); byte[] buffer = new byte[20]; int len; while ((len = raf1.read(buffer)) != -1) { raf2.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } finally { if (raf2 != null) { try { raf2.close(); } catch (IOException e) { e.printStackTrace(); } } if (raf1 != null) { try { raf1.close(); } catch (IOException e) { e.printStackTrace(); } } }}
典型代码2:
/* 使用RandomAccessFile实现数据的插入效果 */ @Test public void test3() { RandomAccessFile raf = null; ByteArrayOutputStream baos = null; try { // abcdefg// hijk// lmn raf = new RandomAccessFile("hello.txt", "rw"); raf.seek(3);//将指针调到角标为3的位置 //保存指针3后面的所数据到StringBuilder中 // StringBuilder sb = new StringBuilder((int)new File("hello.txt").length()); baos = new ByteArrayOutputStream(); byte[] buffer = new byte[5]; int len; while((len = raf.read(buffer)) != -1){ // sb.append(new String(buffer,0,len)); //将字节5个5个写入,不会出现乱码,最后再一起转成字符串 baos.write(buffer,0,len); } //调回指针,写入“xyz” raf.seek(3); raf.write("xyz".getBytes()); //将StringBuilder中的数据写入到文件中 // raf.write(sb.toString().getBytes()); raf.write(baos.toString().getBytes());// abcxyzdefg// hijk// lmn } catch (IOException e) { e.printStackTrace(); } finally { if (raf != null) { try { raf.close(); } catch (IOException e) { e.printStackTrace(); } } if(baos != null){ try { baos.close(); } catch (IOException e) { e.printStackTrace(); } } } //思考:将StringBuilder替换为ByteArrayOutputStream }
ByteArrayOutputStream
字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。 详细知识:转载地址:http://xvuki.baihongyu.com/