黑马程序员---IO流的一些总结

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


IO流:
根据操作数据分为:字节流和字符流
 |-字节流的抽象基类:InputStream  OutputStream
 |-字符流的抽象基类:Reader  Writer


他们的子类都是以基类名作为后缀

根据流向分为:输入流和输出流


字符流:
字符流操作的都是文本文件,如果是别的类型的文件需要用字节流。

Reader
 |--BufferedReader :从字符输入流中读取文本,缓冲各个字符,
      从而实现字符、数组和行的高效读取
   构造方法: BufferedReader(Reader out)

   常用方法:
    String readLine() 读取一个文本行 读取一个文本行。通过下列字符之一即可
     认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
     
     返回:包含该行内容的字符串,不包含任何行终止符,
     如果已到达流末尾,则返回 null
     注意:在配合write()方法把数据写入文件中时,要注意使用newLine() 方法
   
  |--LineNumberReader 跟踪行号的缓冲字符输入流。
    此类定义了方法 setLineNumber(int) 和 getLineNumber(),
    它们可分别用于设置和获取当前行号。

 |--InputStreamReader :是字节流通向字符流的桥梁
   构造方法: InputStreamReader(InputStream in)
  
  |--FileReader :用于读取字符流。要读取原始字节流
   常用方法:
    int read() 读取单个字符。
    int read(char[] cbuf)  将字符读入数组。
    void close() 关闭该流并释放与之关联的所有资源,在IO流完后一定要调用该方法

Writer
 |--BufferedWriter :将文本写入字符输出流,缓冲各个字符,从而提供单个字符、
      数组和字符串的高效写入
   构造方法: BufferedWriter(Writer out)

   常用方法:
    newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属
     性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。
     因此调用此方法来终止每个输出行要优于直接写入新行符。
 
 |--OutputStreamWriter :是字符流通向字节流的桥梁
   构造方法:OutputStreamWriter(OutputStream out)

 
 |--FileWriter :用来写入字符文件的便捷类
   常用方法:
     void write(char[] cbuf) 写入字符数组。
     void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
     void write(int c) 写入单个字符。
     void flush()刷新该流的缓冲。 在每次写完数据后要调用该方法刷新缓冲区
     void close() 闭此流,但要先刷新它。 在IO流完后一定要调用该方法


字节流:

常用的方法和字符流基本相同,但是要注意的是这个使用 byte[]接收缓冲数据。
 而字符流使用 char[]

InputStream
 |--FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。

 |--FilterInputStream 类本身只是简单地重写那些将所有请求传递给所包含
     输入流的 InputStream 的所有方法
  |--BufferedInputStream 为另一个输入流添加一些功能。提高程序效率
   一般传 FileInputStream 对象,然后调用 InputStream 方法


OutputStream
 |--FileOutputStream

 |--FilterOutputStream 类本身只是简单地重写那些将所有请求传递给所包含
     输出流的 OutputStream 的所有方法
  |--BufferedOutputStream 该类实现缓冲的输出流。通过设置这种输出流,
     应用程序就可以将各个字节写入底层输出流中,
     而不必针对每次字节写入调用底层系统。提高程序效率
   一般传 FileOutputStream 对象,然后调用 OutputStream 方法

  |--PrintStream
   构造方法 PrintStream(File file)创建具有指定文件且不带自动行刷新的新打印流
      PrintStream(String fileName)
       创建具有指定文件名称且不带自动行刷新的新打印流。
      PrintStream(OutputStream out) 创建新的打印流。
   常用方法print、println,能打印输出字符,布尔型,整形,浮点性,字符串,
      注意:但是不能打印字节
 

流操作的规律:
最痛苦的就是流对象很多,不知道该用哪个

通过三个明确来完成。

1、明确源和目的
 源:输入流        InputStream Reader
 目的:输出流   OutputStream Writer
2、操作的数据是否纯文本
 是:字符流
 不是:字节流

3当体系明确后,再明确要使用哪个具体的对象
 通过设备来进行区分:
 源设备:内存,硬盘,键盘
 目的设备:内存,硬盘,控制台

流操作练习

1、将键盘录入的数据存储到文件中,指定编码表UFT-8

     源:文本文件,使用FileReader,但是其格式是UTF-8,所以需要使用InputStreamReader
  InputStreamReader isr = new InputStreamReader(new FileInputStream("test3.txt"),"UTF-8");
  需要提高效率吗?要,使用BufferedReader
  BufferedReader bufr = new BufferedReader(isr);
  目的:控制台;使用OutputStream
  需要提高效率吗?要
  BufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));

public static void output()throws IOException
	{
		
		InputStreamReader isr = new InputStreamReader(new FileInputStream("test3.txt"),"UTF-8");
		BufferedReader bufr = new BufferedReader(isr);
		BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

		String line = null;
		while ((line=bufr.readLine())!=null)
		{
			bufw.write(line);
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
		bufw.close();
	}

2、将一个文本数据打印在控制台上,要按照以上格式自己完成三个明确,文件编码格式为utf-8

    源:键盘,所以使用InputStream,需要提高效率吗?
  需要:BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  目的:Writer OutputStream
  是纯文本吗? 是 但是需要使用UTF-8来存储,所以使用OutputStreamWriter
  OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(),"UTF-8");

public static void intoFile()throws IOException
	{
		
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("test3.txt"),"UTF-8");
		BufferedWriter bufw = new BufferedWriter(osw);

		String line = null;
		while ((line=bufr.readLine())!=null)
		{
			if ("q".equals(line))
			{
				break;
			}
			bufw.write(line);
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
		bufw.close();
	}

把错误日志信息存储到文本文件中,在日志信息中要有时间

class  ExceptionInfo
{
	public static void main(String[] args) 
	{
		try
		{
			int[] arr = new int[2];
			System.out.println(arr[3]);
		}
		catch (Exception e)
		{
			try
			{
				//创建一个时间对象
				Date date = new Date();
				//把时间格式化,按照我们需要的格式打印
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				String time = sdf.format(date);
				//创建一个存储日志信息的文件
				PrintStream ps = new PrintStream("err.log");
				ps.println(time);
				//System.setOut(ps);
				e.printStackTrace(ps);
			}
			catch (Exception ex)
			{
				throw new RuntimeException("日志文件创建失败");
			}
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值