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();
		}
	}
}

运行结果:

时间: 2024-08-27 20:48:59

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

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

五字符流的使用 (1)编码问题 这个问题我们早就说过了,不再过多赘述. 参考:JavaSE入门学习42:文件传输基础之I/O流(一) (2)认识文本和文本文件 Java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码):而文件是byte byte byte ...的数据 :文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk等)序列化为byte的存储结果. (3)字符流(Reader Writer)---->操作的是文本文本文件 字符的

JavaSE入门学习7:Java基础语法之语句(下)

继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for. (5)Java循环语句之while 语法: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 运行

JavaSE入门学习6:Java基础语法之运算符和语句(上)

继续接着上篇:JavaSE入门学习5:Java基础语法(一)来看Java的基础语法. 五运算符 运算符是一种"功能"符号,用以通知Java进行相关的运算.比方.我们须要将变量age的值设置为20.这时候就 须要一个"=",告诉程序须要进行赋值操作. Java 语言中经常使用的运算符可分为例如以下几种:算术运算符,赋值运算符,比較运算符,逻辑运算符,条件运符. (1)算术运算符 算术运算符主要用于进行主要的算术运算.如加法.减法.乘法.除法等. Java 中经常使用的

JavaSE入门学习46:文件传输基础之I/O流(五)(Java序列化)

六对象的序列化和反序列化 (1)序列化和反序列化概述 Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的 数据.有关对象的类型的信息和存储在对象中数据的类型. 将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息.对 象的数据,还有对象中的数据类型可以用来在内存中新建对象. 整个过程都是Java虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上 反序列化该对象. (2

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

三RandomAccessFile类的的使用 RandomAccessFile类是java提供的对文件内容的访问类,既可以读文件,也可以写文件.RandomAccessFile类 支持随机访问文件,可以访问文件的任意位置. RandomAccessFile类的构造方法: RandomAccessFile类中的方法: (1)java文件模型 在硬盘上的文件是byte byte byte存储的,是数据的集合. (2)打开文件 有两种模式"rw"(读写),"r"(只读).

JavaSE入门学习5:Java基础语法(一)

一关键字 关键字概述:Java语言中有一些具有特殊用途的词被称为关键字.关键字对Java的编译器有着特殊的意义,在程 序中应用时一定要慎重. 关键字特点:组成关键字的字母全部小写. 关键字注意事项:goto和const作为保留字存在,当前并不使用. Java中常用的50个关键字(48个加2个保留字,就当背英文单词啦): 关键字     描述 abstract    抽象方法,抽象类的修饰符 assert    断言条件是否满足 boolean    布尔数据类型 break    跳出循环或者l

JavaSE入门学习9:Java基础语法之数组

一数组的定义 数组可以理解为是一个巨大的"盒子",里面可以按顺序存放多个类型相同的数据,比如可以定义int型的数组 scores存储4名学生的成绩. 数组中的元素都可以通过下标来访问,下标从0开始.例如,可以通过scores[0]获取数组中的第一个元素76, scores[2]就可以取到第三个元素92. 二操作数组只需要四个步骤: 1声明数组 语法:数据类型[ ] 数组名:或者 数据类型 数组名[ ]: 其中,数组名可以是任意合法的变量名,如: 2分配空间 简单地说,就是指定数组中最多

JavaSE入门学习4:搭建Java开发环境(二)

在上一篇的博文JavaSE入门学习3:搭建Java开发环境(一)中说到我们配置了Path变量的一种方式,再来说说第 二种配置方式,这种配置方式是必须掌握的. path环境变量配置方式2 我们为什么要将第二种配置形式呢?那第一种的配置方式有什么缺点吗?假设我的计算机上安装了两个JDK,一 个是1.7,一个1.8,我刚才配置的是1.8的,那么我需要配置1.7,需要重新配置Path环境变量,有可能在修改Path环 境变量的同时误删其它的东西,所以不建议使用第一种. path环境变量的参照形配置方式的步

【RL-TCPnet网络教程】第38章 TFTP简单文件传输基础知识

第38章      TFTP简单文件传输基础知识 本章节为大家讲解TFTP(Trivial File Transfer Protocol,简单文件传输协议)的基础知识,方便后面章节的实战操作. (本章的知识点主要整理自网络) 38.1  初学者重要提示 38.2  TFTP基础知识参考资料 38.3  TFTP基础知识点 38.4  总结 38.1  初学者重要提示 TFTP简单文件传输协议在实际项目中有比较重要的实用价值,需要初学者对TFTP的基础知识也有个认识. 38.2  TFTP基础知识