【Java基础】JavaIO流详解

什么是IO流

I就是 In,输入的意思,O就是Out输出的意思

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。

Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

使用IO流的好处

可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源抽象表述为"流"。

IO流分支

IO流分为字节流、字符流

字节流
InputStream、OutputStream

字符流
Reader、Writer

然而字节流下又有分支:
FileInputStream、FileOutputStream

字符流分支
FileReader、FileWriter
BufferedReader、BufferedWriter

字节流与字符流的区别

首先,字节流读取或写入文件是按照字节的方式写入、读取的,该情况下读取、写入英文没问题,但是写入或读取中文的时候会出现乱码问题,原因是因为一个中文字符占2个甚至3个字节,然而英文字符只占1个字节,这就造成了读取或输入的问题,我们十一字符流就不会出现这种状况,字符流读取一个字符的大小,有效的避免了乱码问题

采用缓冲区读取文件、写入文件会大大提升系统的性能

BufferedReader、BufferedWriter该类是采用了装饰器模式,统一封装文件输入流的格式,调用统一的方法

使用IO流实现文件的输入输出

基于IO流实现文件的拷贝,需拷贝子文件夹以及子文件夹的文件。
解题思路:利用递归实现文件夹拷贝,一层层往里进,看是否有文件,若有,执行前一遍复制的操作,这样就达到了拷贝文件夹以及子文件夹。

public class FileCopy {

	public static void main(String[] args) {
		//源文件
		String path = "C:/Users/Desktop/0611";
		//目标地址
		String path2 = "C:/Users/Desktop/0611(复制版)";
		//将目标路径放入File类中
		File f2 = new File(path2);
		//检测文件路径是否存在,若不存在,则创建文件夹,防止文件未找到异常导致程序崩溃
		if (!f2.exists()) {
			//创建文件夹
			f2.mkdirs();
		}
		//调用方法,传入实参,开始拷贝文件夹
		copyFile(path, path2);
	}
	
	/**
	 * 拷贝文件,利用递归拷贝子文件夹以及文件
	 * @param path1	源文件路径
	 * @param path2	目标文件路径
	 */
	public static void copyFile(String path1, String path2) {
		File file = new File(path1);
		File[] files = file.listFiles();
		for (File file2 : files) {
			if (file2.isDirectory()) {
				String newPath = path2 + File.separator + file2.getName();
				File f2 = new File(newPath);
				System.out.println(f2.getAbsolutePath());
				f2.mkdirs();
				System.out.println("创建成功~");
				copyFile(file2.getAbsolutePath(), newPath);
			}
			if (file2.isFile()) {
				try {
					InputStream is = new FileInputStream(file2.getAbsolutePath());
					int num = is.available();
					byte[] bs = new byte[num];
					OutputStream os = new FileOutputStream(path2 + File.separator + file2.getName());
					int realLen = is.read(bs, 0, bs.length);
					os.write(bs, 0, realLen);
					System.out.println("写入成功~");
					if (is != null) {
						is.close();
					}
					if (os != null) {
						os.close();
					}
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
}


成功完成文件的拷贝

小结

如果我写的文章对您有帮助,那就为我点个赞吧,谢谢~

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值