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();
		}
相關文章
相關標籤/搜索