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的组合,一次可以返回一部分内
BufferedOutputStream 同理。InputStream input = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"));
Java IO: Readers and Writers
- 通过组合方式,将字节流转换为字符流:
Writer同理。Reader reader = new InputStreamReader(inputStream);
- 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();
网友评论