【File2】

IO流    I = Input = 输入    O = Output = 输出

    流:指的是数据从源点传输到汇点的管道而已

流的分类:
    按照方向分:    输入流   输出流        *:参照物:正在写的Java程序
    按照单位分:    字节流   字符流
    按照功能分:    节点流   过滤流(包装流、处理流)

一起上路:

InputStream    所有字节输入流统一的父类 抽象类
    int read()
    int read(byte[] data)
    int read(byte[] data,int off,int len)

OutputStream    所有字节输出流统一的父类 抽象类
    write(int data)
    write(byte[] data)
    write(byte[] data,int off,int len)

FileInputStream     输入流 字节流 节点流
FileOutputStream    输出流 字节流 节点流
    *: 它们都是节点流 构造方法允许传入String路径或者File对象
    *: 虽然它们都是节点流 但是只能连接文件(皮肤) 
        不能连接目录(石头) 否则 直接触发异常 【拒绝访问!】
    *: FileInputStream 最常用的是 read(byte[])
    *: FileOutputStream 最常用的却是 write(byte[],int,int)
    *: FileInputStream 以-1作为读取结束的标识
    *: FileOutputStream是节点输出流
        节点输出流创建对象的时候 如果连接的文件不存在
        也会在创建流的第一时间自动创建出来 不需要手建
        其实File类当中有个方法叫createNewFile() 咱没讲
        但是如果连接的目录结构都不存在 将直接异常,所以目录结构必须自己建
        File类有个方法叫mkdirs()    一等优先级
    *: FileOutputStream是节点输出流 杀伤性极强
        如果连接的文件已经存在 
        也会在创建流的那一刻被新的空白文件直接替换
        如果我们的需求是在原有内容的最后 追加新内容
        此时 构造方法可以传参 指定追加模式开启
        new FileOutputStream("abc.txt",true);
    *: 无论何时何地 不要让节点输入流和
        节点输出流同时连接同一文件 否则怎样都是错
    *: 你要学会标准try catch 和 TWR两种形式处理异常

BufferedInputStream    输入流 字节流 过滤流
BufferedOutputStream    输出流 字节流 过滤流
    *: 作为过滤流的它们 给原本的节点流添加缓冲空间
        从而提高每次读写的吞吐量 进而提高效率
    *: 它们都是过滤流 不能直接连接文件 只能连接其它的流
    *: 它们构造方法第二个参数 都允许指定缓冲空间的大小
        默认8192 也就是8k
    *: BufferedInputStream 最常用的read()
    *: BufferedOutputStream 最常用的write()
    *: BufferedInputStream 以-1作为读取结束的标识
    *: BufferedOutputStream 是带缓冲的输出流
        使用带缓冲的输出流 务必注意及时清空缓冲
        以防止数据滞留缓冲空间导致丢失
        缓冲区什么情况下会清空:
            1.满了自动清空无需操作
            2.关闭流的操作会触发清空缓冲
            3.手动清空缓冲 主动调用flush();


DataInputStream        输入流 字节流 过滤流
DataOutputStream    输出流 字节流 过滤流
    *: 作为过滤流的它们 是为了给原本的流
        添加读写基本数据类型的功能的
    *: 它们都是过滤流 不能直接连接文件 只能连接其它的流

       boolean char byte short int long float double
    *: DataInputStream 提供的核心方法  readXxxx()  有返回值
    *: DataOutputStream 提供的核心方法 writeXxxx() 要参数
    *: DataInputStream 不能再以-1作为读取结束的标识了
        一旦到达文件结尾 还继续尝试读取
        将直接触发EOFException => End Of File


ObjectInputStream    输入流 字节流 过滤流
ObjectOutputStream    输出流 字节流 过滤流
    *: 作为过滤流的它们 是为了给原本的流
        添加读写对象的功能的
    *: 它们都是过滤流 不能直接连接文件 只能连接其它的流
    *: ObjectInputStream 核心方法 readObject() 有返回值
    *: ObjectOutputStream 核心方法 writeObject() 要参数
    *: ObjectInputStream 同样不能以-1作为读取结束的标识
        如果已经达到文件结尾 还继续尝试读取
        将直接触发EOFException
    *: 想要持久化 首先需要序列化
        想要被保存到磁盘文件当中的对象 它的类型
        必须要实现序列化接口 implements Serializable
        如果要保存的这个对象当中有其它引用类型的属性
        就连这些属性的类型 也必须要实现序列化接口
        如果某些属性无关紧要 不需要参与持久化存储
        可以使用修饰符transient修饰 
            transient => 不参与持久化
    *: 如果想要持久化的是一个集合对象
        则必须保证集合当中的元素的类型必须实现序列化接口
        如果要持久化的是一个使用了比较器的TreeSet或者TreeMap
        就连比较器的类型也要实现序列化接口
        (因为比较器是TreeSet或者TreeMap的一个属性)

import java.io.*;
public class TestFileInputStreamOne{
	public static void main(String[] args)throws Exception{
		FileInputStream fis = new FileInputStream("abc.txt");
		int data;//一个字节一个字节的读!!!,不是 int len
		while((data = fis.read()) != -1){
			System.out.print((char)data);
		}
	}
}

import java.io.*;
public class TestFileInputStreamTwo{
	public static void main(String[] args)throws Exception{
		FileInputStream fis = new FileInputStream("abc.txt");
		byte[] data = new byte[3];//配合大数组读取
		int len;
		while((len = fis.read(data)) != -1){
			//打印我们读取到的数据
			for(int i = 0;i < len;i++){
				System.out.print((char)data[i]);
			}
		}
		fis.close();
	}
}
import java.io.*;
public class TestFileCopy{
	public static void main(String[] args)throws Exception{
		FileInputStream fis = new FileInputStream("src.zip");
		FileOutputStream fos = new FileOutputStream("copy.zip");
		byte[] data = new byte[5<<20];
		int len;
		while((len = fis.read(data)) != -1){
			fos.write(data,0,len);//!!!
		}
		fos.close();//!!!
		fis.close();//!!!
	}
}
import java.io.*;
//TestExceptionPlus3 + TestExceptionPlus4
public class TestFileCopyWithTryCatch{
	public static void main(String[] args){
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try{
			fis = new FileInputStream("src.zip");
			fos = new FileOutputStream("copyTryCatch.zip");
			byte[] data = new byte[5<<20];
			int len;
			while((len = fis.read(data)) != -1){
				fos.write(data,0,len);
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				fos.close();
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				try{
					fis.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}
}
import java.io.*;
//TWR => Try-With-Resources => 带有资源控制的try catch语法
/*
	定义在小括号当中的资源 会在代码执行离开大括号的时候
		自动的逆向关闭				since JDK7.0
*/
public class TestFileCopyWithTWR{
	public static void main(String[] args)throws Exception{
		try(FileInputStream fis = new FileInputStream("src.zip");
			FileOutputStream fos = new FileOutputStream("copyTWR.zip")){

			byte[] data = new byte[5<<20];
			int len;
			while((len = fis.read(data)) != -1){
				fos.write(data,0,len);//!!!
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
import java.io.*;
public class TestFocus{
	public static void main(String[] args)throws Exception{
		FileInputStream fis = new FileInputStream("test.txt");
		FileOutputStream fos = new FileOutputStream("test.txt",true);//开启追加模式,但是找不到-1 结束不了

		int data;//一个一个字节的读
		while((data = fis.read()) != -1){
			fos.write(data);
		}
		fos.close();
		fis.close();
	}
}
/*
	请找出c:\\所有的.jpg图片
		并且将其复制到d:\\foto目录当中

		*:foto目录本身并不存在 需要自己用代码建
		*:c盘下不同的子目录当中 可能会有重名的文件 不能直接复制
			在foto目录下 不使用原有文件名 以序列编号命名
				00001.jpg
				00002.jpg
				00003.jpg
				....
*/
import java.io.*;
public class BigOne{
	static int id;
	public static void main(String[] args){
		File dir = new File("d:\\foto");
		if(!dir.exists()){
			dir.mkdirs();
		}
		kill(new File("c:\\"));
	}
	public static void kill(File ff){
		File[] ds = ff.listFiles((x) -> x.isDirectory());
		File[] js = ff.listFiles((x) -> x.isFile() && x.getName().toLowerCase().endsWith(".jpg"));
		if(ds == null) return;
		for(File f: ds){
			kill(f);
		}
		for(File f : js){
			//复制它
			String newName = String.valueOf(++id);
			while(newName.length() < 5){
				newName = "0" + newName;
			}
			newName += ".jpg";

			File tar = new File("d:\\foto",newName);
            
			try(FileInputStream fis = new FileInputStream(f);//!!!
				FileOutputStream fos = new FileOutputStream(tar)){//!!!

					byte[] data = new byte[65536];
					int len;
					while((len = fis.read(data)) != -1){
						fos.write(data,0,len);
					}

			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
}
/*
	请找出c:\\所有的.jpg图片
		并且将其复制到d:\\foto目录当中

		*:foto目录本身并不存在 需要自己用代码建
		*:c盘下不同的子目录当中 可能会有重名的文件 不能直接复制
			在foto目录下 不使用原有文件名 以序列编号命名
				00001.jpg
				00002.jpg
				00003.jpg
				....
*/
import java.io.*;
public class BigOneAG{
	static int id;
	public static void main(String[] args){
		createTarget();
		kill(new File("c:\\"));
	}
	//创建目标文件夹的方法
	public static void createTarget(){
		File dir = new File("d:\\foto");
		if(!dir.exists()){
			dir.mkdirs();
		}
	}
	//得到下一个文件名的方法!!!
	public static String nextName(){
		String str = String.valueOf(++id);
		StringBuffer buff = new StringBuffer(str);
		while(buff.length() < 5){
			buff.insert(0,"0");
		}
		buff.append(".jpg");
		return buff.toString();
	}
	//复制文件的方法
	public static void copy(File src,File tar){
		try(FileInputStream fis = new FileInputStream(src);
			FileOutputStream fos = new FileOutputStream(tar)){

				byte[] data = new byte[65536];
				int len;
				while((len = fis.read(data)) != -1){
					fos.write(data,0,len);
				}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	//递归遍历
	public static void kill(File ff){
		File[] ds = ff.listFiles((x) -> x.isDirectory());
		File[] js = ff.listFiles((x) -> x.isFile() && x.getName().toLowerCase().endsWith(".jpg"));
		if(ds == null) return;
		for(File f: ds){
			kill(f);
		}
		for(File f : js){
			String newName = nextName();
			File tar = new File("d:\\foto",newName);
			copy(f,tar);
		}
	}
}
import java.io.*;
public class TestBufferedStream{
	public static void main(String[] args)throws Exception{
		FileInputStream fis = new FileInputStream("src.zip");
		BufferedInputStream bis = new BufferedInputStream(fis,5<<20);//默认8k

		FileOutputStream fos = new FileOutputStream("BufferedStream.zip");
		BufferedOutputStream bos = new BufferedOutputStream(fos,5<<20);

		int data;//!!!
		while((data = bis.read()) != -1){//!!!
			bos.write(data);//!!!
		}
		bos.close();
		bis.close();
	}
}
import java.io.*;
public class TestDataStream{
	public static void main(String[] args)throws Exception{
		/*int level = 9999;
		FileOutputStream fos = new FileOutputStream("level.data");
		DataOutputStream dis = new DataOutputStream(fos);
		dis.writeInt(level);//!!!
		dis.close();*/

		FileInputStream fis = new FileInputStream("level.data");
		DataInputStream dis = new DataInputStream(fis);
		int okay = dis.readInt();//!!!
		dis.close();
		System.out.println(okay);
	}
}
import java.io.*;
public class HelloWorld{
	public static void main(String[] args)throws Exception{
		int count = 1;
		File file = new File("count.data");
		//再读档
		if(file.exists()){
			FileInputStream fis = new FileInputStream(file);
			DataInputStream dis = new DataInputStream(fis);
			count = dis.readInt();//!!!
			dis.close();
		}
		if(count > 10){
			System.out.println("请充值后访问");
			return;
		}
		System.out.println("你已经访问了" + count + "次");
		count++;
		//先存档
		FileOutputStream fos = new FileOutputStream(file);
		DataOutputStream dos = new DataOutputStream(fos);
		dos.writeInt(count);//!!!
		dos.close();
	}
}

import java.io.*;
public class HelloWorld{
	public static void main(String[] args){
		int time = 1;
		File file = new File("cs.data");
		if(file.exists()){
			try(DataInputStream dis = new DataInputStream(new FileInputStream(file))){
				time = dis.readInt();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		if(time > 10){
			System.out.println("请缴费后继续使用");
			return;
		}
		System.out.println("HelloWorld : " + time);
		time++;
		try(DataOutputStream dos = new DataOutputStream(new FileOutputStream(file))){
			dos.writeInt(time);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
import java.io.*;
import java.util.*;
public class TestObjectStream{
	public static void main(String[] args)throws Exception{

		Date today = new Date();

		FileOutputStream fos = new FileOutputStream("月光宝盒.data");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(today);//!!!
		oos.close();
	}
}

import java.io.*;
import java.util.*;
public class TestObjectStream{
	public static void main(String[] args)throws Exception{
		FileInputStream fis = new FileInputStream("月光宝盒.data");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Object obj = ois.readObject();//!!!
		Date theDate = (Date)obj;//!!!
		ois.close();
		System.out.println(theDate);
	}
}
import java.io.*;
public class TestObjectStreamPlus{
	public static void main(String[] args)throws Exception{

		Teacher tea = new Teacher("JayZhou",36);

		FileOutputStream fos = new FileOutputStream("电冰箱.data");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(tea);
		oos.close();

		/*
		FileInputStream fis = new FileInputStream("电冰箱.data");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Object obj = ois.readObject();
		System.out.println(obj);
		ois.close();
		*/
	}
}
class Computer{
	String logo;
	public Computer(String logo){
		this.logo = logo;
	}
}

class Teacher implements Serializable{//标识
	String name;
	int age;
	//transient => 短暂的 转瞬即逝的 => 不参与持久化的
	transient Computer pc;
	public Teacher(String name,int age){
		this.name = name;
		this.age = age;
		pc = new Computer("Lenovo");
	}
	@Override
	public String toString(){
		return name + " : " + age;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值