java中的IO流分为字节流和字符流;每种流又分输入流和输出流。先来说一下输入流和输出流:输入输出是针对程序内存而言,那么输入就是向内存写入数据;输出就是从程序内存写出数据。
字节流直接文件数据。
字符流则是通过字节写入到缓存,再通过缓存区操作数据。
字节流的父类为InputStream(输入流)和OutputStream(输出流)。
IntputStream的直接子类有:AudioInputStream,ByteArrayInputStream,FileInputStream,FilterInputStream,InputStream,ObjectInputStream, PipedInputStream,
SequenceInputStream, StringBufferInputStream
OutputSteam的直接子类有:ByteArrayOutputStream,FileOutputStream,FilterOutputStream,ObjectOutputStream,OutputStream,PipedOutputStream
字符流的父类为Reader(输入流)和Writer(输出流)。
Reader的直接子类有:BufferedReader,CharArrayReader,FilterReader,InputStreamReader,PipedReader,StringReader
Writer的直接子类有:BufferedWriter,CharArrayWriter,FilterWriter,OutputStreamWriter,PipedWriter,PrintWriter, StringWriter
下面对字节流和字符流做详细的说明:
一、字节流
1 字节输出流:OutputStream
OutputStream是IO包中字节输出流的最大父类,它是一个抽象类,实现了Closeable,Flushable接口,我们必须通过其子类实例化对象。
主要有一下及一个方法:
void close() 关闭次输出流并释放相关的所有系统资源
void flush() 刷新此输出流并强制写出所有的缓冲的输出字节
void write(byte[] b) 将b.length个字节从指定的byte数组写入流
void write(byte[] b, int off, int len) 将指定byte数组中从偏移量off开始的len个字节写入输出流
void write(int b) 将指定的字节写入此输出流
讲一段数据写入到d盘test.txt中
package andy.io.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* @author Zhang,Tianyou
* @version 2014年11月18日 下午11:44:06
*/
public class OutputStreamTest {
public static void main(String[] args) throws IOException {
//将输入流写入此文件
File file = new File("d:" + File.separator + "test.txt");
OutputStream outputStream = null;
//使用子类实例化
outputStream = new FileOutputStream(file, true);//文件的追加
String str = "hello andy !";
byte b[] = str.getBytes();
//1 方法一
//outputStream.write(b);
//2 方法二
for (int i = 0; i < b.length; i++) {
outputStream.write(b[i]);
}
//3方法三
//outputStream.write(b, 0, b.length);
//写完一定要关闭输出流释放资源
outputStream.close();
}
}
2 字节输入流:InputStream
InputStream是IO包中字节输入流的最大父类,它是一个抽象类,实现了Closeable,Flushable接口,也必须通过其子类实例化对象。
主要有一下及一个方法:
void close() 关闭次输入流并释放相关的所有系统资源
int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b
中。
void read(byte[] b, int off, int len) 将输入流中最多 len
个数据字节读入 byte 数组。
int read()从输入流中读取数据的下一个字节。
package andy.io.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @author Zhang,Tianyou
* version:2014-11-19 上午11:40:24
*
*
*/
public class InputStreamTest {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// 读取d盘下test.txt的文件
File file = new File("d:" +File.separator + "test.txt");
// 通过FileInputStream 实例化
InputStream inputStream = null;
inputStream = new FileInputStream(file);
//定义字节数组
byte[] b = new byte[(int) file.length()];
//第一种
//int len = inputStream.read(b);
//第二种
/*for (int i=0; i<b.length; i++) {
b[i] = (byte) inputStream.read();
}*/
//第三种
inputStream.read(b, 0, b.length);
//关闭相应的流
inputStream.close();
System.out.println("test 内容为: " + new String(b));
}
}
运行结果如下:
test 内容为: hello andy !
二、 内存操作流
内存的读写流 ByteArrayInputStream 和 ByteArrayOutputStream。
ByteArrayInputStream主要完成将内容写入到内存中,而ByteArrayOutputStream的功能主要是将内存中的数据输出
写入内存: 数据------------------->ByteArrayInputStream--------------------------->内存
内存输出: 数据<------------------ByteArrayOutputStream<--------------------------内存