第六章 文件的处理1.docx
《第六章 文件的处理1.docx》由会员分享,可在线阅读,更多相关《第六章 文件的处理1.docx(13页珍藏版)》请在冰豆网上搜索。
第六章文件的处理1
第六章文件的处理及java中的IO流
6.1File类
在java程序中常常会涉及到对文件的处理,如果想通过程序对文件和目录进行操作,如:
新建,删除或者重命名等等,都可以使用File类,File类是文件和目录路径名得抽象表现形式,File类常用的主要的方法如下表:
表6-1:
构造方法
成员方法
功能
File(Stringpathname)
通过将给定路径名字符串转换成抽象路径名来创建一个新File实例
管理方法
成员方法
功能
publicbooleanmkdir()
创建此抽象路径名指定的目录
publicbooleanmkdirs()
创建此抽象路径名指定的目录,包括创建必需但不存在的父目录
publicStringgetName()
返回由此抽象路径名表示的文件或目录的名称
publicStringgetParent()
返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回null
publicStringgetPath()
将此抽象路径名转换为一个路径名字符串
publicFilegetAbsoluteFile()
返回抽象路径名的绝对路径名形式
publicStringgetAbsolutePath()
返回抽象路径名的绝对路径名字符串
publicbooleancreateNewFile()
当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件
publicbooleandelete()
删除此抽象路径名表示的文件或目录
测试方法
成员方法
功能
publicbooleanexists()
测试此抽象路径名表示的文件或目录是否存在
6.1.1任务一:
对文件和目录进行简单操作
任务目标:
✧初步了解File类
✧熟悉File类中的常用方法
源代码如下:
importjava.io.*;publicclassTestDemo6_1{publicstaticvoidfilecontrl(){Filefile=newFile("F:
/");//文件类Fileif(file.isFile()){System.out.println("是一个文件!
");//判断给定的file是否为文件}if(file.isDirectory()){//判断给定的file是否是文件夹System.out.println("是一个文件夹");}if(!
file.exists()){//判断文件是否存在System.out.println("文件不存在!
");try{file.createNewFile();//创建一个新的文件file.mkdir();//创建文件夹}catch(IOExceptione){System.out.println("创建文件夹或文件失败!
");e.printStackTrace();}return;}
System.out.println("文件的绝对路径:
"+file.getAbsolutePath());//获得文件的绝对地址System.out.println("文件的父目录:
"+file.getParent());//获得当前文件的父目录System.out.println("文件的名称:
"+file.getName());//获得当前文件的文件名System.out.println("当前剩余空间:
"+file.getFreeSpace());//获得当前文件的剩余空间File[]f=file.listFiles();//定义一个文件类数组for(Filef2:
f){//将存入数组中的文件名循环取出System.out.println(f2.getName());}}publicstaticvoidmain(String[]args){TestDemo6_1.filecontrl();}}
程序运行结果如6_1_1图:
图6_1_1
任务技术要点:
Ø声明File类的常用格式:
Filefile=newFile(filepath);注:
file为变量名,filepath为要创建对象的路径。
ØFile类是文件类,它能够对文件或者文件夹进行操作。
我们在对其进行处理的时候,文件和文件夹的处理方式是不一样的,需要调用他们的不同方法。
的
6.2输入、输出处理类
6.2.1输入输出流概述
输入与输出是计算机与外部世界交流的桥梁,在java.io的库提供了许多功能强大的系统输入输出类,来实现数据的输入输出处理。
按照数据传输媒介划分,可以将输入输出类别划分为互动设备访问类、磁盘文件访问类、内存缓冲区及内存管道访问类。
按照数据传输的编码方式,可以将输入输出类别划分为文本、二进制、对象编码方式类。
按照存储顺序,可以将输入输出类别划分为顺序访问方式、随机访问方式类。
6.2.2流的概念
Java程序通过流来完成输入输出。
流是生产或消费信息的抽象。
流通过Java的输入输出系统与物理设备链接。
虽然链接的物理设备不尽相同,但所有的流具有相同的工作方式,这样,相同的输入输出类和方法适用与所有类型的外部设备,也就是,一个输入流能够抽象出多种不同类型的输入:
从互动设备(键盘、网络设备)、从磁盘文件、从内存缓冲区等。
同样一个输出流也可以输出到不同物理设备,而程序代码不需要理解各种设备的区别,而只要将其作为流来处理。
如图6_2_2所示为我们介绍了常用的几种流:
图6_2_2
从图中不难看出Java中定义了两种类型的流:
字节流和字符流。
6.2.3文件输入输出流
在所有的Java程序中,都自动导入java.lang包,该包定义了一个System类,此类封装了运行环境的许多环境控制功能,你能够获得当前时间和与系统有关的不同属性。
System同时定义了三个预定义的流对象:
in,out和err。
这些对象被定义为public和static类型,这样它们就能在不引用特定的System对象的情况下被用于程序的其他部分。
System.out是标准的输出流。
默认情况下,他是一个控制台。
System.in是标准输入,默认指键盘。
System.err是标准错误流,默认是控制台。
它们都可以被定向到兼容的输入输出设备。
System.in是InputStream对象,System.out和System.err是PrintStream对象。
6.2.4任务二:
创建TestDemo6_2_1类将给定的字符串保存到文件中并读取出来
任务目标:
✧学习掌握文件输出输入流
✧掌握如何将字符串写入到指定的文件中
✧掌握如何将文件的内容进行读取
✧理解流在文件处理中的作用
实现源代码如下:
importjava.io.*;publicclassTestDemo6_2_1{//获取文件路径
privatestaticStringpath="E:
/教材/练习.txt";
//加载file类文件对象
privatestaticFilefile=newFile(path);
//文件的写入
publicstaticvoidFileOutStreammethod(){Strings="我们在进行FileOutputStream和FileInputStream类的练习!
";try{//创建字节输出流
FileOutputStreamfops=newFileOutputStream(file);
//调用write()方法将指定字节写入此文件输出流。
fops.write(s.getBytes());System.out.println("写入文件成功!
");
//关闭字节输出流
fops.close();System.out.println("输出流关闭成功!
");}catch(FileNotFoundExceptione){System.out.println("文件未找到!
");e.printStackTrace();}catch(IOExceptione){System.out.println("写入失败!
");e.printStackTrace();}}/*
*文件的读取
*/
publicstaticvoidFileInputStreammethod(){//创建一个字节型数组
byte[]by=newbyte[1000];try{//创建字节输入流
FileInputStreamips=newFileInputStream(file);//调用read()方法 从此输入流中将最多1000个字节的数据读入一个byte数组中,number表示数据长度
intnumber=ips.read(by,0,1000);System.out.println("读取文件成功!
");//将字节型数据转换成String类型
Stringstr=newString(by,0,number);System.out.println("文件的内容:
"+str);//关闭字节输入流
ips.close();System.out.println("输入流关闭成功!
");}catch(FileNotFoundExceptione){System.out.println("文件未找到!
");e.printStackTrace();}catch(IOExceptione){System.out.println("读取文件异常!
");e.printStackTrace();}}publicstaticvoidmain(String[]args){System.out.println("写入文件:
");TestDemo6_2.FileOutStreammethod();System.out.println("");System.out.println("");System.out.println("读取文件:
");TestDemo6_2.FileInputStreammethod();}}
程序运行结果如图6_2_4_1:
图6_2_4
任务技术要点:
Ø上述任务实现的方式如图6_2_4_2:
Ø在文件写入方法中创建字节输出流时将代码修改为:
FileOutputStreamfops=newFileOutputStream(file,true);
程序运行结果就变为图6_2_4_2:
图6_2_4_3
在创建文件输出流的时候设置一个true,表明对该文件内容不进行覆盖,只是将要写入的内容添加到原文件内容,反之如果没有设置,则将文件已有内容进行覆盖。
Ø注意:
在使用完文件输入输出流后,我们要关闭流对象,如果不关闭就会耗费系统资源。
6.2.5任务三:
掌握字符输入输出流的应用
任务目标:
✧掌握字符输出输入流
✧学会利用字符输出输入流对文件进行写入和读取
程序功能:
将字符串写入到指定文件中,在从文件中读取出来
源代码如下:
importjava.io.*;publicclassTestDemo6_2_2{privatestaticStringpath="E:
/教材/练习.txt";privatestaticFilefile=newFile(path);//文件的写入
publicstaticvoidfileWriter(){try{//创建字符输出流
FileWriterfw=newFileWriter(file);Strings="我们正在进行FileWriter和FileReader类的练习!
";//调用write()方法写入字符串
fw.write(s);System.out.println("写入成功!
");fw.close();System.out.println("字符输出流关闭成功!
");}catch(FileNotFoundExceptione){System.out.println("文件未找到!
");e.printStackTrace();}catch(IOExceptione){System.out.println("写入失败!
");e.printStackTrace();}}//文件的读取
publicstaticvoidfileReader(){try{//创建字符输入流
FileReaderfr=newFileReader(file);//读取字符串
inti=fr.read();System.out.println("文件内容:
");//循环条件判断当读取不为空时,输出字符串
while((i=fr.read())!
=-1){System.out.print((char)i);}System.out.println("");System.out.println("读取成功!
");fr.close();System.out.println("字符输入流关闭成功!
");}catch(FileNotFoundExceptione){System.out.println("文件未找到!
");e.printStackTrace();}catch(IOExceptione){System.out.println("读取失败!
");e.printStackTrace();}}publicstaticvoidmain(String[]args){System.out.println("写入文件:
");TestDemo6_3.fileWriter();System.out.println("");System.out.println("");System.out.println("读取文件:
");TestDemo6_3.fileReader();}}程序运行结果如6_2_5:
图6_2_5
任务技术要点:
Ø字符流和字节流的处理单元不同,适合不同的用途,字节流常用在进行网络文件传输中,而字符流常用来写入字符。
Ø字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
在读取或者拷贝文本文件的时候字符流要比字节流的效率高。
但在拷贝其他类型文件的时候,我们还是要用字节流,用字符流拷贝过来的文件是不可用的。
6.3缓冲流
缓冲流是一种过滤流,常用的是BufferedInputStream和BufferedOutputStream,这两个类分别是InputStream和OutputStream的子类.缓冲流的机制是在能过缓冲流对象在VM开辟了一定大小的缓存区,每次传送缓存区大小的数据,而不是一个一个字节传送.
6.3.1任务四:
创建TestDemo6_4类,利用缓冲流来实现文件的写入和读取
任务目标:
✧理解缓冲流的概念。
✧通过缓冲流来提高文件的写入和读取。
源代码如下:
importjava.io.*;publicclassTestDemo6_4{privatestaticStringpath="E:
/教材/练习.txt";privatestaticFilefile=newFile(path);//文件的写入
publicstaticvoidBufferedOutStreammethod(){Strings="我们在进行BufferedOutputStream和BufferedInputStream类的练习!
";try{//创建字节输出流
OutputStreamfops=newFileOutputStream(file);//创建缓冲输出流
BufferedOutputStreambfos=newBufferedOutputStream(fops);bfos.write(s.getBytes());bfos.flush();System.out.println("写入文件成功!
");bfos.close();System.out.println("缓冲流关闭成功!
");fops.close();System.out.println("输出流关闭成功!
");}catch(FileNotFoundExceptione){System.out.println("文件未找到!
");e.printStackTrace();}catch(IOExceptione){System.out.println("写入失败!
");e.printStackTrace();}}//文件的读取publicstaticvoidBufferedInputStreammethod(){try{//创建字节输入流
InputStreamips=newFileInputStream(file);//创建缓冲输入流
BufferedInputStreambips1=newBufferedInputStream(ips);byte[]by=newbyte[1000];intline=bips1.read(by,0,1000);System.out.println("读取文件成功!
");Strings=newString(by,0,line);System.out.println("文件的内容:
"+s);bips1.close();System.out.println("缓冲流关闭成功!
");ips.close();System.out.println("输入流关闭成功!
");}catch(FileNotFoundExceptione){System.out.println("文件未找到!
");e.printStackTrace();}catch(IOExceptione){System.out.println("读取文件异常!
");e.printStackTrace();}}publicstaticvoidmain(String[]args){System.out.println("写入文件:
");TestDemo6_4.BufferedOutStreammethod();System.out.println("");System.out.println("");System.out.println("读取文件:
");TestDemo6_4.BufferedInputStreammethod();}}程序运行结果如图6_3_1:
图6_3_1
技术要点:
ØBufferedIutputStream类的构造方法有:
BufferedIutputStream(InputStreamin);
//创建一个BufferedIutputStream,但不指定缓冲区大小。
BufferedIutputStream(InputStreamin,intsize);
//创建一个指定大小的BufferedIutputStream。
BufferedIutputStream常用方法有read();read(byte[]b,intoff,intlen);close()等。
ØBufferedOutputStream类的构造方法有:
BufferedOutputStream(OutputStreamout);//创建一个新的缓冲输出流
BufferedOutputStream(OutputStreamout,intsize)//创建指定缓冲大小的缓冲输出流
ØBufferedOutputStream常用的方法有:
write(byte[],intoff,intlen);//从指定起始位置的byte数组写入缓冲的输出流。
flush();//刷新此缓冲的输出流。
6.3.2任务五:
创建TestDemo6_5类,用流来实现从网络地址中读取文件和保存文件到本地
任务目标:
✧学习和掌握流在网络中的运用
✧了解URL类的声明和使用
程序功能:
实现文件的下载
源代码如下:
importjava.io.*;import.URL;publicclassTestDemo6_5{privatestaticStrings="publicstaticvoidgetContextfromIngernet(){try{URLurl=newURL(s);//创建一个新的URL对象InputStreamips=url.openStream();//建立一个输入流,将url的内容流化Filefile=newFile("E:
/a.html");//创建一个文件对象目的地址和文件FileOutputStreamfops=newFileOutputStream(file);//创建一个文件输出流,用来将读取的内容写入目的地址文件中byte[]buffer=newbyte[1024];//创建一个缓冲区,并给定缓冲区大小intlength;while((length=ips.read(buffer))!
=-1){//读取数据fops.write(buffer,0,length);//写入数据到文件}System.out.println("保存成功,请到相应目录查找!
");fops.close();System.out.println("输出流关闭成功!
");ips.close();System.out.println("输入流关闭成功!
");}catch(Exceptionex){ex.printStackTrace();}}publicstaticvoidmain(String[]args){TestDemo6_5.getContextfromIngernet();System.out.println("操作完成!
");}}程序运行结果如图6_3_2:
图6_3_2
技术要点:
✧用输入输出流来实现文件的上传下载,主要在与理解其中文件数据类型的变换,分析清楚文件在每一个阶段的不同状态。
✧文件的操作方式在本地和网络中的运用是大同小易的,只要有一