`

文件读写交替执行

    博客分类:
  • java
阅读更多

 

文件读写的几种方式

 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import org.apache.commons.io.FileUtils;

public class FileTest {

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

  long st=System.currentTimeMillis();
  String srcFile="D:\\DBW\\pig-0.14.0.tar.gz";
  String destFile="D:\\DBW\\log\\test.gz";
  
  
  
  copyFileThread(srcFile,destFile);
  
  long et=System.currentTimeMillis();
  System.out.println(et-st);
 }

 static void copyFileCommonIO(String srcFile,String destFile)throws IOException{
  FileUtils.copyFile(new File(srcFile), new File(destFile));//2546
 }
 
 static void copyFileStream(String srcFile,String destFile)throws IOException{//255
  FileInputStream fis=new FileInputStream(new File(srcFile));
  FileOutputStream fos=new FileOutputStream(new File(destFile));
  byte[] buf=new byte[8192];
  BufferedInputStream bs=new BufferedInputStream(fis);
  BufferedOutputStream bos=new BufferedOutputStream(fos);
  
  int len=0;
  
  do{
   len=bs.read(buf, 0, 8192);
   bos.write(buf, 0, len);
  }while(len==8192);
 
  bs.close();
  fis.close();
  bos.close();
  fos.close();
 }
 
 static void copyFileChannel(String srcFile,String destFile)throws IOException{//133
  FileChannel srcChl=new FileInputStream(new File(srcFile)).getChannel();
  FileChannel desChl=new FileOutputStream(new File(destFile)).getChannel();
  desChl.transferFrom(srcChl, 0, Long.MAX_VALUE);
  srcChl.close();
  desChl.close();
 }
 
 static void copyFileThread(String srcFile,String destFile)throws Exception{//480
  FileVO file=new FileVO();
  file.setSrcFile(srcFile);
  file.setDestFile(destFile);
  
  
  WriteThread w=new WriteThread(file);
  ReadThread r=new ReadThread(file);
  Thread t1=new Thread(w);
  t1.start();
  Thread t2=new Thread(r);
  t2.start();
  
  t1.join();
  t2.join();
 }
}

 

 

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ReadThread implements Runnable {
 private FileVO file;
 public ReadThread(FileVO file){
  this.file=file;
 }

 public void run() {
  FileInputStream fis=null;
  BufferedInputStream bs=null;
  try {
   fis = new FileInputStream(new File(file.getSrcFile()));
   byte[] buf=new byte[8192];
   bs=new BufferedInputStream(fis);
   int len=0;
   do{
    synchronized(file){
     len=bs.read(buf, 0, 8192);
     //System.out.println("read.."+len);
     file.setLen(len);
     file.setBuf(buf);
     file.notify();
     if(len<8192)
      break;
     file.wait();
    }
   }while(true);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e){
   e.printStackTrace();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  finally{
   try {
    bs.close();
    fis.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
 }

}

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class WriteThread implements Runnable {
 private FileVO file;
 public WriteThread(FileVO file){
  this.file=file;
 }
 
 public void run() {
  FileOutputStream fos=null;
  BufferedOutputStream bos=null;
  try {
   fos = new FileOutputStream(new File(file.getDestFile()));
   bos=new BufferedOutputStream(fos);
   do{
   synchronized(file){
    if(file.getLen()==0){
     file.wait();
    }
    //System.out.println("write.."+file.getLen());
    bos.write(file.getBuf(), 0, file.getLen());
    if(file.getLen()<8192)
     break;
    file.setLen(0);
    file.notify();
   }
   }while(true);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e){
   e.printStackTrace();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  finally{
   try{
   bos.close();
   fos.close();
   }catch(IOException e){
    e.printStackTrace();
   }
  }
 }

}

public class FileVO {
 private String srcFile;
 private String destFile;
 //private volatile int len;
 private int len;
 private byte[] buf;
 
 public String getSrcFile() {
  return srcFile;
 }
 public void setSrcFile(String srcFile) {
  this.srcFile = srcFile;
 }
 public String getDestFile() {
  return destFile;
 }
 public void setDestFile(String destFile) {
  this.destFile = destFile;
 }
 public int getLen() {
  return len;
 }
 public void setLen(int len) {
  this.len = len;
 }
 public byte[] getBuf() {
  return buf;
 }
 
 
 public void setBuf(byte[] buf) {
  this.buf = buf;
 }
 
 
}

分享到:
评论

相关推荐

    FPGA控制SRAM的读写

    例如,`FPGA 读写 sram的vhdl 程序.txt`文件可能包含了创建一个简单的读写控制器的VHDL代码,该控制器根据输入的地址和数据,在时钟上升沿触发读写操作。 在FPGA内部实现双口RAM,可以极大地提高数据处理能力。双口...

    python 实现两个线程交替执行

    在实际应用中,这种技术可以用于多个线程共享资源的场景,例如数据库连接、文件读写等,确保资源在任何时候只有一个线程访问,避免了数据冲突。 总之,Python的`threading.Lock`是实现线程同步的关键工具,通过正确...

    YUV420读写

    - `ipch`目录可能包含编译器的中间缓存文件,`testyuv`可能是实际的源代码或可执行文件。 在实际应用中,开发者可能会使用如OpenCV这样的库,它提供了方便的函数来处理YUV数据。理解YUV420的存储格式和转换方法...

    WindowsNT文件系统内幕

    4. **文件安全与权限**:NTFS提供了详细的访问控制机制,通过ACE(Access Control Entry)和ACL(Access Control List)来定义用户或组对文件和目录的权限,如读、写、执行等。此外,NTFS还支持文件和目录的权限继承...

    文件拷贝(read() write()实现)

    在C语言中,文件操作是通过一系列的系统调用来完成的,其中`open()`、`read()`和`write()`函数是进行文件读写的核心。本文将深入探讨如何使用这三个函数来实现文件的拷贝功能。 首先,我们来看`open()`函数。`open...

    操作系统试验一源代码-读写者问题

    7. **并发与并行**:在操作系统中,并发指的是多个任务在同一时间段内交替执行,而并行则是指多个任务在同一时刻执行。在多核处理器中,可以实现真正的并行,而在单核处理器上,通过时间片轮转等方式实现并发。 8. ...

    使用线程复制文件

    在单核CPU中,操作系统通过时间片轮转的方式让不同的线程交替执行,模拟出并发的效果。在多核CPU中,线程则可以真正地并行执行,进一步提升效率。 二、线程同步 线程同步是多线程编程中的关键概念,它确保在特定...

    操作系统课程设计(采用读写平等策略的读者写者问题)完整版内含代码.pdf

    - **测试用例与运行结果**:设计不同的测试场景,验证程序的正确性和性能,如多个读者同时读,单个写者写入,读者与写者交替等。 在实际实现过程中,可以使用如P/V操作(信号量)来实现进程间的同步和互斥。例如...

    MFC线程复制文件程序

    在单核处理器系统中,这些线程会通过时间片轮转的方式交替执行,而在多核处理器系统中,不同线程可以真正地在同一时间执行,提高程序的响应速度和效率。 在MFC中,我们可以通过两种方式创建线程:派生自CWinThread...

    单片机C语言源码学习参考-双色点阵双色交替动态显示.zip

    在电子工程领域,单片机(Microcontroller Unit, MCU)是一种集成化芯片,它将CPU、内存、定时器/计数器以及输入/输出接口等组件整合在一个芯片上,用于控制各种设备或系统的运行。本资源"单片机C语言源码学习参考-...

    HPC高性能计算项目IOZONE测试报告.docx

    该测试在吞吐量模式下进行,每个线程或进程执行读或写操作,采用轮询方式交替执行读写操作。 - **BackwardsRead(倒序读取)**: 测试倒序读取文件的性能。虽然不常见,但某些应用程序(如MSC Nastran)会使用这种...

    课程设计案例-五子棋

    在数据管理方面,输入和输出都需要通过文件进行,这要求开发者熟悉文件的读写操作。例如,游戏状态和历史记录可以被序列化并保存到磁盘,以便游戏可以被中断并重新加载。 核心数据结构是棋盘,用二维字符数组`...

    verilog fifo 乒乓缓冲区操作

    乒乓缓冲区是一种双缓冲技术,它通过两个或多个独立的存储空间交替工作来实现连续的数据流处理。在系统运行过程中,一个缓冲区负责接收新数据,而另一个缓冲区则负责读取和处理数据。当一个缓冲区满或者空时,两个...

    C语言的五子棋程序

    在实际开发中,为了使程序更加健壮和用户友好,还可能包括错误处理(例如,非法输入或文件读写错误)、用户界面(命令行或图形界面)、游戏规则的其他细节(如禁手规则)等。C语言的灵活性使得开发者可以直接控制...

    C++大作业:五子棋程序.zip

    10. **文档**:项目应该包含清晰的README文件,解释如何编译和运行程序,以及任何特定的安装或依赖需求。 通过这个项目,学生不仅可以巩固C++基础知识,还能深入理解面向对象编程和游戏逻辑的设计,同时提升问题...

    题集及答案.pdf(三套操作系统期末考试复习题,包括选择题,判断题,简答题,综合题。)

    并发指的是两个或多个事件在同一时间间隔内发生,意味着这些事件可以在同一个处理器上交替执行。而并行指的是在物理上同一时刻同时发生,通常需要多个处理器。并行和并发通常在多线程或多进程的环境中被广泛使用。 ...

    华东理工大学网教操作系统1期末复习题及参考答案.docx

    5. **并发与并行**:并发程序在同一时间段内看似同时执行,但可能交替占用CPU;并行程序则是真正的在同一时刻执行,通常发生在多处理器系统中。 6. **进程调度**:进程调度的关键在于选择合适的调度算法,如时间片...

    txt文本读取

    6. **缓冲区管理**:C++的流类会自动管理缓冲区,但在某些情况下,可能需要手动刷新缓冲区,比如在读写交替进行时。使用`flush()`函数可以确保当前缓冲区的内容立即写入文件。 在VC6.0环境下,编译和运行C++程序时...

    行业分类-设备装置-实现脚本并行执行的方法.zip

    4. **异步编程**:异步I/O模型,如Node.js中的事件循环和回调函数,或者Python的`asyncio`库,允许脚本在等待I/O操作(如网络请求或文件读写)时执行其他任务,提高系统吞吐量。 5. **并行库和工具**:特定语言和...

Global site tag (gtag.js) - Google Analytics