JAVA核心技术I 对RandomAccessFile有描述,所以才决定学习一下这个类的使用,不看不知道,原来这个类有点高大上..........;
RandomAccessFile类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。
该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
RandomAccessFile实现了数据输入输出流的接口;可以随机存储硬盘的文件,但是来自网络的文件就不行
RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式("r"),还是以读写方式("rw")打开文件
1, 第一个疑问;随机存储流在读写文件时如何定位
代码如下;
package 随机存储流; import java.io.FileNotFoundException; import java.io.RandomAccessFile; /** * 随机存储流的测试,随机存储流不会删除前面的,会在后面添加 * * @author Administrator * */ public class DemoRandomIO { public static void main(String[] args) { try { //实例化随机存储流,不需要创建文件的路径 RandomAccessFile Raf = new RandomAccessFile("file", "rw"); //创建一个字符串数组并初始化 String[] name = new String[3]; name[0] = "JAVA"; name[1] = "android"; name[2] = "C++"; //遍历数组 for(int i = 0;i<name.length;i++){ //使用随机流将数组写出去 Raf.writeUTF(name[i]); } //添加元素 Raf.seek(Raf.length()); Raf.writeUTF("SSH"); //使用seek将Raf.length()执行数组的第一个 Raf.seek(0); //遍历使用偏移量来遍历,每移动一下就打印出数据 while(Raf.getFilePointer()<Raf.length()){ System.out.println(Raf.readUTF()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行结果;
JAVA
android
C++
SSH
2,++++++++随机存储流实现文件的复制
package 随机存储流; import java.io.FileNotFoundException; import java.io.RandomAccessFile; /** * 随机存储流的测试, * * @author Administrator * */ public class DemoRandomIO { public static void main(String[] args) { try { //实例化随机存储流,不需要创建文件的路径 RandomAccessFile Raf = new RandomAccessFile("file", "rw"); //创建一个字符串数组并初始化 String[] name = new String[3]; name[0] = "JAVA"; name[1] = "android"; name[2] = "C++"; //遍历数组 for(int i = 0;i<name.length;i++){ //使用随机流将数组写出去 Raf.writeUTF(name[i]); } //添加元素 Raf.seek(Raf.length()); Raf.writeUTF("SSH"); //使用seek将Raf.length()执行数组的第一个 Raf.seek(0); // //遍历 // while(Raf.getFilePointer()<Raf.length()){ // System.out.println(Raf.readUTF()); // } System.out.println(Raf.readUTF()); System.out.println(Raf.readUTF()); System.out.println(Raf.readUTF()); //文件复制 System.out.println("开始复制......."); Raf.seek(0);//将文件指向开始的地方 //定义复制的文件 RandomAccessFile fileCopy = new RandomAccessFile("fileCopy", "rw"); //获取Raf文件长度 int len = (int)Raf.length(); //根据文件的长度创建字节数组 byte[] by = new byte[len]; //将Raf的文件内容读到数组中 Raf.readFully(by); //将写到InRaf文件中 fileCopy.write(by); System.out.println("复制完毕....."); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行结果:
JAVA android C++ SSH 开始复制....... 复制完毕.....
怎么知道filecopy文件是否已经真的全部复制Raf文件中的数据,遍历filecopy文件中的数据
fileCopy.seek(0); System.out.println("复制的;"+fileCopy.readUTF()); System.out.println("复制的;"+fileCopy.readUTF()); System.out.println("复制的;"+fileCopy.readUTF());
运行结果;
复制的;JAVA 复制的;android 复制的;C++
3,+++++实现多线程同时下载,将文件内容分割成几小块下载,代码如下
package 随机存储流; /** * 随机数据存储流多线程下载文件的简单实现,主窗口 */ import java.io.File; import java.io.FileNotFoundException; import java.io.RandomAccessFile; public class DemoTest { public static void main(String[] args) { try { // 实例化随机存储流,创建文件的路径 File file = new File("F:Raf.txt"); RandomAccessFile Raf = new RandomAccessFile("file", "rw"); //设置文件的大小 Raf.setLength(22*3); Raf.close(); // 创建一个字符串数组并初始化 String[] name = new String[3]; name[0] = "JAVA"; name[1] = "android"; name[2] = "C++"; //使用多线程来下载 for(int i = 0;i<name.length;i++){ DemoTestThread th = new DemoTestThread(1024*i,name[i].getBytes()); th.start(); } System.out.println("下载完毕..."); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package 随机存储流; import java.io.FileNotFoundException; import java.io.RandomAccessFile; /** * 创建线程 * * @author Administrator * */ public class DemoTestThread extends Thread { // 创建线程需要文件大小和文件内容 private int len; private byte[] con; private boolean islive = true; //创建构造方法 public DemoTestThread(int len, byte[] con) { this.len = len; this.con = con; } @Override public void run() { while(islive){ try { RandomAccessFile Raf = new RandomAccessFile("F:Raf.txt", "rw"); Raf.seek(len); Raf.write(con); Thread.sleep(50); } catch (Exception e) { islive =false; // TODO Auto-generated catch block e.printStackTrace(); } } } }
运行结果:
创建的文件
文件中的内容
相关推荐
主要介绍了Java中IO流 RandomAccessFile类实例详解的相关资料,需要的朋友可以参考下
File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...
主要为大家详细介绍了Java核心编程之文件随机读写类RandomAccessFile,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
多线程随机读取文件RandomAccessFile
java api中的java.io.RandomAccessFile类实现文件的随机写入.
java基础——IO流及File-RandomAccessFile对象.docx
使用RandomAccessFile流将一个文本文件读出,并导致写入到另一个文件当中。
在JAVA程序设计不少涉及到对文件的读写操作,本例针对这方面的问题,介绍RandomAccessFile类的文件读写操作,文件中包含有1个java文件和1个class文件
下面小编就为大家带来一篇Java RandomAccessFile的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java中正确使用RandomAccessFile向文件中写入中文
因为使用其他文件流修改文件时是整体的替换,导致SVN上传上去后是整个文件都修改了,所以需要增量修改,这个demo是使用RandomAccessFile增量修改,只修改指定的行,很实用
本篇文章主要介绍了Java使用RandomAccessFile类对文件进行读写,详细的介绍了RandomAccessFile类的使用技巧和实例应用,有兴趣的可以了解一下
介绍有关java常见的输入输出流。包括File类、RandomAccessFile类、字节流与字符流等。
RandomAccessFile随机文本,使用多线程处理复制文件
1.3.10 随机存取文件 RandomAccessFile 1.3.11 小结 1.4 java中的一些常用词汇 1.5 J2SE学习中的30个基本概念 1.6 Java线程 1.7 Java 5.0多线程编程 1.8 Java Socket编程 1.9 Java的内存泄漏 1.10 抽象类与接口的...
文件操作——File 、 RandomAccessFile(上).mp4
【IT十八掌徐培成】Java基础第16天-01.RandomAccessFile.zip
56-IO流(RandomAccessFile).avi
体会RandomAccessFile随机访问文件的用法