Java IO操作部分.docx
《Java IO操作部分.docx》由会员分享,可在线阅读,更多相关《Java IO操作部分.docx(46页珍藏版)》请在冰点文库上搜索。
JavaIO操作部分
JavaIO操作部分
*知识点
|--java基础部分由四个部分是必须掌握的:
1、面向对象,包括各个概念及使用
2、java类集
3、javaIO(如果是自学的人员,面对IO庞大的开发包基本上是比较郁闷的)
4、JDBC
5、IO文件操作的常用类:
File、RandomAccessFile、OutputStream、InputStream
Writer、Reader、OutputStreamWriter、InputStreamReader、
ByteArrayOutputStream、ByteArrayInputStream、PipedOutputStream、PipedInputStream、PrintStream、PrintWriter.
具体内容:
1、javaIO的主要分类
在javaIO实际上很好的体现了java的面向对象的设计思想
一个接口或抽象类的具体行为由子类决定,那么根据实际化子类的不同完成的功能也不同
JavaIO中的所有的操作类都放在javaIO包中
主要的类和接口是:
File、InputStream、OutputStream、Reader、Writer类和Seriazable接口
(一)File类
File类在整个java.io包中是一个独立的类,此类的主要功能是完成与平台无关文件操作,例如:
创建文件、删除文件等。
在File类中提供了一下的构造方法:
publicFile(Stringpathname)
·使用的时候需要依靠其指定一个文件的具体路径
掌握File类以下的操作:
1创建文件
2删除文件
3创建目录
4删除文件之前判断文件是否存在
5判断路径是文件还是文件夹
6列出目录中的内容
·创建文件
例如,现在要在D盘上创建一个地demo.txt的文件。
创建文件的方法:
publicbooleancreateNewFile()throwsIOException
importjava.io.*;
publicclassTing02{
publicstaticvoidmain(Stringargs[])throwsException{
Filefile=newFile("d:
\\Ting0001.text");
try
{
file.createNewFile();
}
catch(Exceptione)
{
System.out.println(e);
}
}
}
以上程序本身是作为一个文件的创建出现,而如果要使用具体的内容的输出,则必须依靠IO操作流。
·删除文件
如果要想删除文件则使用:
publicbooleandelete()
importjava.io.*;
publicclassTing02{
publicstaticvoidmain(Stringargs[])throwsException{
Filefile=newFile("d:
\\Ting0001.txt");
file.delete();
}
}
以上的操作确实完成了文件的创建和删除,可是代码却同样存在问题。
在各个操作系统中,文件的分隔符是不一样的:
·windows:
\
·linux:
/
Java本身属于跨平台的语言,那么应该可以适应各个不同的平台要求,那么为了解决可以自动适应不同系统的分隔符要求,所以在file类中提供了一下几个常量:
·路径的分隔符:
publicstaticfinalStringpathSeparator,相当于系统“;”
·分隔符:
publicstaticfinalStringseparator相当于系统“\”或者“/”
所以,对于实际的开发来讲,必须使用这样的常量进行声明。
正经的java常量字母应该全部大写,但是此处并没有大写,这就是java历史发展原因。
所以,以后程序都将采用File.separator进行分割。
·删除文件之前判断文件是否存在
提供了以下的方法:
publicbooleanexists();
importjava.io.*;
publicclassTing03
{
publicstaticvoidmain(Stringargs[]){
Filefile=newFile("d:
"+File.separator+"demo.txt");
if(file.exists())
{
System.out.println("文件存在");
}else{
System.out.println("文件不存在");
}
}
}
了解了以上特点之后完成以下的一个要求:
·要求编写一个程序,此程序的主要功能如下,如果文件存在,则删除,如果文件不存在则创建一个新的文件。
importjava.io.*;
publicclassTing01{
publicstaticvoidmain(Stringargs[])throwsException{
Filefile=newFile("d:
\\demo.txt");
if(file.exists())
{
file.delete();
}else{
try
{
file.createNewFile();
}
catch(Exceptione)
{
System.out.println(e);
}
}
}
}
程序此时确实可以完成功能,但是在操作的时间会存在延迟。
·判断路径是文件还是文件夹
在程序中可以使用如下的方法进行判断
·判断是否是文件夹:
publicbooleanisDirectory()
·判断是否是文件:
publicbooleanisFile()
importjava.io.*;
publicclassTing04
{
publicstaticvoidmain(Stringargs[]){
Filefile1=newFile("d:
"+File.separator+"demo.txt");
Filefile2=newFile("d:
"+File.separator+"ProgramFiles");
System.out.println(file1.isFile());
System.out.println(file2.isDirectory());
}
}
·列出目录中的内容
在File类中提供了一下的两个方法进行目录的列表操作:
·publicString[]list()
·publicFile[]listFiles()
importjava.io.*;
publicclassTing05
{
publicstaticvoidmain(Stringargs[]){
Filefile=newFile("d:
"+File.separator+"MLDNWEB");
Stringpath[]=file.list();
for(inti=0;i{
System.out.println(path[i]);
}
}
}
此处列出来的是一个目录下的文件或文件夹名称而已,运行结果如下:
如果现在使用listFiles()呢?
importjava.io.*;
publicclassTing06
{
publicstaticvoidmain(Stringargs[]){
Filefile=newFile("d:
"+File.separator+"MLDNWEB");
Filepath[]=file.listFiles();
for(inti=0;i{
System.out.println(path[i]);
}
}
}
运行结果如下:
这两个操作都同样属于列表的操作,但是后者却可以列出完整的路径,实际上此时,如果为了更加清楚地表示列出的是路径:
importjava.io.*;
publicclassTing06
{
publicstaticvoidmain(Stringargs[]){
Filefile=newFile("d:
"+File.separator+"MLDNWEB");
Filepath[]=file.listFiles();
for(inti=0;i{
System.out.print(path[i].getParent()+"-->");
System.out.println(path[i].getPath());
}
}
}
运行结果如下:
如果要想操作文件,则肯定使用后者最为方便,因为可以找到File类的对象,实际上就找到了完整的路径。
·创建目录
使用:
publicbooleanmkdir()
importjava.io.*;
publicclassTing07
{
publicstaticvoidmain(Stringargs[]){
Filefile=newFile("d:
"+File.separator+"TINGTING");
file.mkdir();
}
}
在windows中有很多文件的后缀,例如:
txt、doc、jpg,实际上这些文件的后缀与文件本身的内容没有任何的联系,加入后缀只是为了方便程序的管理而已。
当然,在创建的时候,也可以在一个文件夹下创建文件
importjava.io.*;
publicclassTing07
{
publicstaticvoidmain(Stringargs[]){
Filefile=newFile("d:
"+File.separator+"TINGTING"+File.separator+"test.txt");
file.getParentFile().mkdir();
try
{
file.createNewFile();
}
catch(Exceptione)
{
System.out.println(e);
}
}
}
总结:
File类
1创建文件:
publicbooleancreateNewFile()throwsIOException
2删除文件:
publicbooleandelete()
3创建目录:
publicbooleanmkdir()
4判断是否是文件:
publicbooleanisFile()
5判断是否是文件夹:
publicbooleanisDirectory()
6列出目录中的内容:
(1)publicString[]list()
(2)publicFile[]listFiles()
7删除文件之前判断文件是否存在:
publicbooleanexists()
8目录同文件同时需要建立则需要:
file.getParentFile().mkdir();
(二)RandomAccessFile类
具体内容
RandomAccessFile类的主要功能是完成随机读取,可以读取指定位置的内容。
假设现在文件中存储了以下的三个数据:
·zhangsan,30
·lisi,31
·wangwu,32
因为在文件中,所有的内容都是按照字节存放的,都有固定的保存位置。
·RandomAccessFile类的常用操作方法
构造:
publicRandomAccessFile(Filefile,
Stringmode)
throwsFileNotFoundException
实例化此类的时候需要传递File类,告诉程序应该操作的是哪个文件,之后又一个模式,文件的打开模式,常用的三种模式:
·r:
读模式
·w:
只写
·rw:
读写,如果使用此模式,如果文件不存在,则会自动创建。
importjava.io.File;
importjava.io.RandomAccessFile;
publicclassRandomAccessFileDemo01{
//所有的异常直接抛出,程序中不再进行处理
publicstaticvoidmain(Stringargs[])throwsException{
Filef=newFile("d:
"+File.separator+"test.txt");//指定要操作的文件
RandomAccessFilerdf=null;//声明RandomAccessFile类的对象
rdf=newRandomAccessFile(f,"rw");//读写模式,如果文件不存在,会自动创建
Stringname=null;
intage=0;
name="zhangsan";//字符串长度为8
age=30;//数字的长度为4
rdf.writeBytes(name);//将姓名写入文件之中
rdf.writeInt(age);//将年龄写入文件之中
name="lisi";//字符串长度为8不够的话空格补齐
age=31;//数字的长度为4
rdf.writeBytes(name);//将姓名写入文件之中
rdf.writeInt(age);//将年龄写入文件之中
name="wangwu";//字符串长度为8
age=32;//数字的长度为4
rdf.writeBytes(name);//将姓名写入文件之中
rdf.writeInt(age);//将年龄写入文件之中
rdf.close();//关闭
}
};
以上完成了写入的操作,每条数据的长度都是12位。
写完之后,开始读取数据。
写的时候可以将一个字符串写入,读的时候需要一个个地以字节的形式读取出来。
importjava.io.File;
importjava.io.RandomAccessFile;
publicclassRandomAccessFileDemo02{
//所有的异常直接抛出,程序中不再进行处理
publicstaticvoidmain(Stringargs[])throwsException{
Filef=newFile("d:
"+File.separator+"test.txt");//指定要操作的文件
RandomAccessFilerdf=null;//声明RandomAccessFile类的对象
rdf=newRandomAccessFile(f,"r");//以只读的方式打开文件
Stringname=null;
intage=0;
byteb[]=newbyte[8];//开辟byte数组
//读取第二个人的信息,意味着要空出第一个人的信息
rdf.skipBytes(12);//跳过第一个人的信息
for(inti=0;ib[i]=rdf.readByte();//读取一个字节
}
name=newString(b);//将读取出来的byte数组变为字符串
age=rdf.readInt();//读取数字
System.out.println("第二个人的信息-->姓名:
"+name+";年龄:
"+age);
//读取第一个人的信息
rdf.seek(0);//指针回到文件的开头
for(inti=0;ib[i]=rdf.readByte();//读取一个字节
}
name=newString(b);//将读取出来的byte数组变为字符串
age=rdf.readInt();//读取数字
System.out.println("第一个人的信息-->姓名:
"+name+";年龄:
"+age);
rdf.skipBytes(12);//空出第二个人的信息
for(inti=0;ib[i]=rdf.readByte();//读取一个字节
}
name=newString(b);//将读取出来的byte数组变为字符串
age=rdf.readInt();//读取数字
System.out.println("第三个人的信息-->姓名:
"+name+";年龄:
"+age);
rdf.close();//关闭
}
};
如果要想操作文件内容的话,可以使用RandomAccessFile完成
总结:
1、RandomAccessFile类的作用
2、RandomAccessFile类操作起来比较麻烦,所以在IO中会提供专门的输入、输出操作。
(三)字节流与字符流类
具体内容
·流的概念
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
程序中的输入输出都是以流的形式保存的,流中保存的实际上全部都是字节文件。
·字节流与字符流的作用
在java.io包中操作文件内容的主要有两大类:
字节流、字符流,两类都分输入和输出操作。
在字节流中输出数据主要是使用OutputStream完成,输入使得是InputStream,在字符流中输出主要是使用Writer类完成,输入主要是使用Reader类完成。
内容操作就四个类:
OutputStream、InputStream、Writer、Reader
·操作流程
在java中IO操作也是有相应步骤的,以文件操作为例,主要操作流程如下:
A、使用File类打开一个文件
B、通过字节流或字符流的子类,指定输出地位置
C、进行读/写操作
D、关闭输入/输出
使用File类操作的时候一定要有路径的问题,注意分隔符。
实际上四个操作类都是抽象类
IO操作属于资源操作,对于资源操作,操作的最后必须关闭否则就有可能出现未知的错误。
·字节流
字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream。
·字节输出流:
OutputStream
·字节输入流:
InputStream
Byte是字节,肯定使用字节流操作。
所有的数据基本上都可以直接使用byte数组表示出来。
·字节输出流:
OutputStream
·OutputStream是整个IO包中字节输出流的最大父类,此类的定义如下:
·publicabstractclassOutputStreamextendsObject
implementsCloseable,Flushable
·从以上的定义中可以发现,此类是以个抽象类,如果要想使用此类的话,则首先必须通过子类实例化对象,那么如果现在要操作的是一个文件,则可以使用:
FileOutputStream类。
通过向上转型之后,可以以OutputStream实例化。
Clonseable:
表示可以关闭的操作,因为程序运行到最后肯定要关闭
Fluashable:
表示刷新,清空内存中的数据
·OutputStream类的常用方法
1
publicvoidclose()throwsIOException
普通
关闭输出流
2
publicvoidflush()throwsIOException
普通
刷新缓冲区
3
publicvoidwrite(byte[]b)throwsIOException
普通
将一个byte数组写入数据流
4
publicvoidwrite(byte[]b,intoff,intlen)throwsIOException
普通
将一个指定范围的byte数组写入数据流
5
publicabstractvoidwrite(intb)throwsIOException
普通
将一个字节数据写入数据流
要想使用以上方法,必须使用子类实例化,此时使用FileOutputStream子类,此类的构造方法如下:
publicFileOutputStream(Filefile)throwsFileNotFoundException
importjava.io.File;
importjava.io.OutputStream;
importjava.io.FileOutputStream;
publicclassOutputStreamDemo01{
publicstaticvoidmain(Stringargs[])throwsException{//异常抛出,不处理
//第1步、使用File类找到一个文件
Filef=newFile("d:
"+File.separator+"test.txt");//声明File对象
//第2步、通过子类实例化父类对象
OutputStreamout=null;//准备好一个输出的对象
out=newFileOutputStream(f);//通过对象多态性,进行实例化
//第3步、进行写操作
Stringstr="HelloWorld!
!
!
";//准备一个字符串
byteb[]=str.getBytes();//只能输出byte数组,所以将字符串变为byte数组
out.write(b);//将内容输出,保存文件
//第4步、关闭输出流
out.close();//关闭输出流
}
};
在操作的时候,如果文件本身不存在,则会为用户自动创建新文件。
在操作输出流的时候,也可以使用write(inti)方法写出数据。
importjava.io.File;
importjava.io.OutputStream;
importjava.io.FileOutputStream;
publicclassOutputStreamDemo02{
publicstaticvoidmain(Stringargs[])throwsException{//异常抛出,不处理
//第1步、使