流是一组有序的数据序列,可分为输入流和输出流两种。I/O流提供了一条通道程序,可使用这条通道把源中的字节序列送到目的地。不只可使用在文件上,也能够用于键盘、鼠标、显示器等。java
输入流
文件--->数据流--->目的地数组
输出流
源-->数据流--->文件缓存
Java定义了许多类专门复杂各类方式的输入/输出。这些类都放在java.io包中。其中,输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;而全部输出流都是OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。性能优化
InputStream类是字节输入流的抽象类,是全部字节输入流的父类。InputStream类的具体层次结构。性能
该类中全部方法遇到错误时都会触发IOException异常。优化
Java中的字符时Unicode编码,是双字节的。InputStream是用来处理字节的,并不适合处理字符文本。Java为字符文本的输入提供了一套单独的类Reader。编码
OutputStream类是字节输出流的抽象类。.net
OutputStream类中的全部方法均返回void,遇到错误时都会触发IOException异常。code
Writer类是字符输出流的抽象类,全部字符输出类的实现都是它的子类。对象
File类是java.io包中惟一表明磁盘文件自己的对象。File类定义了一些与平台物馆的方法来操做文件,能够实现建立、删除、重命名文件等操做。File类的对象主要用来获取文件自己的一些信息,如所在目录,文件的长度,以及文件读写权限等。
使用File类建立一个文件对象,一般使用如下3种构造方法来建立文件对象。
// 1.File(String pathName) New File(String pathName) File file = new File("D:\\a.txt"); // 2.File(String parent, String child) // 该构造方法根据定义的父路径和子路径字符串建立一个新的File对象。 new File(String parent, String child); String parent = "D:/doc"; String child = "letter.txt"; // 3.File(File f,String child) // 该构造方法根据parent抽象路径名和子路径字符串建立一个新的File实例 String f = "D:/doc/"; String child = "letter.txt";
public static class { public static void main(String[] args) { File file = new File("test.txt"); if(file.exits()) { file.delete(); }else{ try{ file.createNewFile(); }catch(Exception e){ e.printStackTrace(); } } } }
两个类都是用来操做磁盘文件的,该类继承自InputStream,提供了基本的文件写入能力。
FileInputStream类经常使用构造方法
- FileInputStream(String name);
- FileInputStream(File file); 该方法容许把文件链接输入流以前对文件作进一步操做。
public static class { public static void main(String[] args) { File file = new File("test.txt"); try{ // 建立FileOutputStream对象 FileOutputStream out = new FileOutputStream(File); byte byt[] = "两个类都是用来操做磁盘文件的,该类继承自InputStream,提供了基本的文件写入能力。".getBytes(); out.write(byt); out.close(); }catch(Exception e){ e.printStackTrace(); } try{ FileInputStream in = new FileInputStream(file); byte byt[] = new byte[1024]; int len = in.read(byt); // 将文件信息输出,可是这个输出new String有问题 System.out.println(new String(byt,0,len)); in.close() }catch(Exception e){ e.printStackTrace(); } } }
汉字采起上面的字节流读入会产生乱码的问题,因此使用字符流的FileReader和FileWriter类,便可避免该现象。
缓存是I/O的一种性能优化,缓存流为I/O流增长了内存缓冲区,有了缓存,使得在流上执行skip(),mark(),和reset()方法成为可能。
BufferedInputStream构造方法
第一种形式的构造方法建立了一个带有32字节的缓存流;第二个按照指定的大小来建立最优的缓存区大小。
BufferedOutputStream构造方法
以上分别继承了Reader和Writer类
BufferedReader类的经常使用方法
方法 | 描述 |
---|---|
read() | 读取单个字符 |
readLine() | 读取一个文本行,并将其返回为一个字符串。若无数据,则返回null。 |
BufferedWriter经常使用方法
方法 | 描述 |
---|---|
write(String s,int off,int len) | 写入字符串的某一部分 |
flush() | 刷新该流的缓存 |
newLine() | 写入一个行分割符 |
在使用BufferedWriter类的Write()方法时,数据并无马上被写入值输出流,而是首先进入缓存去中。若是想马上将缓存区中的数据写入输出流,必定要调用flush()方法。
字符数据--> BufferedWriter--> OutputStreamWriter-->OutputStream --> 文件
package simple.java; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import sun.net.www.content.text.plain; public class FileTest { public static void main(String[] args) throws IOException { String[] array = {"取等","学家尽快","断努力"}; File f = new File("C:\\pox.txt"); try{ FileWriter fileWriter = new FileWriter(f); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); for (int i=0;i<array.length;i++){ bufferedWriter.write(array[i]); bufferedWriter.newLine(); } bufferedWriter.close(); fileWriter.close(); }catch(Exception e){ e.printStackTrace(); } try{ FileReader fileReader = new FileReader(f); BufferedReader bufferedReader = new BufferedReader(fileReader); String s = null; int i = 0; // s=bufferedReader.readLine()很重要,不然会显示不全,还不知道为啥。 while((s=bufferedReader.readLine())!= null) { i++; System.out.println("第"+i+"行:"+s); } bufferedReader.close(); fileReader.close(); }