﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-IT人生-文章分类-Java</title><link>http://www.blogjava.net/cool2009/category/38165.html</link><description>专注于java相关技术.</description><language>zh-cn</language><lastBuildDate>Sun, 08 Mar 2009 13:33:46 GMT</lastBuildDate><pubDate>Sun, 08 Mar 2009 13:33:46 GMT</pubDate><ttl>60</ttl><item><title>彻底明白Java的IO系统 (转载)</title><link>http://www.blogjava.net/cool2009/articles/258459.html</link><dc:creator>龙华城</dc:creator><author>龙华城</author><pubDate>Sun, 08 Mar 2009 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/cool2009/articles/258459.html</guid><wfw:comment>http://www.blogjava.net/cool2009/comments/258459.html</wfw:comment><comments>http://www.blogjava.net/cool2009/articles/258459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cool2009/comments/commentRss/258459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cool2009/services/trackbacks/258459.html</trackback:ping><description><![CDATA[<p>一． Input和Output<br />
1. stream代表的是任何有能力产出数据的数据源，或是任何有能力接收数据的接收源。在Java的IO中，所有的stream（包括Input和Out stream）都包括两种类型：<br />
1.1 以字节为导向的stream<br />
以字节为导向的stream，表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型：<br />
1) input　stream：<br />
1) ByteArrayInputStream：把内存中的一个缓冲区作为InputStream使用<br />
2) StringBufferInputStream：把一个String对象作为InputStream<br />
3) FileInputStream：把一个文件作为InputStream，实现对文件的读取操作<br />
4) PipedInputStream：实现了pipe的概念，主要在线程中使用<br />
5) SequenceInputStream：把多个InputStream合并为一个InputStream<br />
2) Out　stream<br />
1) ByteArrayOutputStream：把信息存入内存中的一个缓冲区中<br />
2) FileOutputStream：把信息存入文件中<br />
3) PipedOutputStream：实现了pipe的概念，主要在线程中使用<br />
4) SequenceOutputStream：把多个OutStream合并为一个OutStream<br />
1.2 以Unicode字符为导向的stream<br />
以Unicode字符为导向的stream，表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型：<br />
1) Input　Stream<br />
1) CharArrayReader：与ByteArrayInputStream对应<br />
2) StringReader：与StringBufferInputStream对应<br />
3) FileReader：与FileInputStream对应<br />
4) PipedReader：与PipedInputStream对应<br />
2) Out　Stream<br />
1) CharArrayWrite：与ByteArrayOutputStream对应<br />
2) StringWrite：无与之对应的以字节为导向的stream<br />
3) FileWrite：与FileOutputStream对应<br />
4) PipedWrite：与PipedOutputStream对应<br />
<br />
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同，字是在操作时的导向不同。如CharArrayReader：和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用，所不同的是前者每次从内存中读取一个字节的信息，而后者每次从内存中读取一个字符。<br />
1.3 两种不现导向的stream之间的转换<br />
InputStreamReader和OutputStreamReader：把一个以字节为导向的stream转换成一个以字符为导向的stream。<br />
2. stream添加属性<br />
2.1 &#8220;为stream添加属性&#8221;的作用<br />
运用上面介绍的Java中操作IO的API，我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类，我们可以为stream添加属性。<br />
下面以一个例子来说明这种功能的作用。<br />
如果我们要往一个文件中写入数据，我们可以这样操作：<br />
FileOutStream fs = new FileOutStream(&#8220;test.txt&#8221;);<br />
然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是，如果我们想实现&#8220;先把要写入文件的数据先缓存到内存中，再把缓存中的数据写入文件中&#8221;的功能时，上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和FilterOutStream的子类，为FileOutStream添加我们所需要的功能。<br />
2.2 FilterInputStream的各种类型<br />
2.2.1 用于封装以字节为导向的InputStream<br />
1) DataInputStream：从stream中读取基本类型（int、char等）数据。<br />
2) BufferedInputStream：使用缓冲区<br />
3) LineNumberInputStream：会记录input stream内的行数，然后可以调用getLineNumber()和setLineNumber(int)<br />
4) PushbackInputStream：很少用到，一般用于编译器开发<br />
2.2.2 用于封装以字符为导向的InputStream<br />
1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader，否则使用DataInputStream<br />
2) BufferedReader：与BufferedInputStream对应<br />
3) LineNumberReader：与LineNumberInputStream对应<br />
4) PushBackReader：与PushbackInputStream对应<br />
2.3 FilterOutStream的各种类型<br />
2.2.3 用于封装以字节为导向的OutputStream<br />
1) DataIOutStream：往stream中输出基本类型（int、char等）数据。<br />
2) BufferedOutStream：使用缓冲区<br />
3) PrintStream：产生格式化输出<br />
2.2.4 用于封装以字符为导向的OutputStream<br />
1) BufferedWrite：与对应<br />
2) PrintWrite：与对应<br />
3. RandomAccessFile<br />
1) 可通过RandomAccessFile对象完成对文件的读写操作<br />
2) 在产生一个对象时，可指明要打开的文件的性质：r，只读；w，只写；rw可读写<br />
3) 可以直接跳到文件中指定的位置<br />
4. I/O应用的一个例子<br />
<br />
Java codeimportjava.io.*;publicclassTestIO{publicstaticvoidmain(String[] args)throwsIOException{//1.以行为单位从一个文件读取数据BufferedReader in=newBufferedReader(newFileReader("F:\\nepalon\\TestIO.java")); <br />
String s, s2=newString();while((s=in.readLine())!=null) <br />
s2+=s+"\n"; <br />
in.close();//1b. 接收键盘的输入BufferedReader stdin=newBufferedReader(newInputStreamReader(System.in)); <br />
System.out.println("Enter a line:"); <br />
System.out.println(stdin.readLine());//2. 从一个String对象中读取数据StringReader in2=newStringReader(s2);intc;while((c=in2.read())!=-1) <br />
System.out.println((char)c); <br />
in2.close();//3. 从内存取出格式化输入try{ <br />
DataInputStream in3=newDataInputStream(newByteArrayInputStream(s2.getBytes()));while(true) <br />
System.out.println((char)in3.readByte()); <br />
}catch(EOFException e){ <br />
System.out.println("End of stream"); <br />
}//4. 输出到文件try{ <br />
BufferedReader in4=newBufferedReader(newStringReader(s2)); <br />
PrintWriter out1=newPrintWriter(newBufferedWriter(newFileWriter("F:\\nepalon\\ TestIO.out")));intlineCount=1;while((s=in4.readLine())!=null) <br />
out1.println(lineCount+++"："+s); <br />
out1.close(); <br />
in4.close(); <br />
}catch(EOFException ex){ <br />
System.out.println("End of stream"); <br />
}//5. 数据的存储和恢复try{ <br />
DataOutputStream out2=newDataOutputStream(newBufferedOutputStream(newFileOutputStream("F:\\nepalon\\ Data.txt"))); <br />
out2.writeDouble(3.1415926); <br />
out2.writeChars("\nThas was pi:writeChars\n"); <br />
out2.writeBytes("Thas was pi:writeByte\n"); <br />
out2.close(); <br />
DataInputStream in5=newDataInputStream(newBufferedInputStream(newFileInputStream("F:\\nepalon\\ Data.txt"))); <br />
BufferedReader in5br=newBufferedReader(newInputStreamReader(in5)); <br />
System.out.println(in5.readDouble()); <br />
System.out.println(in5br.readLine()); <br />
System.out.println(in5br.readLine()); <br />
}catch(EOFException e){ <br />
System.out.println("End of stream"); <br />
}//6. 通过RandomAccessFile操作文件RandomAccessFile rf=newRandomAccessFile("F:\\nepalon\\ rtest.dat","rw");for(inti=0; i&lt;10; i++) <br />
rf.writeDouble(i*1.414); <br />
rf.close(); <br />
<br />
rf=newRandomAccessFile("F:\\nepalon\\ rtest.dat","r");for(inti=0; i&lt;10; i++) <br />
System.out.println("Value"+i+"："+rf.readDouble()); <br />
rf.close(); <br />
<br />
rf=newRandomAccessFile("F:\\nepalon\\ rtest.dat","rw"); <br />
rf.seek(5*8); <br />
rf.writeDouble(47.0001); <br />
rf.close(); <br />
<br />
rf=newRandomAccessFile("F:\\nepalon\\ rtest.dat","r");for(inti=0; i&lt;10; i++) <br />
System.out.println("Value"+i+"："+rf.readDouble()); <br />
rf.close(); <br />
} <br />
}<br />
<br />
<br />
<br />
关于代码的解释（以区为单位）：<br />
1区中，当读取文件时，先把文件内容读到缓存中，当调用in.readLine()时，再从缓存中以字符的方式读取数据（以下简称&#8220;缓存字节读取方式&#8221;）。<br />
1b区中，由于想以缓存字节读取方式从标准IO（键盘）中读取数据，所以要先把标准IO（System.in）转换成字符导向的stream，再进行BufferedReader封装。<br />
2区中，要以字符的形式从一个String对象中读取数据，所以要产生一个StringReader类型的stream。<br />
4区中，对String对象s2读取数据时，先把对象中的数据存入缓存中，再从缓冲中进行读取；对TestIO.out文件进行操作时，先把格式化后的信息输出到缓存中，再把缓存中的信息输出到文件中。<br />
5区中，对Data.txt文件进行输出时，是先把基本类型的数据输出屋缓存中，再把缓存中的数据输出到文件中；对文件进行读取操作时，先把文件中的数据读取到缓存中，再从缓存中以基本类型的形式进行读取。注意in5.readDouble()这一行。因为写入第一个writeDouble()，所以为了正确显示。也要以基本类型的形式进行读取。<br />
6区是通过RandomAccessFile类对文件进行操作。<br />
</p> <img src ="http://www.blogjava.net/cool2009/aggbug/258459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cool2009/" target="_blank">龙华城</a> 2009-03-08 14:05 <a href="http://www.blogjava.net/cool2009/articles/258459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java精选25道题（转载）</title><link>http://www.blogjava.net/cool2009/articles/258397.html</link><dc:creator>龙华城</dc:creator><author>龙华城</author><pubDate>Sat, 07 Mar 2009 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/cool2009/articles/258397.html</guid><wfw:comment>http://www.blogjava.net/cool2009/comments/258397.html</wfw:comment><comments>http://www.blogjava.net/cool2009/articles/258397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cool2009/comments/commentRss/258397.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cool2009/services/trackbacks/258397.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.&nbsp;float型float&nbsp;f=3.4是否正确?　　答：不正确，应为float&nbsp;f=3.4f　　2.&nbsp;当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递?　　答：是引用传递。　　3.&nbsp;在java中一个类被声明为final类型，表示了什么意思?　　答：表示该类...&nbsp;&nbsp;<a href='http://www.blogjava.net/cool2009/articles/258397.html'>阅读全文</a><img src ="http://www.blogjava.net/cool2009/aggbug/258397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cool2009/" target="_blank">龙华城</a> 2009-03-07 20:37 <a href="http://www.blogjava.net/cool2009/articles/258397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java精选25道题（转载）</title><link>http://www.blogjava.net/cool2009/articles/258394.html</link><dc:creator>龙华城</dc:creator><author>龙华城</author><pubDate>Sat, 07 Mar 2009 12:15:00 GMT</pubDate><guid>http://www.blogjava.net/cool2009/articles/258394.html</guid><wfw:comment>http://www.blogjava.net/cool2009/comments/258394.html</wfw:comment><comments>http://www.blogjava.net/cool2009/articles/258394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cool2009/comments/commentRss/258394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cool2009/services/trackbacks/258394.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.&nbsp;float型float&nbsp;f=3.4是否正确?　　答：不正确，应为float&nbsp;f=3.4f　　2.&nbsp;当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递?　　答：是引用传递。　　3.&nbsp;在java中一个类被声明为final类型，表示了什么意思?　　答：表示该类...&nbsp;&nbsp;<a href='http://www.blogjava.net/cool2009/articles/258394.html'>阅读全文</a><img src ="http://www.blogjava.net/cool2009/aggbug/258394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cool2009/" target="_blank">龙华城</a> 2009-03-07 20:15 <a href="http://www.blogjava.net/cool2009/articles/258394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>