JavaSE入门学习44:文件传输基础之I/O流(三)

三字节流的使用

       6)FileOutputStream--->实现了向文件中写出byte数据的方法

       FileOutputStream继承了OutputStream抽象类。

       FileOutputStream类中的方法:


       实例代码1:

<span style="font-size:18px;">import java.io.*;

public class FileOutDemo1{
	public static void main(String[] args) throws IOException {
		//如果该文件不存在,则直接创建,如果存在,删除后创建
		FileOutputStream out = new FileOutputStream("E:\\Java\\JavaSE\\IO\\out.dat");
		out.write('A');//写出了'A'的低八位
		out.write('B');//写出了'B'的低八位
		int a = 10;//write只能写八位,那么写一个int需要些写4次,每次8位
		out.write(a >>> 24);
		out.write(a >>> 16);
		out.write(a >>> 8);
		out.write(a);
		byte[] gbk = "中国".getBytes("gbk");
		out.write(gbk);
		out.close();
		
		IOUtil.printHex("E:\\Java\\JavaSE\\IO\\out.dat");
	}
}</span>

       运行结果:


       文件拷贝

       实例代码2:

<span style="font-size:18px;">import java.io.*;

public class IOUtil{
	/*
	 * 文件拷贝,字节批量读取
	 */
	public static void copyFile(File srcFile,File destFile) throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件");
		}
		FileInputStream in = new FileInputStream(srcFile);
		FileOutputStream out = new FileOutputStream(destFile);
		byte[] buf = new byte[8*1024];
		int b ;
	        while((b = in.read(buf,0,buf.length))!=-1){
	    	      out.write(buf,0,b);
	    	      out.flush();//最好加上
	       }
	       in.close();
	       out.close();
	}

	public static void main(String[] args) {
		try{
			IOUtil.copyFile(new File("E:\\Java\\JavaSE\\IO\\test.txt"), new File("E:\\Java\\JavaSE\\IO\\test1.txt"));
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}</span>

       运行结果:


       

       7)DataOutputStream类/DataInputStream类

       对"流"功能的扩展,可以更加方面的读取int、long、字符等类型数据。此类体现了设计模式中的装饰模式。

       DataInputStream类中常用的方法:



       DataOutputStream类中常用的方法:



         实例1:

import java.io.*;

public class DisDemo{
	public static void main(String[] args) throws IOException{
	    String file = "E:\\Java\\JavaSE\\IO\\demo\\dos.dat";
	    IOUtil.printHex(file);
	    DataInputStream dis = new DataInputStream(new FileInputStream(file));
	    int i = dis.readInt();
	    System.out.println(i);
	    i = dis.readInt();
	    System.out.println(i);
	    long l = dis.readLong();
	    System.out.println(l);
	    double d = dis.readDouble();
	    System.out.println(d);
	    String s = dis.readUTF();
	    System.out.println(s);
            dis.close();
	}
}

       运行结果:


         实例2:

import java.io.*;

public class DosDemo{
        public static void main(String[] args) throws IOException {
            String file = "E:\\Java\\JavaSE\\IO\\demo\\dos.dat";
            DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
            dos.writeInt(10);
            dos.writeInt(-10);
            dos.writeLong(10l);
            dos.writeDouble(10.5);
            //采用utf-8编码写出
            dos.writeUTF("中国");
            //采用utf-16be编码写出
            dos.writeChars("中国");
            dos.close();
            IOUtil.printHex(file);
        }
}

       运行结果:


       8)BufferedInputStream类/BufferedOutputStream类

       这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入;或读取操作时,都会加上缓冲,这种流模式提

高了IO的性能从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中。

       BufferedInputStream类的方法:


       BufferedOutputStream类的方法:


       FileOutputStream--->write()方法相当于一滴一滴地把水“转移”过去。

       DataOutputStream-->writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移”过去。

       BufferedOutputStream--->write方法更方便,相当于一飘一瓢先放入桶中,再从桶中倒入到另一个缸中,性能提

高了。

      实例代码:

import java.io.*;

public class IOUtil{
	/*
	 * 文件拷贝,字节批量读取
	 */
	public static void copyFile(File srcFile,File destFile) throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件");
		}
		FileInputStream in = new FileInputStream(srcFile);
		FileOutputStream out = new FileOutputStream(destFile);
		byte[] buf = new byte[8*1024];
		int b ;
	        while((b = in.read(buf,0,buf.length))!=-1){
	    	      out.write(buf,0,b);
	    	      out.flush();//最好加上
	        }
	        in.close();
	        out.close();
	}

	/*
	 * 进行文件的拷贝,利用带缓冲的字节流
	 */
	public static void copyFileByBuffer(File srcFile,File destFile) throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件");
		}
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
		int c ;
		while((c = bis.read())!=-1){
			bos.write(c);
			bos.flush();//刷新缓冲区
		}
		bis.close();
		bos.close();
	}

	/*
	 * 单字节,不带缓冲进行文件拷贝
	 */
	public static void copyFileByByte(File srcFile,File destFile)throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件");
		}
		FileInputStream in = new FileInputStream(srcFile);
		FileOutputStream out = new FileOutputStream(destFile);
		int c;
		while((c = in.read())!=-1){
			out.write(c);
			out.flush();
		}
		in.close();
		out.close();
	}
	
	public static void main(String[] args) {
		try{
			//三种方法读取写入的时间不一样		
			IOUtil.copyFileByBuffer(new File("E:\\Java\\JavaSE\\IO\\FileUtils.java"),newFile(
                                        "E:\\Java\\JavaSE\\IO\\aa.txt"));
				
			IOUtil.copyFileByByte(new File("E:\\Java\\JavaSE\\IO\\FileUtils.java"), new File(
					"E:\\Java\\JavaSE\\IO\\bb.txt"));
					
			IOUtil.copyFile(new File("E:\\Java\\JavaSE\\IO\\FileUtils.java"), new File(
					"E:\\Java\\JavaSE\\IO\\cc.txt"));		
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

      运行结果:


       测试拷贝时间:

import java.io.*;

public class IOUtil{
	/*
	 * 文件拷贝,字节批量读取
	 */
	public static void copyFile(File srcFile,File destFile) throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件");
		}
		FileInputStream in = new FileInputStream(srcFile);
		FileOutputStream out = new FileOutputStream(destFile);
		byte[] buf = new byte[8*1024];
		int b ;
	        while((b = in.read(buf,0,buf.length))!=-1){
	    	      out.write(buf,0,b);
	    	      out.flush();//最好加上
	        }
	        in.close();
	        out.close();
	}
	
	/*
	 * 进行文件的拷贝,利用带缓冲的字节流
	 */
	public static void copyFileByBuffer(File srcFile,File destFile) throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件");
		}
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
		int c ;
		while((c = bis.read())!=-1){
			bos.write(c);
			bos.flush();//刷新缓冲区
		}
		bis.close();
		bos.close();
	}
	
	/*
	 * 单字节,不带缓冲进行文件拷贝
	 */
	public static void copyFileByByte(File srcFile,File destFile)throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件");
		}
		FileInputStream in = new FileInputStream(srcFile);
		FileOutputStream out = new FileOutputStream(destFile);
		int c ;
		while((c = in.read())!=-1){
			out.write(c);
			out.flush();
		}
		in.close();
		out.close();
	}
	
	public static void main(String[] args) {
		try{
			long start=System.currentTimeMillis();
			//IOUtil.copyFileByByte(new File("E:\\Java\\JavaSE\\IO\\1.mp3"), new File(
			//		"E:\\Java\\JavaSE\\IO\\2.mp3"));//测试的为95042毫秒,最慢
			
			//IOUtil.copyFileByBuffer(new File("E:\\Java\\JavaSE\\IO\\1.mp3"), new File(
			//		"E:\\Java\\JavaSE\\IO\\3.mp3"));//测试的为4799毫秒,中等速度
					
			IOUtil.copyFile(new File("E:\\Java\\JavaSE\\IO\\1.mp3"), new File(
					"E:\\Java\\JavaSE\\IO\\4.mp3"));//测试的为60毫秒,最快
            long end=start=System.currentTimeMillis();
            System.out.println(end-start);			
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

      运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值