Java 二進制I/O處理


在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()方法都會使指針移動

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM