IO流实现文件的拷贝

  • Post author:
  • Post category:其他




流(IO流):input-output-stream.

image

  • 作用:实现两个设备之间的通信.

  • 设备:内存,硬盘(磁盘),控制台,键盘,文件,网络

  • 网络:在网络上,你的主机之外的环境.

  • 流的分类:

    • 根据操作的方式分类:输入流和输出流

    • 根据数据的类型分类:字节流和字符流

      • 字节流:传输的字节,可以传输任意类型的数据.—-视频,音频,文件,图片等
      • 字符流:传输的也是字节,不同点在与传输的过程中加入了编码的操作,让我们在传输字符的时候更加的便捷——-文件
  • 以内存为参考

    • 字节流:–对应的父类
    • 字节输入流:InputStream
    • 字节输出流:OutputStream
  • 字符流:–对应的父类

  • 字符读入流(将数据输入内存):Reader

  • 字符写出流(将数据从内存取出):Writer

  • 先处理字符流:

  • 实例:以磁盘的存储为例,将内容写入文件

    • 分析:
    • 因为传输的是字符—字符流
    • 因为是从内存传出—写出流—FileWriter



注意点:

  • 注意点一:关联文件的特点:如果之前不存在,程序会自动创建一个,如果已经存在了,直接使用.但是会将原文件的内容覆盖.
  • 注意点二:如果只写名字,不写具体的路径,默认的路径是当前的工程.
  • 注意点三:我们可以指定自己的路径,但是一定要保证路径存在.否则报异常:FileNotFoundException: W:\temp1.txt (系统找不到指定的路径。)
  • 注意点四:在执行write方法时,数据被临时写入了流对象的内部数组中,这是一个字节数组,或默认取查编码表
  • 注意点五:流使用完后必须关闭
  • 注意点六:当流对象关闭后不能再进行任何操作,否则报异常:Stream closed
public static void main(String[] args) throws IOException {
	//创建写出流对象并关联内容写出的文件
	/*
	 * 注意点一:关联文件的特点:如果之前不存在,程序会自动创建一个,如果已经存在了,直接使用.但是会将原文件的内容覆盖.
	 * 注意点二:如果只写名字,不写具体的路径,默认的路径是当前的工程.
	 * 注意点三:我们可以指定自己的路径,但是一定要保证路径存在.否则报异常:FileNotFoundException: W:\temp1.txt (系统找不到指定的路径。)
	 */
	FileWriter fileWriter = new FileWriter("temp1.txt");
	
	//调用写出方法
	/*
	 * 注意点四:在执行write方法时,数据被临时写入了流对象的内部数组中,这是一个字节数组,或默认取查编码表
	 */
	fileWriter.write("bingbingAndChenchen");
	
	//调用刷新方法--会将内容真正的写入文件
	//fileWriter.flush();
	
	//关闭流---a:将流关闭     b:刷新
	//注意点五:流使用完后必须关闭
	fileWriter.close();
	//注意点六:当流对象关闭后不能再进行任何操作,否则报异常:Stream closed
	//fileWriter.write("zhangsan");
}



文件的续写: FileWriter(String file,boolean value)

  • 当value为true的时候,不会将原来的内容删除

  • :是转义字符 \t:制表符 \:普通的斜杠

  • 实现换行:\r\n–windows下的换行 linux:\n

public static void main(String[] args) {
	//创建对象并关联文件
	FileWriter fileWriter = null;
	try {
		fileWriter = new FileWriter("temp2.txt",true);
		
		//写
		fileWriter.write("bingbing");
		fileWriter.write("\r\n");
		fileWriter.write("zhansan");
		
		
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally {
		//关闭
		if (fileWriter != null) {
			try {
				fileWriter.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}



读文件的两种方式:

  • 第一种 :read()–一个字符一个字符的读
  • 第二种:read(字符数组)–一次可以读取多个字符,将读到的字符临时存储到了这个数组中.

    image

    实例:将数据从文件中取出–文件读入流(FileReader)



第一种 :read()–一个字符一个字符的读

public static void main(String[] args) throws IOException {
		//创建对象并关联文件,关联的文件必须存在
		FileReader fileReader = new FileReader("temp2.txt");
	
		
		//* 第一种 :read()--一个字符一个字符的读
		//a:会将当前的字符读出    b:将当前的指针后移一个字符
		int data;
//		data = fileReader.read();//这里得到是ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();//这里得到是ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();//这里得到是ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();//这里得到是ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();//这里得到是ASCII值
//		System.out.println((char)data);
//		data = fileReader.read();//这里得到是ASCII值
//		System.out.println(data);//这里返回的是-1,代表读完了.
		
		while ((data = fileReader.read()) != -1) {
			System.out.println((char)data);
		}
		
		//关闭流
		fileReader.close();
	}



第二种:read(字符数组)–一次可以读取多个字符,将读到的字符临时存储到了这个数组中.

public static void main(String[] args) throws IOException {
		//创建对象并关联文件,关联的文件必须存在
		FileReader fileReader = new FileReader("temp2.txt");
		
		
		/*
		 *数组是临时存放数据的地方,我们会将读到的字符放到数组中,数组的大小决定了我们一次可以读到的字符个数,
		 *但是从内存的角度考虑,临时数组并不是越大 越好,一般数组的大小在1Kb左右.
		 * 返回值:代表的是本次读到的真实字符的个数,如果返回值是-1代表读完了
		 */
		char[] arr = new char[2];
		int num;
//		num = fileReader.read(arr);
//		System.out.println(new String(arr,0,num)+"    "+num);
//		num = fileReader.read(arr);
//		System.out.println(new String(arr,0,num)+"    "+num);
//		num = fileReader.read(arr);
//		System.out.println(new String(arr,0,num)+"    "+num);//代表将字符数组从下标0开始的num个字符转成字符串
//		num = fileReader.read(arr);
//		System.out.println(new String(arr)+"    "+num);//-1,说明读完了
		
		while ((num = fileReader.read(arr)) != -1) {
			System.out.println(new String(arr,0,num)+"    "+num);
		}
		
		//关闭流
		fileReader.close();
	}



路径的讲解:

  • 相对路径和绝对路径

  • 实例: D:\workspace\BigData1715N19\src\com\qianfeng\test\Demo1.java 绝对路径

  • com\qianfeng\test\Demo1.java 相对路径

  • 相对路径:从路径中间的某个部位开始一直到当前的文件名字

  • 绝对路径:一个文件的完整路径,即从根目录开始的路径.

  • 路径中的/ \是转义字符 \==/



实例:实现文件的复制

  • 要求:将Demo1的内容拷贝到temp3.txt
public static void main(String[] args) throws IOException {

		//1.创建读入流与写出流并关联对应的文件
		FileReader fileReader = new FileReader("src/com\\qianfeng\\test\\Demo1.java");
		FileWriter fileWriter = new FileWriter("temp3.txt");
		
		//2.读写
		//一次多多个字符
//		char[] arr = new char[10];
//		int num;
//		while ((num = fileReader.read(arr)) != -1) {
//			//将字符数组的部分内容写入文件
//			fileWriter.write(arr, 0, num);
//		}
		
		//一次读一个字符
		int num;
		while ((num = fileReader.read()) != -1) {
			fileWriter.write(num);//自带了编码
		}
		
		//3.关闭资源
		fileReader.close();
		fileWriter.close();
	
	}



版权声明:本文为forever428原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。