IO流

IO流的输入/输出是从程序的角度来讲的。(从外部(磁盘)流到内存或者程序中,称为输入流【数据从程序外流向程序】。从内存输出到磁盘中,称为输出流【数据从程序流出】)。 


流的分类

1、按照方向来分类:输入流(InputStream)、输出流(OutputStream)。

2、按照类型来分类:字节流(XXXStream)、字符流(Writer、Reader)。

3、按照操作方式来分类:节点流、过滤流

4、转换流(InputStremReader、OutPutStreamReader)

输入流

使用IO流的基本步骤:
1、定义流
2、创建流
3、创建一个字节数组来存取读取的信息
4、使用一个整数len来表示读取的长度
5、循环读取数据,只要len大于0说明读取到元素,可以直接对元素进行操作
6、读取完成后使用close方法关闭流

流使用完成后应记得在finally块中关闭

通过文件输入流读取文件内容,并在控制台打印:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class InputStreamTest {
	public static void main(String[] args) {
		//1、定义一个文件流
		FileInputStream fis = null;
		try {
			//2、创建流
			fis = new FileInputStream("d:/1.txt");
			//3、创建一个文件输入流
			byte[] array = new byte[1024];
			//4、创建一个字节数组来存取读取的信息
			int len = 0;
			//5、循环读取数据,只要len大于0说明读取到元素,可以直接对元素进行操作
			while((len = fis.read(array))!=-1)
			{
				System.out.write(array,0,len);
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally
		{
			try {
				if(fis != null)
				{
					//读取完成后使用close方法关闭流
					fis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

输出流

通过文件输出流实现实现文件的拷贝:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyFile {
	public static void main(String[] args) {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		
		try {
			fis = new FileInputStream("d:/1.txt");
			//创建一个文件输出流
			fos = new FileOutputStream("d:/temp.txt");
			
			byte[] array = new byte[1024];
			int len = 0;
			//将数据通过输入流读取到程序中
			while((len = fis.read(array)) != -1)
			{
				//将数据通过输出流输出,此时是一个文件输出流,就把数据输出到文件中
				fos.write(array, 0, len);
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally
		{
			//关闭流
			try {
				if(fos != null)
				{
					fos.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();
			}
		}
	}
}

字节流

通过字节读取数据,通常是XXXStream

字符流

通过字符来读取数据,只要处理的数据是字符数据,全部用字符流
Writer和Reader


对于字符流而言:读用BufferedReader,写用PrintWriter


字符流用来读取字符数据,对于输入字符流而言,最为常用操作方法使用BufferedReader,因为该流有一个readLine()方法,该方法可以一行一行的读取数据并且返回字符串

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class CharacterTest {
	public static void main(String[] args) {
		BufferedReader br = null;
		PrintWriter pw = null;
		
		try {
			br = new BufferedReader(new FileReader("d:/1.txt"));
			//使用文件字符流写文件,加上缓冲流提高效率,写用PrintWriter
			pw = new PrintWriter(new BufferedWriter(new FileWriter("d:/temp.txt")));
			
			String str = null;
			
			while((str = br.readLine()) != null)
			{
				pw.println(str);
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally
		{
			if(pw != null)
			{
				pw.close();
			}
			
			if(br != null)
			{
				try {
					br.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

节点流

可以直接创建的流

过滤流

可以装饰节点流,增加相应的功能
对于缓冲流,一定要关闭,不然如果缓冲区不满就不会刷新,可以通过bos.flush()刷新缓冲
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FilterTest {
	public static void main(String[] args) {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		
		try {
			//在文件输入流的基础上加入一个缓冲流,以此提高效率
			bis = new BufferedInputStream(new FileInputStream("C:\\Users\\asus\\Pictures\\1.jpg"));
			bos = new BufferedOutputStream(new FileOutputStream("d:/temp.jpg"));
			
			byte[] array = new byte[1024];
			int len = 0;
			
			while((len = bis.read(array)) != -1)
			{
				bos.write(array, 0, len);
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally
		{
			//对于缓冲流,一定要关闭,不然如果缓冲区不满就不会刷新,可以通过bos.flust()刷新缓冲
			try {
				if(bis != null)
				{
					bis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
			try {
				if(bos != null)
				{
					bos.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
}

转换流

将字节流转换为字符流
InputStreamReader
OutputStreamWriter
在控制台输入,直到输入exit时退出程序:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Consoletest {
	public static void main(String[] args) {
		BufferedReader br = null;
		
		try {
			//把字节流转换为字符流方便进行字符处理
			br = new BufferedReader(new InputStreamReader(System.in));
			String str = null;
			while((str = br.readLine()) != null)
			{
				if("exit".equals(str))
				{
					break;
				}	
				System.out.println(str);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally
		{
			try {
				if(br != null)
				{
					br.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

流的操作

字节流的常用操作

读:

写:

字符流的操作

读数据使用BufferedReader,因为有readLine()方法,写数据使用PrintWriter,可以使用println


标准流的操作

System.in是标准输入流,但是由于是字节流,不方便操作,所以通过情况会将其转换为字符流来处理,通过转换流转换,然后再使用BufferedReader来封装

常用流

a)文件流(File):
非常常用,进行文件的读写操作
b)
缓冲流(Buffered):
过滤流用来提高效率的
c)数据流:
用来读取基本数据类型DataOuputStream和DateInputStream,数据流是过滤流



d)对象流(Object):对象流可以完成对对象的存储
1、必须实现Serializable接口
2、可以把一些属性设置为transient,此时这个属性就不会被存储

读取和存储对象可以使用ObjectOutputStream和ObjectInputStream读取,如果要从文件中读取,需要用这两个流封装一下文件流


序列化

1、一个类若想被序列化,则需要实现java.io.Serializable接口,该接口中没有定义任何方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个类的对象是可以序列化的。
2、在序列化时,static变量是无法序列化的;如果A包含了对B的引用,那么在序列化A的时候也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么当序列化A的时候就会发生异常,这时就需要将对B的引用设为transient,该关键字表示变量不会被序列化。

IO流中的装饰模式。。。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值