JAVA IO

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](http://upload-images.jianshu.io/upload_images/6160287-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其他的原生类型(因为原生类型的大小都大于字节单位大小,按原生类型单位读写的场景很方便):


    JAVA IO_第1张图片
    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)