十一、java-文件讀寫 I/O

1、流概述

流是一組有序的數據序列,可分爲輸入流和輸出流兩種。I/O流提供了一條通道程序,可以使用這條通道把源中的字節序列送到目的地。不僅可以使用在文件上,也可以用於鍵盤、鼠標、顯示器等。

輸入流
文件--->數據流--->目的地

輸出流
源-->數據流--->文件

2、流概述

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類是字節輸出流的抽象類。

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

OutputStream類中的所有方法均返回void,遇到錯誤時都會觸發IOException異常。

  • [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

3、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、 文件輸出/輸出流

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章