您所在的位置:主页 > Java培训 >

Java随机存取文件流,读取或写入数据

时间:2014-04-11 10:34来源:未知 作者:疯狂java 点击:

  RandomAccessFile是一种特殊的流类,它可以在文件的任何地方读取或写入数据。打开一个随机存取文件后,要么对它进行只读操作,要么对它同时读写操作。具体的选择是在构造方法的第二个参数指定成一个“r”(只读)或者“rw”(同时读写)、“rws”、“rwd”来实现。

  RandomAccessFile in=new RandomAccessFile("d:\\IOTest\\bjhyn.wmv","r");

  RandomAccessFile inout=new RandomAccessFile("d:\\IOTest\\bjhyn.wmv","rwd");

  随机存取文件的行为类似于存储在文件系统中的一个大型byte数组,它提供了一个指向该数组的光标或索引,称为文件指针,该文件指针用来标志将要进行读写操作的下一字节的位置,getFilePointer方法可以返回文件指针的当前位置。而使用seek方法可以将文件指针移动到文件内部的任意字节位置。随机存取文件流中提供了很多读取数据和写入数据的方法,具体可以参阅帮助文档的详细介绍。随机存取文件只限于操作磁盘文件,不能访问来自网络或内存映像的流。

  如下示例是一个使用RandomAccessFile类多线程下载网络资源的示例程序。本例是一个比较综合的例子,使用到了线程、IO流、网络连接的知识,读者能看懂即可。大致的原理是:获取网络资源的总长度,按线程数分成快,每一块数据由一个多线程下载;利用多线程下载是,先用BufferedInputStream流从网络中读取数据,然后用RandomAccessFile流写入指定文件的指定位置中去

  package com.qiujy.corejava13;

  import java.io.BufferedInputStream;

  import java.io.File;

  import java.io.IOException;

  import java.io.RandomAccessFile;

  import java.net.URL;

  import java.net.URLConnection;

  /** 利用多线程下载文件的示例 */

  public class MultiThreadDownloadTest {

  public static void main(String[] args) throws IOException {

  String urlStr = "http://www.fkit.org/soft/bjhyl.mp3"; //资源地址

  URL url = new URL(urlStr); //创建URL

  URLConnection con = url.openConnection(); //建立连接

  int contentLen = con.getContentLength(); //获得资源总长度

  int threadQut = 10; //线程数

  int subLen = contentLen / threadQut; //每个线程要下载的大小

  int remainder = contentLen % threadQut; //余数

  File destFile = new File("D:\\IOTest\\bjhyl.mp3"); //目标文件

  /////创建并启动线程

  for (int i = 0; i < threadQut; i++) {

  int start = subLen * i; //开始位置

  int end = start + subLen -1; //结束位置

  if(i == threadQut - 1){ //最后一个线程的结束位置

  end += remainder;

  }

  Thread t = new Thread(new DownloadRunnable(start, end, url,

  destFile));

  t.start();

  }

  }

  }

  /** 线程下载类 */

  class DownloadRunnable implements Runnable {

  private final int start;

  private final int end;

  private final URL srcURL;

  private final File destFile;

  public static final int BUFFER_SIZE = 8192; //缓冲区大小

  DownloadRunnable(int start,int end, URL srcURL, File destFile) {

  this.start = start;

  this.end = end;

  this.srcURL = srcURL;

  this.destFile = destFile;

  }

  public void run() {

  System.out.println(Thread.currentThread().getName() + "启动...");

  BufferedInputStream bis = null;

  RandomAccessFile ras = null;

  byte[] buf = new byte[BUFFER_SIZE];//创建一个缓冲区

  URLConnection con = null;

  try {

  con = srcURL.openConnection(); //创建网络连接

  //设置连接的请求头字段:获取资源数据的范围从start到end

  con.setRequestProperty("Range", "bytes=" + start + "-" + end);

  //网络连接中获取输入流并包装成缓冲流

  bis = new BufferedInputStream(con.getInputStream());

  ras = new RandomAccessFile(destFile, "rw"); //创建RandomAccessFile

  ras.seek(start); //把文件指针移动到start位置

  int len = -1; //读取到的字节数

  while((len = bis.read(buf)) != -1){ //从网络中读取数据

  ras.write(buf, 0, len); //用随机存取流写到目标文件

  }

  System.out.println(Thread.currentThread().getName() + "已经下载完毕");

  }catch(IOException e){

  e.printStackTrace();

  }finally{

  //关闭所有的IO流对象

  if(ras != null){

  try { ras.close();} catch (IOException e) {

  e.printStackTrace();}

  }

  if(bis != null){

  try { bis.close();} catch (IOException e) {

  e.printStackTrace();}

  }

  }

  }

  }

  在本机联网的情况下,运行本程序。视网络情况,一段时间后就可以在本地磁盘D:\IOTest目录下产生一个bjhyl.mp3音乐文件。