输入和输出
InputStream类型
数据源包括:字节数组,字符串对象,管道,其他流的序列,Internet链接
类 | 功能 |
---|---|
ByteArrayInputStream | 将内存的缓冲区转换InputStream |
StringBufferInputStream | 将String对象转换为InputStream |
FileInputStream | 将文件转换为InputStream |
FilterInputStream | 抽象类,作为装饰器,为其他InputStream类提供额外功能 |
OutputStream类型
接收端包括:字节数组,文件,管道
类 | 功能 |
---|---|
ByteArrayOutputStream | 将流的数据存放在缓冲区 |
FileOutputStream | 将数据写入文件 |
FilterOutputStream | 抽象类,作为装饰器,为其他OutputStream类提供额外功能 |
装饰器
FilterInputStream类型
类 | 功能 |
---|---|
DataInputStream | 可从流读取基本数据类型 |
BufferedInputStream | 使用缓冲区,避免每次读取进行实际写操作 |
FilterOutputStream类型
类 | 功能 |
---|---|
DataOutputStream | 将流的数据存放在缓冲区 |
BufferedOutputStream | 使用缓冲区,避免每次发送数据进行实际写操作 |
PrintStream | 用于产生格式化输出 |
Reader和Writer
InputStream和OutputStream面向字节,Reader和Writer面向字符
FileInputStream → FileReader
FileOutputStream → FileWriter
BufferedInputStream → BufferedReader
BufferedOutputStream → BufferedWriter
I/O流的典型使用方式
输入
文件缓冲字符输入
BufferedReader in = new BufferedReader(new FileReader("D:\\temp\\demo.txt"));
String s;
while( (s = in.readLine()) != null){
System.out.println(s);
}
in.close();
从内存输入
StringReader reader = new StringReader("我在学Java");
int read;
while((read = reader.read()) != -1){
System.out.print((char)read);
}
reader.close();
输出
基本的文件输出
BufferedReader in = new BufferedReader(new FileReader("D:\\demo.txt"));
PrintWriter out = new PrintWriter(new BufferedWriter(newFileWriter("D:\\demo2.txt")));
StringBuffer stringBuffer = new StringBuffer();
String s;
while( (s = in.readLine()) != null){
out.println(s);
}
in.close();
out.close();
新I/O
jdk1.4引入了新的I/O类库,并且旧的I/O包已经使用新I/O实现过,充分利用速度的提高。
新I/O速度的提高来自于所用的结构接近操作系统执行I/O的方式:通道和缓冲器。通道是FileChannel,缓冲器是ByteBuffer。旧类的FileInputStream和FileOutputStream可以产生FileChannel。
//写
FileChannel channel = new RandomAccessFile("D:\\IDEA\\aaa.txt","rw").getChannel();
channel.write(ByteBuffer.wrap("aaa".getBytes()));
channel.close();
//读
channel = new RandomAccessFile("D:\\IDEA\\aaa.txt","rw").getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
channel.read(byteBuffer);
byteBuffer.flip();
while(byteBuffer.hasRemaining()){
System.out.print((char)byteBuffer.get());
}
channel.close();
压缩
Java I/O类库支持读写Zip和GZip格式的数据流,并且是按字节方式处理的。
GZIP
BufferedReader in = new BufferedReader(new FileReader("d:\\demo.txt"));
BufferedOutputStream out = new BufferedOutputStream(
new GZIPOutputStream(
new FileOutputStream("d:\\test.gz")));
String s;
while((s=in.readLine()) != null){
out.write(s.getBytes(Charset.defaultCharset()));
}
in.close();
out.close();
ZIP
CheckedOutputStream csum = new CheckedOutputStream(
new FileOutputStream("d:\\test.zip"), new Adler32());
ZipOutputStream zos = new ZipOutputStream(csum);
BufferedOutputStream out = new BufferedOutputStream(zos);
String[] args = new String[]{"d:\\余君.txt","d:\\新文件 5.txt"};
//压缩多个文件
for(String arg : args){
BufferedReader reader = new BufferedReader(new FileReader(arg));
String[] split = arg.split("\\\\");
zos.putNextEntry(new ZipEntry(split[split.length-1]));
String s;
while((s=reader.readLine()) != null){
out.write(s.getBytes(Charset.defaultCharset()));
}
reader.close();
out.flush();
}
out.close();
对象序列化
对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。