Java IO system(輸入輸出系統)

Java1.0中所有與輸入有關的類都繼承自InputStream,此類包含用於讀取單個字節或字節數組的read()方法。所有與輸出有關的類都繼承自OutputStream,這個類包含用於寫入單個字節或字節數組的write()方法。

1. InputStream類型

字節數組:ByteArrayInputStream, 內存緩衝區作爲InputStream使用

String對象:StringBufferInputStream, 將一個String轉化成InputStream的一個String,採用一個StringBuffer作爲數據源

文件:FileInputStream,從文件中讀取信息,將File或者FileDescriptor作爲數據源

管道:PipedInputStream,爲相關的PipedOutputStream提供數據源

連接:SequenceInputStream,將多個InputStream對象轉化成單個InputStream使用

過濾器:FilterInputStream,過濾InputStream的數據源


2. OutputStream類型

衍生自這個類的類決定我們的輸入去往何處

字節數組:ByteArrayOutputStream,內存中的緩衝區

文件:FileOutputStream,輸出到文件

管道:PipedOutputStream,自動成爲相關PipedInputStream的輸出

過濾器:FilterOutputStream,過濾OutputStream的輸出


3. FilterInputStream

FilterInputStream用於完成兩類事情:讀取不同的基本類型數據及String對象(DataInputStream),修改InputStream內部行爲如是否進行緩衝

DataInputStream:與DataOutputStream聯合使用,讀取一個流中的基本數據類型

BufferedInputStream:預先讀入緩衝,加快讀取速度

LineNumberInputStream:跟蹤輸入流中的行號

PushbackInputStream:有一個字節的後推緩衝,可後推讀入的上一個字符


4. FilterOutputStream

DataOutputStream:與DataInputStream配合使用,將基本數據類型寫入OutputStream,使得任何機器上的DataInputStream都能正常讀取

PrintStream:用於產生格式化輸出

BufferedOutputStream:要求先寫入緩衝區


5. RandomAccessFile

RandomAccessFile用於包含了已知長度記錄的文件,我們可用seek()從一條記錄移動至另一條,讀取或修改記錄。RandomAccessFile不屬於InputStream OutputStream系統,而是直接繼承自Object。


6. IO流的典型應用

package com.test;

import java.io.*;

public class IOTest {
	public static void main(String[] args) {
		try {
			//Buffered input file
			DataInputStream in = new DataInputStream(
					new FileInputStream(args[0]));
			String s, s2 = new String();
			while ((s = in.readLine()) != null) {
				s2 += s + "/n";
			}
			in.close();
			
			//Input from memory
			StringBufferInputStream in2 = new StringBufferInputStream(s2);
			
			int c;
			while ((c = in2.read()) != -1) {
				System.out.print((char)c);
			}
			
			//Formatted memory input
			try {
				DataInputStream in3 = new DataInputStream(
						new StringBufferInputStream(s2));
				while (true) {
					System.out.print((char)in3.readByte());
				}
			} catch (EOFException e) {
				System.out.println("End of stream");
			}
			
			//Line numbering & file output
			try {
				LineNumberInputStream li = new LineNumberInputStream(
						new StringBufferInputStream(s2));
				DataInputStream in4 = new DataInputStream(li);
				
				PrintStream out1 = new PrintStream(
						new BufferedOutputStream(
								new FileOutputStream("IODemo.out")));
				while ((s = in4.readLine()) != null) {
					out1.println("Line " + li.getLineNumber() + s);
				}
				out1.close();
			} catch (EOFException e) {
				System.out.println("End of Stream");
			}
			
			//Storing and recovering data
			try {
				DataOutputStream out2 = new DataOutputStream(
						new BufferedOutputStream(
								new FileOutputStream("Data.txt")));
				out2.writeBytes("Here's the value of pi: \n");
				out2.writeDouble(3.141592);
				out2.close();
				DataInputStream in5 = new DataInputStream(
						new BufferedInputStream(
								new FileInputStream("Data.txt")));
				System.out.println(in5.readLine());
				System.out.println(in5.readDouble());
			} catch (EOFException e) {
				System.out.println("End of stream");
			}
			
			//Reading/writing radom access file
			RandomAccessFile rf = new RandomAccessFile("rtest.dat", "rw");
			for (int i = 0; i < 10; i++) {
				rf.writeDouble(i*1.414);
			}
			rf.close();
			
			rf = new RandomAccessFile("rtest.dat", "rw");
			rf.seek(5*8);
			rf.writeDouble(47.0001);;
			rf.close();
			
			rf = new RandomAccessFile("rtest.dat", "r");
			for (int i = 0; i < 10; i ++) {
				System.out.println("Value " + i + ": " + rf.readDouble());
			}
			rf.close();
			
		} catch (FileNotFoundException e) {
			System.out.println("File not found:" + args[0]);
		} catch (IOException e) {
			System.out.println("IO Exception");
		}
	}
}




Java1.1 IO System

Java1.1保留了原來的InputStream和OutputStream系統,但是引入了新的Reader和Writer類實現了另一中IO設計方案。這兩種系統可通過橋類轉換,InputStreamReader將InputStream轉換成Reader,OutputStreamWriter將OutputStream轉換成Writer。新IO系統中添加了與之前對應的類,如下:


Java1.0 Java1.1
InputStream Reader
converter:InputStreamReader
OutputStream Writer
converter:OutputStreamWriter
FileInputStream FileReader
FileOutputStream FileWriter
StringBufferInputStream StringReader
沒有對應類 StringWriter
ByteArrayInputStream CharArrayReader
ByteArrayOutputStream CharArrayWriter
PipedyInputStream PipedReader
PipedyOutputStream PipedWriter

過濾器:

Java1.0 Java1.1
FilterInputStream FilterReader
FilterOutputStream FilterWriter
BufferedInputStream BufferedReader
含有readline()
BufferedOutputStream BufferedWriter
DataInputStream DataInputStream
用到readline()時需要BufferedReader
PrintStream PrintWriter
LineNumberInputStream LineNumberReader
StreamTokenizer StreamTokenizer
PushBackInputStream PushBackReader

爲改變的類:

DataOutputStream

File

RandomAccessFile

SequenceInputStream

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