JAVA IO流(二)
字节流(stream)
字节读入流(InputStream)
此抽象类是表示字节输入流的所有类的超类。子类如下:
1.FileInputStream
从某个文本文件系统的文件中获得输入字节。如表示图像、音乐、电影的文件可以用FileInputStream来读取。
/**
* 读取图片的数据写进另一个图片里
* @param args
*/
public static void main(String[] args) {
try {
FileInputStream fi = new FileInputStream("F:\\2.jpg");
FileOutputStream fou = new FileOutputStream("F:\\3.jpg");
int len;
try {
while((len = fi.read()) != -1){
fou.write(len);
}
fou.close();
fi.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
2.FilterInputStream
包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。FilterInputStream 类本身只是简单地重写那些将所有请求传递给所包含输入流的 InputStream 的所有方法。FilterInputStream 的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。
3.BufferedInputStream
BufferedInputStream 为另一个输入流添加一些功能,该类本身提供一个缓冲区,在读取文件的时候,先向该缓冲区中读入字节,再将缓冲的字节数组读取出来。提供的额外功能有mark(),reset();
/**
* 从键盘上读取输入的数据,并显示到控制台上
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
BufferedInputStream bi = new BufferedInputStream(System.in);
BufferedOutputStream bou = new BufferedOutputStream(System.out);
int len;
while((len = bi.read()) != -1){
bou.write(len);
bou.flush();
}
bou.close();
bi.close();
}
4.ObjectInputStream
将写入到ObjectOutStream的基本数据和J对象进行反序列化,可以实现对象的持久化存储,只有支持Serializable 或 Externalizable 的对象才可以从流中读取。
/**
*将person类写入“a.txt"中 并从中取出写入的person类对象,输出 姓名和年龄
* @param args
* @throws FileNotFoundException
* @throws IOException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
ObjectOutputStream obout = new ObjectOutputStream(new FileOutputStream("F:\\a.txt"));
obout.writeObject(new person("zhangsan",10));
obout.writeObject(new person("lisi",20));
obout.writeObject(new person("wangwu",30));
obout.close();
ObjectInputStream obin = new ObjectInputStream(new FileInputStream("F:\\a.txt"));
person p1 = (person) obin.readObject();
person p2 = (person) obin.readObject();
person p3 = (person) obin.readObject();
System.out.println(p1.getName()+":"+p1.getAge());
System.out.println(p2.getName()+":"+p2.getAge());
System.out.println(p3.getName()+":"+p3.getAge());
obin.close();
}
5.DataInputSteam
允许程序从输入流中读入基本Java数据类型的数据,对于线程的访问不一定是安全的。
/**
*向"a.txt"中写如boolean类型的数据,并从中读取出来,打印到控制台
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException{
DataOutputStream dout = new DataOutputStream(new FileOutputStream("F:\\a.txt"));
dout.writeBoolean(true);
dout.flush();
dout.close();
DataInputStream din = new DataInputStream(new FileInputStream("F:\\a.txt"));
boolean b = din.readBoolean();
din.close();
System.out.println(b);
}
6.PipedInputSteam
管道输入流应该和管道输出流同时使用,即连接到管道输出流,管道输入流提供要写入的所有数据。建议使用多个线程分别对他们进行操作,不然会照成死锁现象,另外它还包含一个缓冲区。
可以参考PipedReader的用法。
字节写入流(OutputStream)
抽象类是表示输出字节流的所有类的超类。子类如下:
1. FileOutputStream
文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。由于写入的是字节数据,若要写入如图像、音乐、电影的文件时,使用该类。
2. FilterOutputStream
是所有过滤输出流的超类。此流位于已存在的输出流之上,它们将已存在的输出流作为其基本数据接收器,但可能直接传输数据或提供一些额外的功能。 如以下子类:
BufferedOutputStreaem,DataOutputstream,PrintStream
3. BufferedOutputStream
包含一个缓冲区,建立在其它流的基础上。向用字节表示的文件写数据时,先将数据写入该类的缓冲区,再向目的地中写入数据。
4. PrintStream
为其它输出流提供了额外的功能,实现了自动刷新,如println()方法,另外该类永远不会抛出异常。PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。
PrintStream pou = new PrintStream(System.out,true); 即可实现自动刷新的功能。
5. DataObjectStream
数据输出流允许程序将基本 Java 数据类型写入输出流中。
6. ObjectOutputStream
可以将Java对象写入到输出流中,使用ObectInputStream读取Java对象,可以实现对象的持久存储。另外,它只支持实现Serializable 接口的对象,
7. PipedOutputSteam
管道读取流需要和管道输入流同时使用,即连接到输入流形成管道信道。建议使用多个线程分别对它们进行操作。