声明:这篇文章主要内容大部分都是从林信良的Java学习日记这本书中摘录下来,仅作为个人学习参考用
IO流的一个小例子:
package com.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class StreamIO
{
public static void dump(InputStream src, OutputStream dest) //这里是数据的来源(inputstream)以及数据的目的地(OutputStream)。
throws IOException//在这里不进行处理异常,抛给客户端处理异常
{
InputStream input = src;
OutputStream output = dest;
byte[] data = new byte[1024];//尝试每次从数据来源读取1024字节
int length=-1;
while((length = input.read(data))!=-1)//只要读到的数据不为空
{
output.write(data,0,length);
//每次从InputStream读入的数据,都会先存入byte的数组中,InputStream的read()方法每次都会尝试读取byte数组长度的数据
//并且返回实际读入的字节
//可以使用output的write()方法,指定要写出byte数组,初始索引,数据长度。
//这个dump()方法的来源和目的地都不知道
}
}
}
这个类可以将某个文档读入并且存为另一个文档:例如:
package com.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamCopy
{
public static void main(String []args) throws IOException
{
StreamIO.dump(new FileInputStream(args[0]),new FileOutputStream(args[1]));
}
}
这个程序可以由命令行自变量指定读取的文档来源以及写出的目的地:例如:
Java com.io.StreamCopy c:\workspace\Main.java C:\workspace\Main.txt
如果要从HTTP服务器读取某个网页,并且另存为文档,也可以使用dump方法:
package com.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
public class Download
{
public static void main(String []args) throws IOException
{
URL url=new URL(args[0]);
InputStream src = url.openStream();
OutputStream dest = new FileOutputStream(args[1]);
StreamIO.dump(src, dest);
}
}
串流继承架构
标准输入输出:
将刚才的下载例子改成标准输出:
URL url1=new URL(args[0]);
InputStream is = url.openStream();
StreamIO.dump(is, System.out);
FileInputStream和FileOutputStream
都是InputStream和OutputStream的子类,可以用来读取数据和写出数据。
不使用的时候记得要用close()关闭文档。
- FileInputStream主要用父类的read()方法,可以从文档中读取数据;
- FileOutputStream主要用父类的write()方法,可以写出数据至文档。
这两个类在读取、写入文档时,是以字节为单位。
ByteArraynputStream和ByteArrayOutputStream
在上面的第一个例子就写到了。
串流处理打包(装饰)器:
BufferedInputStream和BufferedOutputStream
InputStream和OutputStream在读写的时候都是直接将数据写入硬盘中,这样效率会比较低。
而BufferedInputStream和BufferedOutputStream则会先将足够的数据存到内存的缓冲区,如果缓冲区中有需要的数据就直接从缓冲区读取,效率就会高一些。
这两个类操作上和InputStream和OutputStream并没有太大差别。
e.g.将第一个例子改写:
package com.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class BufferedIO
{
public static void dump(InputStream src, OutputStream dest)
throws IOException
{
InputStream input = new BufferedInputStream(src);
OutputStream output = new BufferedOutputStream(dest);
byte[] data = new byte[1024];
int length=-1;
while((length = input.read(data))!=-1)
{
output.write(data,0,length);
}
}
}
DataInputStream和DataOutputStream
在读写int/double/boolean等的数据时,这个会自动在指定的类型与字节之间转换。
ObjectInputStream和ObjectOutputStream
…
字符处理类:
Reader和Writer:
字符处理装饰器:
InputStreamReader和OutputStreamWriter
BufferedReader和BufferedWriter
带缓冲。。。