在Java中如何處理文本I/O
使用Scanner類讀取文本數據,使用PrintWriter類寫文本數據
例子:
public class IO { public static void main(String [] args) throws FileNotFoundException { // PrintWriter printWriter = new PrintWriter("123.txt"); 輸出文本數據 // printWriter.print("chenzquan"); // printWriter.close(); Scanner input = new Scanner(new File("123.txt")); //輸入文本數據 System.out.print(input.nextLine()); } }
文本I/O需要編碼、解碼而二進制I/O不需要,所以二進制I/O比較快
二進制I/O類
InputStream類的方法
OutputStream類方法
FileInputStream和FileOutputStream
FileInputStream類和FileOutputStream類用於從/向文件讀取/寫入字節
FileInputStream
FileOutputStream
public class TestFileStream { public static void main(String [] args) throws FileNotFoundException, IOException { try(FileOutputStream fileOutputStream = new FileOutputStream("temp.dat"); ){ for(int i=0;i<100; i++) { fileOutputStream.write(i); } } try(FileInputStream fileInputStream = new FileInputStream("temp.dat");){ int value; while((value=fileInputStream.read()) != -1) { System.out.print(value + " "); } } } }
DataInputStream和DataOutputStresam
DataInputStream
實現DataInput接口
DataOutputStream
實現DataOutput接口
創建DataInputStream類和DataOutputStream類
例子:
例子:
public class TestDataStream { public static void main(String [] args) throws FileNotFoundException, IOException { try(DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("temp.dat"));){ dataOutputStream.writeUTF("John"); dataOutputStream.writeDouble(85.5); dataOutputStream.writeUTF("chenzquan"); dataOutputStream.writeDouble(100.0); } try(DataInputStream dataInputStream = new DataInputStream(new FileInputStream("temp.dat"));){ System.out.println(dataInputStream.readUTF() + " " + dataInputStream.readDouble()); System.out.println(dataInputStream.readUTF() + " " + dataInputStream.readDouble()); } } }
DataInputStream類和DataOutputStream類以同機器平台無關的方式讀寫Java基本類型值和字符串,所以,一台機器寫好數據,可以在另一台讀取該文件
BufferedInputStream類和BufferedOutputStream類
他們可以通過減少磁盤讀寫次數提高輸入和輸出的速度
使用BufferedInputStream時,磁盤上的整塊數據一次性地讀入到內存中的緩沖區中,然后從緩沖區將個別數據傳到程序中
使用BufferedOutputStream時,個別數據寫進緩沖區,當緩沖區滿了,緩沖區的數據一次性寫入到磁盤中
對象I/O
ObjectInputStream類和ObjectOutputStream類可以用於讀/寫可序化的對象
ObjectInputStream類和ObjectOutputStreram類除了可以實現基本類型與字符串的輸入和輸出之外,還可以實現對象的輸入和輸出。
ObjectInputStream類和ObjectOutputStream類包含DataInputStream類和DataOutputStream類的所有功能,所以完全可以由ObjectInputStream類和ObjectOutputStream類代替DataInputStream類和DataOutputStream類
ObjectInputStream類
ObjectOutputStream類
他們的構建方法:
例子:
public class TestOjbectOutputStream { public static void main(String [] args) throws FileNotFoundException, IOException { try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.dat"));){ objectOutputStream.writeUTF("John"); objectOutputStream.writeDouble(85.5); objectOutputStream.writeObject(new Date()); } } }
public class TestObjectInputStream { public static void main(String [] args) throws FileNotFoundException, IOException, ClassNotFoundException { try(ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.dat"));){ String name = inputStream.readUTF(); double score = inputStream.readDouble(); Date date = (Date) inputStream.readObject(); System.out.println(name + " " + score + " " + date); } } }
可以向數據流中寫入多個對象或基本類型數據。從對應的ObjectIutputStream中讀回這些對象時,必須與其寫入的類型和順序相同。
為了得到所需的類型,必須使用java安全的類型轉換。
Serializable接口
不是每個對象都可以寫到輸出流。可以寫入輸出流中的對象稱為可序列化的。因為可序列化的對象是Serializable接口的實例,所以,可序列化對象必須實現Serializable接口。
Java提供一個內在機制自動完成寫對象的過程,這過程稱為對象序列化,他是在ObjectOutputStream中實現的。相反的,讀取對象的過程稱為對象反序列化,他是在ObjectInputStream中實現的。
用transient 關鍵字 表示這個不用序列化
如果沒有transient就會發生異常NotSerializableException
序列化數組
隨機訪問文件
RandomAccessFile類允許文件的任何位置進行數據的讀寫。
當創建RandomAccessFile時,可以指定兩種模式(“r”或“rw”)之一。
例子:
例子:
public class TestRandomAccessFile { public static void main(String [] args) throws FileNotFoundException, IOException { try (RandomAccessFile input = new RandomAccessFile("input.dat", "rw");){ input.setLength(0); for(int i=0; i<200; i++) { input.writeInt(i); } System.out.println("Current file number is " + input.length()); input.seek(0); System.out.println(input.readInt()); input.seek(1*4); System.out.println(input.readInt()); input.seek(4*9); System.out.println(input.readInt()); input.writeInt(555); input.seek(10*4); System.out.println(input.readInt()); input.seek(input.length()); input.writeInt(999); System.out.println("the new length is " + input.length()); input.seek(10*4); System.out.println("the eleventh number is " + input.readInt()); } } }
調用read()和write()方法都會使指針移動