JAVA IO

作者: 上海马超23 | 来源:发表于2017-05-27 14:36 被阅读0次

    Java IO: Pipes

    • 管道支持线程间通讯,但不是线程安全的。

    Java IO: Byte & Char Arrays

    • ByteArrayInputStream 或 CharArrayReader 作用读取字节数组或字符数组。
    • ByteArrayOutputStream 和 CharArrayWriter 同理

    Java IO: System.in, System.out, and System.error

    • 可以通过System.setIn(), System.setOut(), System.setErr() 重定向系统默认输入和输出。

    Java IO: Streams

    • stream和数组不一样,是不支持定位移动的。
    • inputStream 的 read() 返回一个字节,如果没有可读字节就返回-1。
    • 因为FileInputStream每次返回一个字节效率太低,通过BufferedInputStream的组合,一次可以返回一部分内
      InputStream input = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"));
      
      BufferedOutputStream 同理。

    Java IO: Readers and Writers

    • 通过组合方式,将字节流转换为字符流:
      Reader reader = new InputStreamReader(inputStream);
      
      Writer同理。
    • Buffer的组合也是类似的
      Reader reader = new BufferedReader(new FileReader(...));
      Writer writer = new BufferedWriter(new FileWriter(...));
      

    Java IO Exception Handling From Java 7

    • Java7支持发生异常也能关闭资源:
      try (  
        java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);  
        java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)  
      ) {  
         // 处理流
      }
      

    Java IO: InputStream

    • read(byte[] array) 一次获取多个字节,比read()效率高。
      OutputStream同理。
      read(byte[])方法会尝试读取与给定字节数组容量一样大的字节数,返回值说明了已经读取过的字节数。如果InputStream内可读的数据不足以填满字节数组,那么数组剩余的部分将包含本次读取之前的数据。记得检查有多少数据实际被写入到了字节数组中。

    • 如果inputStream的子类支持mark()和reset()方法,它会重载markSupported(),返回true。
      mark建立书签,reset返回到书签的位置。

    Java IO: FileOutputStream

    • 根据构造函数的参数,决定是覆盖文件内容还是追加文件内容:
      OutputStream output = new FileOutputStream("c:\\data\\output-text.txt", true); //appends to file
      OutputStream output = new FileOutputStream("c:\\data\\output-text.txt", false); //overwrites file
      

    Java IO: RandomAccessFile

    • 创建实例对象:
        RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
        file.seek(200); // 移动位置
        long pointer = file.getFilePointer(); // 获取当前位置
        int aByte = file.read(); // 读取当前位置的字节,并移动到下一个位置
        file.close();
        ```
      
    # Java IO: File
    - 创建目录:
    ```java
        File file = new File("c:\\data\\input-file.txt");
        boolean dirCreated = file.mkdirs();
        ```  
    
    - 获取目录下文件列表:
    ```java
        File file = new File("c:\\data");
        String[] fileNames = file.list();
        File[]   files = file.listFiles();
        ```
    
    # Java IO: BufferedInputStream
    - BufferedInputStream的优化:http://www.importnew.com/9363.html
    - 支持 mark() 和 reset()
    
    # Java IO: PushbackInputStream
    ```java
        PushbackInputStream input = new PushbackInputStream(new FileInputStream("c:\\data\\input.txt"));
        int data = input.read();
        input.unread(data); // 往回倒退
        ```
    # Java IO: SequenceInputStream
    - SequenceInputStream按顺序读取多个inputStream:
    ![SequenceInputStream](https://img.haomeiwen.com/i6160287/d2eea6d88c3207dd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    ```java
        InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
        InputStream input2 = new FileInputStream("c:\\data\\file2.txt");
    
        SequenceInputStream sequenceInputStream =
        new SequenceInputStream(input1, input2);
    
        int data = sequenceInputStream.read();
        while(data != -1){
            System.out.println(data);
            data = sequenceInputStream.read();
        }
    

    Java IO: DataInputStream

    • 作用是把字节类型转换成Java其他的原生类型(因为原生类型的大小都大于字节单位大小,按原生类型单位读写的场景很方便):


      DataInputStream

    Java IO: PrintStream

    • 打印输出原生类型:
        PrintStream printStream = new PrintStream(outputStream); // 组合方式使用
    
        printStream.print(true);
        printStream.print((int) 123);
        printStream.print((float) 123.456);
    
        printStream.close();
    
    • System.out and System.err are PrintStreams

    Java IO: ObjectInputStream

    • 按对象单位读写,前提是对象类实现了Serializable接口:
    import java.io.*;
    
    public class ObjectInputStreamExample {
    
        public static class Person implements Serializable {
            public String name = null;
            public int    age  =   0;
        }
    
    
        public static void main(String[] args) throws IOException, ClassNotFoundException {
    
            ObjectOutputStream objectOutputStream =
                new ObjectOutputStream(new FileOutputStream("data/person.bin"));
    
            Person person = new Person();
            person.name = "Jakob Jenkov";
            person.age  = 40;
    
            objectOutputStream.writeObject(person);
            objectOutputStream.close();
    
    
            ObjectInputStream objectInputStream =
                new ObjectInputStream(new FileInputStream("data/person.bin"));
    
            Person personRead = (Person) objectInputStream.readObject();
    
            objectInputStream.close();
    
            System.out.println(personRead.name);
            System.out.println(personRead.age);
        }
    }
    

    Java IO: Serializable

    • 现在更推荐序列化成JSON等其他可读的格式,实现Serializable接口不是很好。

    Java IO: Reader

    • 以字符为单位读写,拿UTF-8作为例子,一个汉字字符有3个字节长度。

    Java IO: InputStreamReader

    • 转换字节流到字符流。
    • 构造方法支持指定字符编码。

    Java IO: StreamTokenizer

    • 将字符流按token拆分:
    StreamTokenizer streamTokenizer = new StreamTokenizer(
            new StringReader("Mary had 1 little lamb..."));
    
    while(streamTokenizer.nextToken() != StreamTokenizer.TT_EOF){ // 判断字符流是否结束
    
        if(streamTokenizer.ttype == StreamTokenizer.TT_WORD) { // 如果拆分后的token是字符
            System.out.println(streamTokenizer.sval);
        } else if(streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) { // 如果token是数字
            System.out.println(streamTokenizer.nval);
        } else if(streamTokenizer.ttype == StreamTokenizer.TT_EOL) { // 如果token是换行
            System.out.println();
        }
    
    }
    streamTokenizer.close();
    

    相关文章

      网友评论

          本文标题:JAVA IO

          本文链接:https://www.haomeiwen.com/subject/andqfxtx.html