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!
由于自己水平有限,如果上面写的地方有任何不足和纰漏,请一定告诉我以便及时更正
 
 
阅读更多
个人分类: J2SE
想对作者说点什么? 我来说一句

java IO文档

2018年02月03日 3.92MB 下载

JAVA IO 输入输出流

2008年10月17日 11KB 下载

javaIO文件流

2008年12月29日 1KB 下载

java 文件操作相关命令

2010年03月04日 284KB 下载

Java的例外处理和IO

2009年04月25日 106KB 下载

java io 结构图

2009年07月23日 120KB 下载

java io reader

2010年03月30日 39KB 下载

JAVA IO流小结

2011年08月29日 27KB 下载

java io读写文件例子

2011年04月04日 784B 下载

JAVA教程IO流操作

2010年11月12日 37KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭