java中IO流巩固学习1

1.java流中的整体分类图

java中IO流巩固学习1


java中IO流巩固学习1


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

java中IO流巩固学习1java中IO流巩固学习1

java中IO流巩固学习1


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());
    }
   }
  }
 }
}

java中IO流巩固学习1

对于读取或写入流对象的构造函数,以及读写方法,还有刷新关闭方法都会抛出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.

在使用缓冲区对象时,要明确,缓冲的存在是为了增强流的功能而存在,所以建立缓冲区对象时,要先有流对象存在。其实缓冲内部就是在使用流对象的方法,只不过加入了数组对数据进行了临时缓存。为了提高操作数据的效率。