`
thirtysix
  • 浏览: 35574 次
  • 性别: Icon_minigender_1
  • 来自: 河北承德
社区版块
存档分类
最新评论

JAVA IO

阅读更多
文章原本是写给我们同学作为考试复习用的,
所以有些地方显的比较功利也有点不求甚解。
适合初学者。
有什么不对的地方请一定指出:-)
本来是WORD的,在这里,只能牺牲格式了:-(
JAVA 的IO包
针对考试,我认为同学们只需掌握JAVA IO包的基本用法,应该就可以应付有余了。下面
是本文将涉及到的IO类。
1.File
2.xxxStream
xxxReader
xxxWriter
3.串行化(Serialize)
File类
File这个类的名字起的不太好。当然跟JAVA里面有很多其它坏名字比起来它已经算是比
较好的了:-)
我们刚接触到File的时候,会很自然的以为这个类的对象就是磁盘上的一个文件,还会
很自然的想到这个类大概能提供读取、写入等各种功能。而事实却完全不是如此,这些
读写功能都是由后面讲的Reader/Writer/Stream来提供的。
所以请注意:
1.File类的对象根本不是磁盘上的某个文件,也不是某个目录
2.File类根本不提供读写文件内容的方法
我们把File类理解成FileSystem(文件系统)说不定更合适,因为File提供:
1.列出磁盘根目录的方法(比如 C: D: E:…)
2.列出某个目录下所有文件/目录的方法
3.判断某文件/目录各种属性(只读、隐藏…)的方法
4.新建目录结构、删除目录结构的方法
5.新建空文件、删除文件的方法
看看上面的功能,差不多你只要有这样一个File类,就可以实现很多DOS的一般功能了,
比如:dir, del, deltree, md(mkdir), rd(remove dir)等,是不是想试一下呢?或者
如果你掌握了Swing,差不多可以用File搭配Swing来做一个类似Windows的资源管理器了
如果为了应付考试,你可能需要掌握上述2、3所涉及的功能。我们举两个例子说一下:
 
判断文件系统上指定位置(如C:\a.txt)是否存在文件:
·新建一File对象: File target=new File("C:\\a.txt");
·用File类的exists来判断: if (target.exists()). . .
判断某个指定名称的文件/目录(如C:\a.txt)是文件,还是目录
·先用前面方法确定"C:\\a.txt"存在,去判断不存在的东西是文件/目录,就很不符合
逻辑了,我曾经看到不少同学有这样的问题。比如
File cur=new File(strName);
If (cur.isDirectory()). . .
而他上面的strName包含了一个错误的文件绝对路径。这样判断出来的结果有什么用处呢
·然后用File的isDirectory()来判断是否目录
别以为C:\a.txt一定是文件哦!去新建一个试试,完全可以是目录的。所以正确的写法
可能是这样的:
File cur=new File(strName);
If (cur.exists()){
If (cur.isDirectory()). . .
                }else{
                        System.err.println("No Such File/Dir!")
                }
更多其它代码请见附件FileTest.java。
其中包含了演示前面1-5所有功能的代码。
InputStream/OutputStream/Reader/Writer类
JAVA的IO包包括很大堆的输入输出类,运用他们可以完成向 Stdio、文件、网络读写文
本、数据、对象。
1.读写文本类型的文件,建议一般建议使用Reader/Writer一线的类。
oReader/Writer是在Stream之后为了弥补Stream对于双字节字符支持的不足而推出的。
所以,读写文本一般都应该使用Reader/Writer。特别是:
o读入文本时,用BufferedReader类的readLine方法,一下可以读一行,非常方便好用。
 
o写出文本时,用PrintWriter类的println方法,一下子可以写出一个字符串并且换行。
 
例,读文本文件:
FileReader fin=new FileReader("C:\\a.txt");
BufferedReader in=new BufferedReader(fin);
String line=in.readLine();
当然,我更愿意写的再简单些,比如这样:
BufferedReader in=new BufferedReader(new FileReader("C:\\a.txt"));String lin
e=in.readLine();
        
写文本文件:
        PrintWriter out=new PrintWriter(new FileWriter("C:\\a.txt"));
        out.println("hi this is a line.");
2.读写Standard IO
注:
System.in 是一个 InputStream 对象
System.out 是一个 PrintStream 对象
o读键盘输入,理论上说也是在读文本文件,似乎该使用1的办法才对,但是由于System
.in这个键盘输入对象并不是一个Reader系列的对象,而是Stream类的,所以当我们要一
行行读入键盘输入时,反而会要更麻烦些,需要先用System.in来构造一个Reader对象(
InputStreamReader),之后才能用BufferedReader来一行行读
例:
InputStreamReader rin=new InputStreamReader(System.in);
BufferedReader in=new BufferedReader(rin);
String line=in.readLine();
o屏幕输出System.out是PrintStream类的对象,此类本身提供了println这样的格式化输
出方法,使用很方便,相信大家都没有什么问题。我就不专门举例了。
3.读写数据 DataInput/OutputStream
程序中的用到的一些数据有时需要保存到文件中,比如一个整数数组,或者一个Double
数组,等。保存这些数据办法有两个:
一是将数据储存到文本文件中,使用1中描述的方法,但是缺点是程序再次读入这些数据
时,由于文本文件中没有纪录具体的数据类型,所以需要费些劲将字串转回原来的整形
、Double型。
还有一个办法就是使用DataOutputStream直接将数据以二进制的形式,保存到文件中,
之后可以用DataInputStream直接将被保存的数据读入,比上面的办法好用不少。但是这
样的办法的坏处是:因为是二进制保存,用户不能绕过程序直接编辑文件以修改保存下
来的数据,程序也不能读入用户手写的数据。
我们来看读入输出的具体方法:
输出:DataOutputStream 类的 writeInt (or writeDouble...)
输入:DataInputStream 类的readInt (or readDouble...)
例:
double[] array={1.2,2.0,3.4,5.3,5.43,6.456,5.4};
// write to file
DataOutputStream out=new DataOutputStream(new FileOutputStream("C:\\a.dat")
);
for (int i=0;i<array.length;i++)
        out.writeDouble(array[i]);
out.close();
// read in again to make sure everything's ok
DataInputStream in=new DataInputStream(new FileInputStream("C:\\a.dat"));
for (int i=0;i<array.length;i++)
        System.out.println(in.readDouble());
串行化(Serialize)
引入:
我们曾经做过一个编写描述学校情况的程序。你的程序里很可能有一些"学校"、"教室"
、"老师"等类。程序第一次运行时,很自然,你可能new了一个学校的对象,然后让用户
输入一个个的老师的姓名、年龄等。每收集完一个老师的情况,你可能就在程序里又NE
W一个新的"老师"的对象。好了!终于,用户辛辛苦苦的输入了200个学生,30个老师的
所有信息,你的程序里也有了200个学生对象,30个老师对象。
然后呢?
然后用户说:退出程序,并且很自然的假设下次他再次运行你的程序时,那些学生和老
师都仍然存在。
但是你在遍那道题的时候,有没有想到要保存这些"学生"和"老师"对象的信息呢?如果
想到要保存的话,你又怎么保存他们的呢?
一个傻办法是:写一个文本文件,将每个人的姓名、年龄、学号等对象的细节,一个个
写到文本文件里,然后下次全部读进来。缺是:太麻烦!
另一个办法就是:串行化,一次能把整一个对象写到文件中。代码量能少很多。
既然知道串行化好,怎么用呢?
o写出
1.事先确定需要串行化的类是什么,在类声明中加一句Implement Serializable
2.新建FileOutputStream(或者其它类型的OutputStream)指定将对象写到哪里去
3.新建ObjectOutputStream用它来的writeObject写出对象
例:
class Teacher implements serializable{
....
}
//.....
Teacher[] teachers=new Teacher[30];
// 让别人输入东西,把30个教师填好。
//. . . . . .
FileOutputStream f=new FileOutputStream("c:\\a.ser");
ObjectOutputStream out=new ObjectOutputStream(f);
for (int i=0;i<30;i++)
        out.writeObject(teachers[i]);
o读入
                
从外部读入以前串行化的对象时,要注意:原先保存到文件时,虽然保存了对象的所有
属性,但是唯独丢失了对象的类信息。所以重新读入时,一个Teacher会变成一个Objec
t,这时你必须手动的将此Object类对象强制转型成Teacher才能正常使用:
FileInputStream in=new FileInputStream("c:\\a.ser");
ObjectInputStream out=new ObjectInputStream(f);
for (int i=0;i<30;i++)
        teachers[i]=(Teacher)out.readObject();
上面就是一些简单的JAVA IO的情况。预祝大家都顺利PASS!
由于自己水平有限,如果上面写的地方有任何不足和纰漏,请一定告诉我以便及时更正
 
 
分享到:
评论
1 楼 wangdi 2009-01-08  
很像培训老师讲的东东。。

相关推荐

Global site tag (gtag.js) - Google Analytics