流模型【一】

本文介绍了Java中的流模型,包括字节流和字符流的基本概念、核心类以及使用方法。通过样例展示了如何进行文件拷贝和移动,并探讨了在不同场景下选择字节流或字符流的考量因素。最后总结了读写文件的最佳实践和内存节点流的使用。
摘要由CSDN通过智能技术生成

今天整理和回顾了java中的流模型的使用方法,针对一些练习题,编辑了针对性的代码,解决问题,加深了对流模型的理解和记忆

流模型

主要目的:屏蔽具体实现的区别,使用统一的方法进行编程

  • 输入和输出
  • 字节和字符
  • 节点和过滤 装饰模式
  • BIO NIO AIO

字节流

父类InputStream和OutputStream
一次一字节的操作方式,一般用于声音、图像、视频之类的二进制文件

InputStream
方法: - read():int -1 - read(byte[]):int -1 - close():void - FileInputStream主要用于操作文件 - System.in 主要用于接收用户输入
OutputStream
方法: - write(int):void - write(byte[],int,int):void - close():void - FileOutputStream主要用于操作文件 - newFileOutputStream(“文件名称”)采用文件覆盖的方式操作 - new FileOutputStream(“文件名称”,boolean是否采用追加操作) - System.out和System.err 用于输出到标准输出设备

样例

文件的拷贝

public class Test1 {
   
       public static void main(String[] args) throws IOException {
   
//try/resource的写法,会自动执行关闭操作,但是要求实现closeable接口
try (OutputStream os = new FileOutputStream("data.txt",true);
     InputStream is = new FileInputStream("Test1.java");) {
   
    int kk;
      while ((kk = is.read()) > -1) {
   
os.write(kk);
            }
         }
     }
//由于是一次读取一字节的操作,所以在操作输出时会有问题,但是文件拷贝不会有任何问题
}

上面的方法采用的是一次一字节的操作方法,效率较低,可以考虑引入byte[]缓存的方式提高执行效率

public class Test01 {
   
	public static void main(String[] args) throws IOException {
   
		try (OutputStream os = new FileOutputStream("text.txt"); 
				InputStream is = new FileInputStream("Test01.java")) {
   
			int kk;
			byte[] a  =new byte[8192];
			while ((kk = is.read(a)) > -1) {
   
				String ss = new String(a,0,kk);
				System.out.println(ss);
				os.close();
			}
		}
	}
}

复杂样例

  • 实现文件夹的拷贝和移动
  • 文件夹的深度无法提前预知,所以这里采用递归调用的方式进行操作
public class Test02 {
   
	private static String source;
	private static String target;

	public static void main(String[] args) {
   
		source = "G:/Users/52255/Desktop/PS";
		target = "G:/";
	}

	public static void copy(File file) throws IOException {
   
		if (file != null && file.exists()) {
   
			if (file.isDirectory()) {
   
				String path = file.getAbsolutePath();
				String newpath = path.replace(source, target);
				File tmp = new File(newpath);
				if (!tmp.exists())
					tmp.mkdirs();
				File[] fs = file.listFiles();
				if (fs != null && fs.length > 0)
					for (File temp : fs)
						copy(temp);
			}else if(file.isFile()){
   
				String path = file.getAbsolutePath();
				String newpath = path.replace(source, target);
				try(
						InputStream is = new FileInputStream(file);
						OutputStream os = new FileOutputStream(newpath)
						){
   
					byte[] buffer = new byte
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值