11、java-文件读写 I/O

一、流概述

流是一组有序的数据序列,可分为输入流和输出流两种。I/O流提供了一条通道程序,可使用这条通道把源中的字节序列送到目的地。不只可使用在文件上,也能够用于键盘、鼠标、显示器等。java

输入流
文件--->数据流--->目的地数组

输出流
源-->数据流--->文件缓存

二、流概述

Java定义了许多类专门复杂各类方式的输入/输出。这些类都放在java.io包中。其中,输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;而全部输出流都是OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。性能优化

2.1 输入流

InputStream类是字节输入流的抽象类,是全部字节输入流的父类。InputStream类的具体层次结构。性能

  • InputStream
    • AudioInputStream
    • ByteArrayInputStream
    • StringBufferInputStream
    • FileInputStream
    • FilterInputStream
      • BufferedInputStream
      • DataInputStream
      • PushbackInputStream
    • InputStream
    • ObjectInputStream
    • SequenceInputStream
    • PipedInputStream

该类中全部方法遇到错误时都会触发IOException异常。优化

  • [x] read()方法:从输入流中读取数据的下一个字节。返回0~255范围内的int字节值。若是流已经到达末尾,而没有可用字节,则返回-1
  • [x] read(byte[] b):从输入流中读入必定长度的字节,并以整数的形式返回字节数。
  • [x] close():关闭此输入流并释放与该流关联的全部系统资源。

Java中的字符时Unicode编码,是双字节的。InputStream是用来处理字节的,并不适合处理字符文本。Java为字符文本的输入提供了一套单独的类Reader。编码

  • Reader
    • CharArrayReader
    • BufferedReader
      • LineNumberReader
    • FilterReader
      • PushBackReader
    • InputStreamReader
      • FileReader
    • PipedReader
    • StringReader

2.2 输出流

OutputStream类是字节输出流的抽象类。.net

  • OutputStream
    • ByteArrayOutputStream
    • FileOutputStream
    • FilterOutputStream
      • BufferedOutputStream
      • DataOutputStream
      • PushbackOutputStream
    • OutputStream
    • ObjectOutputStream
    • SequenceOutputStream
    • PipedOutputStream

OutputStream类中的全部方法均返回void,遇到错误时都会触发IOException异常。code

  • [x] write(int b) 将指定的字节写入此输出流
  • [x] write(byte[] b):将b个字节从指定的byte数组写入此输出流
  • [x] write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此输出流
  • [x] flush():完全完成输出并清空缓存区
  • [x] close():关闭输出流

Writer类是字符输出流的抽象类,全部字符输出类的实现都是它的子类。对象

  • Writer
    • CharArrayWriter
    • BufferedWriter
      • LineNumberWriter
    • FilterWriter
      • PushBackWriter
    • OutputStreamWriter
      • FileWriter
    • PipedWriter
    • PrintWriter
    • StringWriter

三、File类

File类是java.io包中惟一表明磁盘文件自己的对象。File类定义了一些与平台物馆的方法来操做文件,能够实现建立、删除、重命名文件等操做。File类的对象主要用来获取文件自己的一些信息,如所在目录,文件的长度,以及文件读写权限等。

3.1 文件的建立与删除

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

四、 文件输出/输出流

4.1 FileInputStream与FileOutputStream类

两个类都是用来操做磁盘文件的,该类继承自InputStream,提供了基本的文件写入能力。

FileInputStream类经常使用构造方法

  1. FileInputStream(String name);
  2. 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();
		}
	}
}

4.2 FileReader和FileWriter类

汉字采起上面的字节流读入会产生乱码的问题,因此使用字符流的FileReader和FileWriter类,便可避免该现象。

5.带缓存的输入/输出流

缓存是I/O的一种性能优化,缓存流为I/O流增长了内存缓冲区,有了缓存,使得在流上执行skip(),mark(),和reset()方法成为可能。

5.1 BufferedInputStream和BufferedOutputStream类

BufferedInputStream构造方法

  • [x] BufferedInputStream(InputStream in)
  • [x] BufferedInputStream(InputStream in, int size)

第一种形式的构造方法建立了一个带有32字节的缓存流;第二个按照指定的大小来建立最优的缓存区大小。

BufferedOutputStream构造方法

  • [x] BufferedOutputStream(OutputStream out)
  • [x] BufferedOutputStream(OutputStream out,int size)

5.2 BufferedReader和BufferedWriter

以上分别继承了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();
		}
相关文章
相关标签/搜索