黑马程序员—IO流

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


IO流是用来处理设备之间的数据传输,java对数据的操作就是通过流的方式。

流按操作数据分为两种:字节流和字符流

流按流向分为:输入流和输出流

一、字符流

字符流的抽象基类:Writer Reader。由这两个类派生出来的子类都是以其父名作为后缀。

1、FileWriter 专门用于操作文件的writer对象。

1)创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件,而且该文件会被创建到指定的目录下。如果该目录下已有同名文件,将被覆盖。

FileWriter(String fileName)

根据给定的文件名构造一个 FileWriter 对象。要处理IO异常。

(2)write方法:将字符串写入到流中

(3)  flush方法 :将流中的数据写入指定文件中,刷新后流可以继续使用。

(4) Close方法:把流中数据写到指定文件中,关闭流资源。后面就不能再使用流。

(5) FileWriter(String fileName, boolean append)
          根据给定的文件名以及指示是否附加写入数据的 boolean 值来 构造 FileWriter 对象。

2FileReader 对象

创建一个文件的读取流对象,和指定文件相关联,要保证文件存在。

1) FileReader(String fileName)

在给定从中读取数据的文件名的情况下创建一个新 FileReader

 (2) read()读取单个字符。会自动往下读。

  read(char[] cbuf) 将字符读入数组。
          

3、字符流缓冲区(BufferedWriter 和  BufferedReader)

1、为了提高流的操作效率。所以提出了字符缓冲区技术。

怎么应用缓冲区?

(1)创建流对象

(2)将流对象作为参数传递给缓冲区的构造函数即可

(3)刷新缓冲区

(4)关闭

2、BufferedReader提供了一个跨平台的换行方法。newLine()。

3、BufferedReader方法提供了了特有的方法:ReaderLine();按行读,没有就返回null,方便与对文件和数据的读取。

4、readLine的原理:这个 方法是基于read方法的,就是把回车符之前的数据都一个一个的写到一个数组里面,然后返回这行数据。

4、装饰设计模式

把对已有对象进行功能增强的时候,就可以定义类将已有对象传入,基于已有功能,并提供加强功能,那么定义的类就是装饰类

装饰类是通过构造方法接收被装饰的对象。

 

继承与装饰的区别?

避免继承类的臃肿,降低类与类之间的关系。因为装饰类是基于已有对象的功能并提供更强功能,所以装饰类与被装饰类一般是属于一个体系中的。

 下面是一个文本复制的列子:

import java.io.*;

public class BufferedText 
{
	public static void main(String[] args)
	{
		BufferedReader br=null;
		BufferedWriter bf=null;
		try
		{
			 br=new BufferedReader(new FileReader("D:\\BufferedReaderDemo.java"));//定义一个读取流并关联文件
			 bf=new BufferedWriter(new FileWriter("D:\\BufferedReaderDemo_copy.txt"));//定义一个输入流
			 String line=null;
			 while((line=br.readLine())!=null)//按行读。
			 {
				 bf.write(line);
				 bf.newLine();//换行
			 }
		}
		catch(IOException e)
		{
			
		}
		finally
		{
			try{
				if(br!=null)
				br.close();//关闭流资源
			}
			catch(IOException e)
			{
				
			}
			try{
				if(bf!=null)
				bf.close();
			}
			catch(IOException e)
			{
				
			}
		}
	}
  }

二、字节流

操作字节数据的文件。比如图片,音频等。

字符流的抽象基类:InputStream OutputStream。由这两个类派生出来的子类都是以其父名作为后缀。

字节流缓冲区:BufferedInputStreamBufferedOutputStream

字节流的操作方式跟字节流一样。这边就不过多介绍。

 

三、转换流

为了让字节流能够使用字符流缓冲区的readLine方法,提高效率,我们就可以使用转换流把字节流转换成字符流。

1、InputStreamReader  字节通向字符的桥梁

2、OutputStreamWriter字符通向字节的桥梁

System.out 标准输出流

System.in  标准输入流

把源文件在控制台输出:

分析:
 * 源:  Reader 纯文本  FileReader  
 * 设备:硬盘  
 * 提高效率:BufferedRead
 * BufferedRead bfr=new BufferedRead(new FileReader("D:\\BufferedReaderDemo.java"));
 * 目的:Writer OutputStream
 * 文本:FileWriter
 * 设备:控制台  System.out操作的是字节流 所以要用到转换流 OutputStreamWriter
   * 提高效率;BufferedWriter bfw=new BufferedWriter(new OutputStreamWriter(System.out))
  import java.io.*;
  
  public class SytemInDemo
  {
  	public static void main(String[] args) throws FileNotFoundException
  	{
  		
  		BufferedReader bfr=null;
  		BufferedWriter bfw=null;
  		try
  		{
  			bfr=new BufferedReader(new FileReader("D:\\BufferedReaderDemo.java"));
  			bfw=new BufferedWriter(new OutputStreamWriter(System.out));
  			//bfw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\OUPdRMO.TXT")));
  			String line=null;
  			while((line=bfr.readLine())!=null)
  			{
  				if(line.equals("over"))
  					break;
  				/*System.out.println(line);*/
  				bfw.write(line);
  				bfw.newLine();
  				bfw.flush();
  				
  			}
  			
  		}
  		catch(IOException e)
  		{}
  		finally
  		{
  			try{
  				bfr.close();
  			}
  			catch(IOException e)
  			{}
  			try{
  				bfw.close();
  			}
  			catch(IOException e)
  			{}
  		}
  		
  	}
  }

四、File类

 1、基本概念

用于将文件或文件夹封装成对象,方便对文件和文件夹的操作。

它与流的区别就是流只能操作数据,不能操作文件夹

2、常见方法

(1)创建:createNewFile()
         当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建  一个新的空文件。

mkdir()
          创建此抽象路径名指定的目录。

mkdirs() 创建多级目录
          创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。

  (2)删除 :boolean delete()  删除此抽象路径名表示的文件或目录。

(3)判断:返回值都是boolean型的

canExecute()
          测试应用程序是否可以执行此抽象路径名表示的文件。

canRead()
          测试应用程序是否可以读取此抽象路径名表示的文件。

canWrite()
          测试应用程序是否可以修改此抽象路径名表示的文件。

isDirectory()
          测试此抽象路径名表示的文件是否是一个目录。

isAbsolute()
          测试此抽象路径名是否为绝对路径名。

isFile()
          测试此抽象路径名表示的文件是否是一个标准文件。

isHidden()
          测试此抽象路径名指定的文件是否是一个隐藏文件。

exists()
          测试此抽象路径名表示的文件或目录是否存在。

      要判断一个目录是否是目录,判断是都是文件都要先判断它们是都存在。

   (4)获取:getName()返回由此抽象路径名表示的文件或目录的名称。

getAbsolutePath()
          返回此抽象路径名的绝对路径名字符串。

getPath()
          将此抽象路径名转换为一个路径名字符串。

length()
          返回由此抽象路径名表示的文件的长度。

getParent()
          返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。

list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

listFiles()把获取到的封装成一个File对象,便于操作

 

  2、递归

函数自身调用自身就是递归。要限定条件,避免溢出。

  public static void show(File dir)
  	{
  		File[] ff=dir.listFiles();
  		for(File file:ff)
  		{	
  			if(!(file.isHidden())&&file.isDirectory())
  				show(file);//递归调用
  			else 
  				System.out.println(file);
  			System.out.println(file);
  			
  		}
  	}

五、properties类

1、基本概念:

它是Hashtable的子类。也就是说它具备Map集合的特点。而且它里面存储的键值都是字符串,是集合中与IO技术相结合的集合容器。

2、方法

(1)setProperty(String key, String value)
          调用 Hashtable 的方法 put。

(2)getProperty(String key)
          用指定的键在此属性列表中搜索属性。

(3)load(InputStream inStream)
          把流中的数据加载进集合

(4)store(OutputStream out, String comments)
         将集合中的元素加载进指定的文件中

(5)list(PrintWriter out)
           将属性列表输出到指定的输出流。

 六、打印流

1、PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException。

它的构造函数可以接收的对象有file对象,String路径和字节输出流

 

2、PrintWriter 向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。不同的是该类构造函数可以接收字节输出流。

3、下面就是实现把文本文件输出到控制台的方法

  public static void method()throws IOException
  	{
  		BufferedReader bfw=new BufferedReader(new FileReader("D:\\hah.txt"));
  		PrintWriter pw=new PrintWriter(System.out);
  		String line=null;
  		while((line=bfw.readLine())!=null)
  		{
  			//pw.write(line);
  			pw.println(line);
  			
  			
  		}
  		pw.close();
  		bfw.close();
  	}
  	
  }


总结:

学号IO只要会分析相应的源和目的以及操作的文件类型,就可以选择相应的输入流和输出流,这样IO操作的问题就不会有太大的问题。不过还是有一些小地方要注意,比如使用BufferedWriter的时候要记得刷新缓冲区,键盘录入的时候要记得有结束标记等


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值