黑马程序员_Java IO流

-------    android培训java培训、期待与您交流! ----------

IO(Input Output)流: IO流用来处理设备之间的数据传输,Java通过流对数据进行操作。流按操作数据分为字节流和字符流

     输入流和输出流相对于内存 设备而言。
字节流:处理字节数据的流对象。设备上的数据都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小
              数据单元就是字节。意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据
字符流:因为字符每个国家都不一样,所以涉及到了字符编码问题,那么GBK编码的中文用unicode编码解析是有问题的,所以需要获取中文
              字节数据的同时+ 指定的编码表才可以解析正确数据。为了方便于文字的解析,所以将字节流和编码表封装成对象,这个对象就是字符流
只要操作字符数据,优先考虑使用字符流体系。流的操作只有两种:读和写
 
流的体系因为功能不同,但是有共性内容,不断抽取,形成继承体系。该体系一 共有四个基类,而且都是抽象类:
   字节流的抽象基类
       InputStream    OutputStream
    字符流的抽象基类:
       Reader       Writer
:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀
     InputStream的子类FileInputStream
     Reader的子类FileReader

close()和flush()的区别:

flush():将缓冲区的数据刷到目的地中后,流可以使用。

close():将缓冲区的数据刷到目的地中后,流就关闭了,该方法主要用于结束调用的底层资源。这个动作一定做
io异常的处理方式:io一定要写finally
FileWriter写入数据:
public static void main(String[] args) {
		FileWriter fw = null;
		try {
			fw = new FileWriter("demo.txt",true);// FileWriter(File file, boolean append) 如果为 true,则将数据写入文件末尾处,而不是写入文件开始处
			fw.write("abcde");
		}
		catch (IOException e ){
			System.out.println(e.toString()+"....");
		}
		finally{
			if(fw!=null)
				try{
					fw.close();
				}
				catch (IOException e){
					System.out.println("close:"+e.toString());
				}
             }
}
 FileReader读取数据:
import java.io.*;
class  FileReaderDemo {
	public static void main(String[] args) throws IOException {
		/*
		创建可以读取文本文件的流对象,FileReader让创建好的流对象和指定的文件相关联。
		*/
		FileReader fr = new FileReader("demo.txt");
		int ch = 0;
		while((ch = fr.read())!= -1) { //条件是没有读到结尾,返回 -1 ,标志读到结尾
			System.out.println((char)ch); //调用读取流的read方法,读取一个字符。
		}
		fr.close();
	}
}
读取数据方式二(较为高效,自定义缓冲区):
import java.io.*;
class FileReaderDemo2 {
	public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("demo.txt"); //创建读取流对象和指定文件关联。
		char[] buf = new char[8192]; //因为要使用read(char[])方法,将读取到字符存入数组。所以要创建一个字符数组,一般数组的长度都是1024的整数倍。
		int len = 0;
		while(( len=fr.read(buf)) != -1) {
			System.out.println(new String(buf,0,len));
		}
		fr.close();
	}
}

IO中的使用到了一个设计模式:装饰设计模式

装饰设计模式解决:对一组类进行功能的增强

包装:写一个类(包装类)对被包装对象进行包装

  1、包装类和被包装对象要实现同样的接口;

  2、包装类要持有一个被包装对象;

  3、包装类在实现接口时,大部分方法是靠调用被包装对象来实现的,对于需要修改的方法我们自己实现
字符流的缓冲区
    缓冲区的出现提高了对数据的读写效率,缓冲区要结合流才可以使用
对应类
 BufferedWriter
 BufferedReader
字符流
Reader:用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()
    BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了
    InputStreamReader:是 字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集
    FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个InputStreamReader
Writer:写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()
   BufferedW riter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
   OutputStreamWriter:是 字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集
   FileWriter 用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter
字节流
  InputStream:是表示字节输入流的所有类的超类。

     FileInputStream:从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader

     FilterInputStream:包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能
     BufferedInputStream:该类实现缓冲的输入流

OutputStream:此抽象类是表示输出字节流的所有类的超类。

     FileOutputStream:文件输出流是用于将数据写入File或FileDescriptor的输出流

     FilterOutputStream:此类是过滤输出流的所有类的超类

     BufferedOutputStream:该类实现缓冲的输出流

    FileReader fr = newFileReader("bufdemo.txt");

    BufferedReaderbufr  = new BufferedReader(fr);

    String line = null;

    while((line=bufr.readLine())!=null){  //readLine方法返回的时候是不带换行符的。

        System.out.println(line);

      }

    bufr.close();

读取键盘输入:

BufferedReader bufr = new BufferedReader(newInputStreamReader(System.in));

BufferedWriter bufw = newBufferedWriter(new OutputStreamWriter(System.out));

流的操作规律

1,明确源和目的。

       数据源:就是需要读取,可以使用两个体系:InputStream、Reader;

       数据汇:就是需要写入,可以使用两个体系:OutputStream、Writer;

2,操作的数据是否是纯文本数据?

       如果是:数据源:Reader

                  数据汇:Writer

       如果不是:数据源:InputStream

                    数据汇:OutputStream

3,虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?

       明确操作的数据设备。

       数据源对应的设备:硬盘(File),内存(数组),键盘(System.in)

       数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)。

4,需要在基本操作上附加其他功能吗?比如缓冲。

       如果需要就进行装饰。

转换流的最强功能就是基于 字节流 + 编码表 。没有转换,没有字符流

凡是操作设备上的文本数据,涉及编码转换,必须使用转换流

InputStreamReader isr = newInputStreamReader(new FileInputStream("a.txt"),"gbk");

 

File类

  将文件系统中的文件和文件夹封装成了对象。提供了更多的属性和行为可以对这些文件和文件夹进行操作。这些是流对象办不到的,因为流只操作数据

掌握File类的常见操作方法:

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

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

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

 

递归:就是函数自身调用自身

   应用场景:当一个功能被重复使用,而每一次使用该功能时的参数不确定,都由上次的功能元素结果来确定。

                     简单说:功能内部又用到该功能,但是传递的参数值不确定。(每次功能参与运算的未知内容不确定)

注意:递归时一定要明确结束条件

Java.util.Properties一个可以将键值进行持久化存储的对象。Map--Hashtable的子类

   用于属性配置文件,键和值都是字符串类型

特点:1:可以持久化存储数据。2:键值都是字符串。3:一般用于配置文件

PrintWriter out = new PrintWriter(new FileWriter("out.txt"),true);//设置true后自动刷新,把数据写到文件中,自动刷新

 

 

 

 

 
 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值