Day37 IO流的操作

59 篇文章 0 订阅

Day37 IO流的操作

Java的文件拷贝

1、概念: 在Java中,可以使用IO流来实现文件的拷贝操作。一种常见的方式是使用FileInputStreamFileOutputStream来逐字节读取和写入文件内容。

2、思路:读取源文件,写入目标文件

3、示例:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Copy {
	public static void main(String[] args){
		
		//注意:小括号里创建的流会在try...catch后自动关闭
		try(FileInputStream fis = new FileInputStream("小雷.mp4");
				FileOutputStream fos = new FileOutputStream("copy.mp4");) {
			
			byte[] bs = new byte[1024];
			int len;
			while((len = fis.read(bs)) != -1){
				fos.write(bs, 0, len);
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

利用 文件字节输出流 向文件写入数据

1、思路:

  1. 准备要写入文件的数据和文件路径。
  2. 创建一个 FileOutputStream 对象,指定要写入的文件路径。
  3. 将要写入的数据转换为字节数组。
  4. 使用 FileOutputStream 对象的 write 方法将字节数组写入文件。
  5. 关闭 FileOutputStream 对象,确保数据被写入文件并释放资源。
  6. 在必要的情况下处理可能出现的 IOException 异常。

2、注意情况:

    1. 不处理异常
    1. 当文件存在时
    1. 当文件不存在时

​ 经验:所有的输出流,当文件不存在时都会创建该文件

    1. 在文件末尾追加内容

​ 经验:在文件末尾追加考虑基础流的构造方法

    1. 处理异常

3、示例:

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

public class Test03 {
	public static void main(String[] args) {
		
		
		FileOutputStream fos = null;
		try {
			//1.创建流对象 + 设置在文件末尾追加
			fos = new FileOutputStream("io.txt",true);
			
			//2.写入数据
			fos.write("123abc".getBytes());//写入byte数组
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			
			//3.关闭资源
			if(fos != null){
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}	
	}
}

利用 文件字节输入流 读取文件里的数据

1、思路:

  1. 准备要读取的文件路径。
  2. 创建一个 FileInputStream 对象,指定要读取的文件路径。
  3. 创建一个字节数组来存储读取的数据。
  4. 使用 FileInputStream 对象的 read 方法读取文件中的数据到字节数组中。
  5. 关闭 FileInputStream 对象,确保文件资源被释放。
  6. 将字节数组中的数据转换为字符串或进行其他处理。

2、注意情况:

  •  1) 不处理异常
    
  •  2) 文件存在
    
    1. 文件不存在

    经验:所有文件输入流,在文件不存在的情况下都会报错 – FileNotFoundException

  •  4) 处理异常
    

3、示例:

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

public class Test07 {
	public static void main(String[] args){
		
		
		FileInputStream fis = null;
		try {
			//1.创建流对象
			fis = new FileInputStream("io.txt");
			
			//2.读取数据
			//read(bs):读取bs长度的数据,并把数据放入数组,返回读取到的有效字节数,如果读取到文件末尾则返回-1
			byte[] bs = new byte[1024];
			int len;
			while((len = fis.read(bs)) != -1){
				System.out.println(new String(bs, 0, len));
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//3.关闭资源
			if(fis != null){
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

利用 带缓冲区的字节输出流 向文件写入数据

1、思路:

  1. 准备要写入文件的数据和文件路径。
  2. 创建一个 FileOutputStream 对象,用于向文件写入数据。
  3. 将 FileOutputStream 对象包装在一个 BufferedOutputStream 对象中,以提高写入性能。
  4. 将要写入的数据转换为字节数组。
  5. 使用 BufferedOutputStream 对象的 write 方法将字节数组写入缓冲区。
  6. 在适当的时机,调用 BufferedOutputStream 对象的 flush 方法将缓冲区中的数据刷新到文件中。
  7. 关闭 BufferedOutputStream 对象,确保数据被写入文件并释放资源。
  8. 在必要的情况下处理可能出现的 IOException 异常。

2、注意情况:

  • 1)不处理异常的方式

  • 2)文件存在的情况

  • 3)文件不存在的情况

    ​ 经验:所有的输出流,文件不存在的情况都会创建文件

  • 4)在文件末尾追加内容

    ​ 经验:在文件末尾追加考虑基础流的构造方法

  • 5)处理异常的方式

3、示例:

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

public class Test03 {
	public static void main(String[] args){
		
		
		BufferedOutputStream bos = null;
		try {
			//1.创建流对象
			bos = new BufferedOutputStream(new FileOutputStream("io.txt",true));
			//2.写入数据
			bos.write("123abc".getBytes());
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//3.关闭资源
			if(bos != null){
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

利用 带有缓冲区的字节输入流 读取文件里的数据

1、思路:

  1. 准备要读取的文件路径。
  2. 创建一个 FileInputStream 对象,用于从文件读取数据。
  3. 将 FileInputStream 对象包装在一个 BufferedInputStream 对象中,以提高读取性能。
  4. 创建一个字节数组或 ByteBuffer 来存储读取的数据。
  5. 使用 BufferedInputStream 对象的 read 方法从文件中读取数据到缓冲区中。
  6. 在适当的时机,处理从缓冲区中读取的数据,例如转换为字符串或进行其他处理。
  7. 关闭 BufferedInputStream 对象,确保文件资源被释放。
  8. 在必要的情况下处理可能出现的 IOException 异常

2、注意情况:

  •  1) 不处理异常
    
  •  2) 文件存在
    
    1. 文件不存在

    ​ 经验:所有输入流,当文件不存在都会报错

  •  4) 处理异常
    

3、示例:

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

public class Test06 {

	public static void main(String[] args) {
		
		
		BufferedInputStream bis = null;
		try {
			//1.创建流对象 (默认缓冲区大小:8192字节)
			bis = new BufferedInputStream(new FileInputStream("io.txt"));
			
			//2.读取数据 
			byte[] bs = new byte[1024];
			int len;
			while((len = bis.read(bs)) != -1){
				System.out.println(new String(bs, 0, len));
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//3.关闭资源
			if(bis != null){
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

利用 字符输出转换流 向文件写入数据

1、思路:

  1. 准备要写入文件的数据和文件路径。
  2. 创建一个 FileOutputStream 对象,用于向文件写入字节数据。
  3. 创建一个 OutputStreamWriter 对象,将 FileOutputStream 对象包装在其中,用于将字节流转换为字符流。
  4. 使用 BufferedWriter 对象包装 OutputStreamWriter 对象,以提高写入性能。
  5. 使用 BufferedWriter 对象的 write 方法将字符数据写入缓冲区。
  6. 在适当的时机,调用 BufferedWriter 对象的 flush 方法将缓冲区中的数据刷新到文件中。
  7. 关闭 BufferedWriter 对象和 OutputStreamWriter 对象,确保数据被写入文件并释放资源。
  8. 在必要的情况下处理可能出现的 IOException 异常。

2、注意情况

    1. 不处理异常
    1. 文件存在
    1. 文件不存在
      经验:所有的输出流,当文件不存在时都会创建文件
    1. 文件末尾追加
      经验:考虑基础流的构造方法
    1. 处理异常

注意:使用字符转换流最好加上编码格式!!!!!!!!!!!!!!!!!

3、示例:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class Test03 {
	public static void main(String[] args) {
		
		
		OutputStreamWriter osw = null;
		try {
			//1.创建流对象(将文件字节输出流 转换为 字符输出转换流)
			osw = new OutputStreamWriter(new FileOutputStream("io.txt",true),"UTF-8");
			
			//2.写入数据
			osw.write("123abc我爱你");
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//3.关闭资源
			if(osw != null){
				try {
					osw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

利用 字符输入转换流 读取文件里的数据

1、思路:

  1. 准备要读取的文件路径。
  2. 创建一个 FileInputStream 对象,用于从文件读取字节数据。
  3. 创建一个 InputStreamReader 对象,将 FileInputStream 对象包装在其中,用于将字节流转换为字符流。
  4. 使用 BufferedReader 对象包装 InputStreamReader 对象,以提高读取性能。
  5. 使用 BufferedReader 对象的 readLine 方法逐行读取文件中的字符数据。
  6. 在适当的时机,处理从 BufferedReader 中读取的字符数据,例如输出到控制台或进行其他处理。
  7. 关闭 BufferedReader 对象和 InputStreamReader 对象,确保文件资源被释放。
  8. 在必要的情况下处理可能出现的 IOException 异常。

2、注意情况:

    1. 不处理异常
    1. 文件存在
    1. 文件不存在
      经验:所有的输入流,在文件不存在时都会报错
    1. 处理异常

    注意:使用字符转换流最好加上编码格式!!!!!!!!!!!!!!!!!

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test07 {
	public static void main(String[] args){
		
		
		InputStreamReader isr = null;
		try {
			//1.创建流对象
			isr = new InputStreamReader(new FileInputStream("io.txt"),"UTF-8");
			
			//2.读取数据
			//isr.read(cs):读入cs数组长度的字符,将字符数据存入到数组中,并返回读取到的有效字节数,如果读取到文件末尾,则返回-1
			char[] cs = new char[1024];
			int len;
			while((len = isr.read(cs)) != -1){
				System.out.println(new String(cs, 0, len));
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//3.关闭资源
			if(isr != null){
				try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

字节流继承图
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值