您的位置:首页 > 编程语言 > Java开发

java中IO流巩固学习1

2017-06-07 14:02 190 查看
1.java流中的整体分类图



其他常用与流相关的对象:

2.IO流

IO流:主要用于处理设备上的数据

如:硬盘,内存,键盘的录入

IO有具体的分类:1.根据处理数据类型的不同:字节流和字符流。2.根据流向不同:输入流和输出流

字符流的由来:因为文件的编码不同,而有了对字符进行高效操作的字符流对象。

原理:其实就是基于字节流读取字节时,去查了指定的编码表。

字节流和字符流的区别:

1.字节流读取的时候,读到一个字节就返回一个字节。字符流使用了字节流读到一个或者多个字节时(中文对应的字节市两个,在UTF-8编码表中是3个字节),先去查指定的编码表,将查到的字符返回。

2.字节流可以处理所有的数据类型,如MP3,AVI等。字符流只能处理字符数据。

结论:只要是纯文本优先考虑字符流,其他一律用字节流。

IO体系所具备的基本功能:读和写

1.字节流:InputStream(读),OutputStream(写)

2.字符流:Reader(读),Writer(写)

基本的读写操作方式:

因为数据通常是以文件形式存在,所以就要找到IO体系中可以用于操作文件的流对象。通过名称可以更容易获得改对象,因为IO体系中的子类名后缀绝大部分是父类的名称,而前缀都是体现子类功能的名字。

Reader《-----------InputStreamReader《-------------FileReader:专门用于处理文件的字符流读取对象

Writer《---------OutputStream《-------------FileWriter:专门用于处理文件的字符流写入对象

Reader中常见的方法:

1. int read():读取一个字符,返回的是读到的哪个字符,如果读到流的末尾,则返回-1.

2.int read(char[]):将读到的字符存入到指定的数组中,返回的是读到的字符个数,也就是往数组里装的元素的个数,如果读到流的末尾,则返回-1.

3.close():读取字符其实用的是windows的系统功能,就是希望使用过后,进行资源释放。

Writer中常见的方法:

1.writer(ch):将一个字符写入到流中。

2.writer(char[]):将一个字符数组写入到流中。

3.writer(string):将一个字符串写入到流中。

4.flush():刷新流,将流中的数据刷新到目的地中,流还存在。

5.close():关闭资源,在关闭前先会调用flush(),刷新流中的数据到目的地,然后关闭流。

FileWriter:该类没有特定的方法,只有自己的构造函数。

该类的特点在于:

1.用于处理文本文件

2.该类中有默认的编码表

3.该类中有临时缓冲

构造函数:在写入流对象初始化时,必须要有一个存储数据的目的地,FileWriter(String filename)

构造函数又做了什么事情呢?

1.调用系统资源

2.在指定的位置创建文件(如果该文件已经存在,则覆盖该文件)

FileWriter(String filename,boolean append):该构造函数:当传入的boolean参数为true时,会在指定文件末尾处进行数据的续写。

FileReader:

1.用于读取文本文件的流对象

2.用于关联文本文件

构造函数:在读取流对象初始化的时候,必须要指定一个被读取的文件。如果该文件不存在,会发生FileNotFoundException.

FileReader(String filename)

demo1:

package learn1;
import java.io.FileWriter;

import java.io.IOException;
/**

 * 完整的异常处理机制

 * @author jt

 *

 */

public class Demo2 {

 public static void main(String[] args) {

  FileWriter fw = null;

  try {

    fw = new FileWriter("d:\\demo2.txt");

    fw.write("abcda");

    fw.flush();

    fw.write("kkkk");  

  } catch (IOException e) {

   System.out.println(e.toString());

  }finally{

   if(fw!=null){

     try {

     fw.close();

    } catch (IOException e) {

     System.out.println("close:"+e.toString());

    }

   }

  }

 }

}

对于读取或写入流对象的构造函数,以及读写方法,还有刷新关闭方法都会抛出IOException或其子类,所以要进行处理throws或者try,catch处理

完整的处理异常方式:

import java.io.FileWriter;

import java.io.IOException;
/**

 * 完整的异常处理机制

 * @author jt

 *

 */

public class Demo2 {

 public static void main(String[] args) {

  FileWriter fw = null;

  try {

    fw = new FileWriter("d:\\demo2.txt");

    fw.write("abcda");

    fw.flush();

    fw.write("kkkk");  

  } catch (IOException e) {

   System.out.println(e.toString());

  }finally{

   if(fw!=null){

     try {

     fw.close();

    } catch (IOException e) {

     System.out.println("close:"+e.toString());

    }

   }

  }

 }

}

另外一个细节:

当指定绝对路径时,定义目录分隔符有两种方式,1.反斜杠:\\一定要写两个 new FileWriter("d:\\demo1.txt")  2.斜杠 / 只写一个就可以了 new FileWriter("d:/demo2.txt")

读取一个已有的文本文件,将文本文件打印出来,一次读一个字符就打印出来,效率不高。

package learn1;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

/**

 * 读取一个已有的文本文件

 * 一次读一个字符就打印出来

 * @author jt

 *

 */

public class Demo3 {

 public static void main(String[] args) throws IOException {

  FileReader fr = new FileReader("d:/demo.txt");

  int ch=0;

  //一次读一个字符

  while((ch = fr.read())!=-1){

   System.out.println((char)ch);

  }

  fr.close();

  

 }

}

读一个字符就存入一个字符数组,读完1KB在打印出来

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;
/**

 * 读一个字符就存入字符数组,读完1KB在打印

 * @author jt

 *

 */

public class Demo4 {

 public static void main(String[] args) {

  FileReader fr = null;

  try {

   fr = new FileReader("d:/demo.txt");

   char[] buf = new char[1024];//该长度通常是1024的整数倍

   int len=0;

   while((len=fr.read(buf))!=-1){

     System.out.println(new String(buf,0,len));

   }

  } catch (IOException e) {

    System.out.println(e.toString());

  }finally{

   if(fr !=null){

    try {

     fr.close();

    } catch (IOException e) {

     System.out.println("close:"+e.toString());

    }

   }

  }

 }

}

字符流的缓冲区:缓冲区的出现提高了对流的操作效率,原理就是将数组进行封装。

对应的对象:

BufferedWriter:特有方法:newLine():跨平台的换行符

BufferedReader:特有方法:readLine():一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回,当读到末尾时,返回null.

在使用缓冲区对象时,要明确,缓冲的存在是为了增强流的功能而存在,所以建立缓冲区对象时,要先有流对象存在。其实缓冲内部就是在使用流对象的方法,只不过加入了数组对数据进行了临时缓存。为了提高操作数据的效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: