【java】io流


数据流

数据流就是数据传输的过程

根据流向分为:

输入流:从程序的外部流向程序

​ 输入操作 read()

输出流:从程序内部流向程序外部

​ 输出操作 write()

根据数据传输单位分为:

字节流:以字节为单位 (图片,视频)

字符流:以字符为单位 (文本)

形成了四中流 java.io有对流的实现

字节输入流:InputStream 所有字节输入流的超类

字节输出流:OutputStream 所有输出字节流的超类

字符输入流:Reader 读取字符的抽象类

字符输出流: Writer 写入字符的超类

按照不同的功能,又可以进行分类

1 文件流:程序与文件之间进行数据传输

​ FileInputStream 文件字节输入流

​ FileOutputStream 文件字节输出流

​ FileReade 文件输入流

​ FileWriter 文件输出流

2 网络流:程序与网络之间进行数据传输

文件流

FileInputStream(文件字节输入流)

将数据以字节的方式从文件读入到程序中

主要用来与read()方法

public class Demo04 {
	public static void main(String[] args) {
		FileInputStream fis = null;
		try {
			//创建一个文件字节输入流
			fis = new FileInputStream("D:\\text.txt");
			//从文件中读取数据
			System.out.println(fis.available());
			//只读取一个字节
			while (true) {
			int i = fis.read();
			if (i==-1) { //i==-1说明走到了末尾
				break;
			}
			System.out.println(i);
			}

		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}finally {
			//关闭流
			try {
				if (fis != null) fis.close();
			} catch (IOException e) {
				
				e.printStackTrace();
			}
		}
		
	}
}

FileOutputStream (文件字节输出流)

将文件以字节的方式写入到文件中

public class Demo01 {
	public static void main(String[] args) {
		try {
			//如果文件不存在,会自动创建
			FileOutputStream fos = new FileOutputStream("D:\\test01.txt");
			//追加的方式会在原有的最后写    "D:\\test01.txt", true
			//不追加的方式会把原有的东西删除掉 从头开始写	"D:\\test01.txt"
			//向文件中写入内容
			fos.write(49);
			//创建一个数组
			byte [] bs = {51,52,53,54,55,56,57,58,59};
			fos.write(bs);    //写入整个数组
			fos.write(bs,2,3);//从下标2的位置开始写 写入3个
			
			
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}
}

FileReade (文件字符输入流)

用于读取字符的便捷类

public static void main(String[] args) {
		FileReader fr = null;
		try {
			fr = new FileReader("D:\\text.txt");
			//读入文件中的字符
			//读取一个字符
			int i = fr.read();
			char c = (char) i;
			System.out.println(c);
			//读多个字符
			while(true) {
			char [] cbuf = new char[10];
			int res = fr.read(cbuf);
			
			if (res == -1) {
				break;
			}
			for (int j=0; j<res; j++) {
				System.out.println(cbuf[j]);
			}
			}
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}finally {
			try {
				if (fr!=null)
				fr.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

FileWriter (文件字符输出流)

public static void main(String[] args) {
		FileWriter fw = null;
		try {
			fw = new FileWriter("D:\\text.txt");
			//写字符串
			fw.write("java");//先将这些数据写入缓冲区  通过flush写入到缓冲区
			fw.write("c++");
			fw.write("php");
			fw.flush(); //将缓冲区的内容写入到文件
		} catch (IOException e) {
			
			e.printStackTrace();
		}finally {
			try {
					if (fw!=null)
					fw.close();
				} catch (IOException e) {
					
					e.printStackTrace();
				}
		}
	}
}

包装流/装饰流/增强流

装饰者模式:java23设计模式中的一种

在不改变原来的流程的基础上,通过包装类对其功能增强

字符缓冲流 BufferedReader

public class Demo04 {
  public static void main(String[] args) {
  	FileReader fr = null;
  	BufferedReader br =null;
  	try {
  		//先创建原始流文件字符输入流
  		 fr = new FileReader("D:\\text.txt");
  		//包装起来
  		br = new BufferedReader(fr);//传达原始流的参数
  		while (true) { //while读取全部
  		//可以整行读
  		//BufferedReader读到末尾时,返回null;
  		String str = br.readLine();
  		if (str == null) {
  			break;
  		}
  		System.out.println(str);
  		
  		}
  	} catch (FileNotFoundException e) {
  		e.printStackTrace();
  	} catch (IOException e) {
  		
  		e.printStackTrace();
  	}finally {
  		//先关闭包装流,再关别原始流
  	try {
  		if (br!=null)
  			br.close();
  	} catch (IOException e) {
  		e.printStackTrace();
  	}
  	
  	try {
  		if (fr!=null)
  		fr.close();
  	} catch (IOException e) {
  		e.printStackTrace();
  	}
  	}
  
  }

BufferedWriter

public static void main(String[] args) {
		FileWriter fw = null;
		BufferedWriter bw =null;
		try {
			//原始流
			  fw= new FileWriter("D:\\text.txt");
			//包装
			 bw = new BufferedWriter(fw); //使用原始流的参数
			//先将数据存到缓冲区
			bw.write("青岛工学院");
			bw.newLine();//创建一个新的行  换行操作
			bw.write("信息工程学院");
			bw.newLine();//创建一个新的行  换行操作
			bw.write("****2班");
			bw.newLine();//创建一个新的行  换行操作
			
			bw.flush(); //调用缓冲区的内容
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			//先关闭包装流,再关闭原始流
			try {
				//避免出现空指针
				if (bw!=null)
				bw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if (fw!=null)
				fw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

对象流

直接把一个对象保存到流中

从流中读取一个对象

ObjectInputStream

public class Student implements Serializable {
	private static final long serialVersionUID = -7280199762758808625L;
	private String name;
	private String sex;
	private String age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
	}
	
}

public static void main(String[] args) {
		FileInputStream fis = null;
		ObjectInputStream ois = null;
		try {
			fis = new FileInputStream("D:\\student.obj");
			ois = new ObjectInputStream(fis);
			//从流中读取对象的操作,反序列化
			Student student = (Student) ois.readObject();
			
			System.out.println(student);
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		}finally {
			try {
				if(ois!=null)
				ois.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				if(fis!=null)
				fis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	
}

ObjectOutputStream

public class Student implements Serializable {
	private static final long serialVersionUID = -7280199762758808625L;
	private String name;
	private String sex;
	private String age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
	}
	
}
 public class Demo06 {
	public static void main(String[] args) {
		Student student = new Student();
		student.setName("tom");
		student.setAge("20");
		student.setSex("男");
		//保存到文件中 student.obj
		//输出流
		//文件字节输出流作为原始流
		FileOutputStream fos = null;
		ObjectOutputStream ous = null;
		try {
			 fos = new FileOutputStream("D:\\student.obj");
			 
			 ous = new ObjectOutputStream(fos);
			 //将对象写入流的过程叫做序列化
			 ous.writeObject(student);
			 //如果保存10个对象,将10个对象放在一个Arraylist中
			 //再把Arraylist放到文件中
			 
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}finally {
			try {
				if (ous!=null)
				ous.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				if (fos!=null)
				fos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值