Java IO的一般使用原则:
一、按数据来源(去向)分类:
1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
2、是byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、是Char[]: CharArrayReader, CharArrayWriter
4、是String: StringBufferInputStream, StringReader, StringWriter
5、网络数据流:InputStream, OutputStream, Reader, Writer
writer inputstream 在前面加上一些file ,byte[],char[],string,网络数据流是最原始的。
dataoutputstream datainputstream,以便读取或写入各种类型的数据
二、按是否格式化输出分:
1、要格式化输出:PrintStream, PrintWriter
三、按是否要缓冲分:
1、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
四、按数据格式分:
1、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类
2、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类
五、按输入输出分:
1、输入:Reader, InputStream类型的子类
2、输出:Writer, OutputStream类型的子类
六、特殊需要:
1、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
2、对象输入输出:ObjectInputStream, ObjectOutputStream
3、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4、合并输入:SequenceInputStream
5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
首先,考虑最原始的数据格式是什么: 原则四
第二,是输入还是输出:原则五
第三,是否需要转换流:原则六第1点
第四,数据来源(去向)是什么:原则一
第五,是否要缓冲:原则三 (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)
第六,是否要格式化输出:原则二
每一步下来就可以把你的选择缩小一些,构造的过程也基本上就是这样,举一例说明:
java servlet来处理一个上传文件的页面:
<form action="/servlet/upload" method="post" enctype="multipart/form-data">
.....
</form>
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = new PrintWriter ( // 原则五
response.getOutputStream() // 原则四及原则一第5点
);
out.println("<html>");
out.println("<head><title>ShowFormdata</title></head>");
out.println("<body>");
out.println("<hr>");
out.println(request.getContentType());
out.println("<pre>");
BufferedInputStream in = new BufferedInputStream( // 原则三
request.getInputStream() // 原则四及原则一第5点
);
int c;
while((c=in.read())!=-1)
out.write(c); // 此处特别注意的是:虽然我用了writer作为输出,但我一样可以用write这个简单的接口来作实际输出
// 究其原因:我的输入根据原则四只能用read,所以决定了我的输出方式
out.println("</pre>");
out.println("</body></html>");
out.close();
}
这个例子可能不太准确,甚至可以说有错误,但可以说明一些以上所述的问题。
纯属个人经验,有兴趣可以与我探讨。 luodi@szonline.net
一.在 JDK 1.0 中,通常是用 InputStream & OutputStream 这两个基类来进行读写操作的。
InputStream 中的 FileInputStream 类似一个文件句柄,通过它来对文件进行操作,类似的,在
OutputStream 中我们有 FileOutputStream 这个对象。
用FileInputStream 来读取数据的常用方法是:
FileInputStream fstream = new FileInputStream(args[0]);
DataInputStream in = new DataInputStream(fstream);
用 in.readLine() 来得到数据,然后用 in.close() 关闭输入流。
用FileOutputStream 来写入数据的常用方法是:
FileOutputStream out out = new FileOutputStream("myfile.txt");
PrintStream p = new PrintStream( out );
用 p.println() 来写入数据,然后用 p.close() 关闭输入。
二.在 JDK 1.1中,支持两个新的对象 Reader & Writer, 它们只能用来对文本文件进行操作,而
JDK1.1中的 InputStream & OutputStream 可以对文本文件或二进制文件进行操作。
用FileReader 来读取文件的常用方法是:
FileReader fr = new FileReader("mydata.txt");
BufferedReader br = new BufferedReader(fr);
用 br.readLing() 来读出数据,然后用br.close() 关闭缓存,用fr.close() 关闭文件。
用 FileWriter 来写入文件的常用方法是:
FileWriter fw = new FileWriter("mydata.txt");
PrintWriter out = new PrintWriter(fw);
在用out.print 或 out.println 来往文件中写入数据,out.print 和 out.println的唯一区别是后者写
入数据或会自动开一新行。写完后要记得 用out.close() 关闭输出,用fw.close() 关闭文件。
补充两句:
除了上面说的两个类,其他还有不少类。比如BufferedInputStream,DataInputStream.这些类都是遵照装饰器(decorate 好像是这样拼的)模式设计的。具体参看设计模式。这些类是给基本的输出输入流来添加功能的。比如new BufferedInputStream(new FileInputStream(a file))就给文件输入流增加了缓冲功能。这样设计的好处是不必生成一大堆子类。而可以用少数的几个类来组合出各种功能。看过<设计模式>的话就可以理解到这样设计的好处了。