• 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()方法都会使指针移动

  • 相关阅读:
    javascript入门经典(第五版)-清华出版社之“经典”错误
    在自学css开始就遇到问题,“链入外部样式表”在多浏览器显示问题
    sublime text3 =个人插件
    不错的文章
    Golang逃逸分析
    sublime常用快捷键
    同步机制之一--Synchronized,以及此机制下的锁的本质和种类
    UVa 10976
    LeetCode:Add Digits
    插入排序
  • 原文地址:https://www.cnblogs.com/zquan/p/9348124.html
Copyright © 2020-2023  润新知