javaee论坛

普通会员

225648

帖子

324

回复

338

积分

楼主
发表于 2019-11-18 08:54:03 | 查看: 1084 | 回复: 0

publicFile(Stringpathname);以pathname为路径创建File对象,如果pathname是相对路径,则是相对于Java的系统属性user.dir中的路径。(对eclipse创建的java工程来说,就是该工程的根目录。)

publicFile(Filedir,Stringname);

根据f抽象路径名和child路径名字符串创建一个新File实例。

1.3File类文件属性1.3.1属性:publicstaticfinalStringseparator 分隔符存储了当前系统的名称分隔符,在UNIX和Mac系统上,此字段的值为‘/’;在Windows系统上,它为‘\’;为了程序的跨平台特性,文件的路径应该用这个属性值来代表。publicstaticfinalcharpathSeparator存储了当前系统默认路径分割符号,在UNIX和Mac系统上,此字段的值为’:’,Windows系统是’;’。1.4使用File类对文件进行访问方法名描述publicbooleancanRead()是否可读publicbooleancanWrite()是否可写publicbooleanexists()文件或目录是否存在,先判断publicbooleanisDirectory()是否是目录(文件夹)非目录就是文件publicbooleanisFile()是否是文件(非目录)publicbooleanisHidden()是否是隐藏文件publiclonglastModified()最后一次修改的时间,需要转换publiclonglength()返回文件大小,以字节为单位publicStringgetName()返回文件的名字(不包含路径)publicStringgetPath()返回创建File时使用指定的路径;[^提示]publicStringgetAbsolutePath()返回此File对象的绝对路径名publicFilegetAbsoluteFile()返回该文件的绝对路径的文件对象。publicStringgetParent()返回该文件所在的目录的路径。一般转化为绝对路径对象再使用publicFilegetParentFile()返回该文件所在的目录File对象。[^提示]:创建文件的时候是相对路径就返回相对路径,是绝对路径就返回绝对路径。Scannersc=newScanner(System.in);while(true){System.out.println("请输入一个路径");Stringnext=sc.next();Filefile=newFile(next);if(file.exists()){Stringname=file.getName();StringabsolutePath=file.getAbsolutePath();FileparentFile=file.getParentFile();parentFile.getParent();booleancanRead=file.canRead();booleancanWrite=file.canWrite();longlastModified=file.lastModified();Datedate=newDate(lastModified);System.out.println("文件名"+""+"文件的路径"+""+"文件目录"+""+"是否可读"+""+"最后一次修改时间");System.out.println(name+""+absolutePath+""+parentFile+""+canRead+""+date.toString());break;}else{System.out.println("你输入的文件不存在");}}1.5使用File类对文件进行操作方法名描述publicbooleancreateNewFile()当文件不存在是,则创建一个空文件(非目录)确保文件所在目录存在,否则会抛IO异常publicbooleandelete()删除文件。如果是目录必须是空目录才能删除,只删除最后一级目录publicbooleanmkdir()文件夹的创建。创建此抽象路径名指定(最后一级)的目录,确保父类目录存在publicbooleanmkdirs()创建此抽象路径名指定的目录,包括所有必需但不存在的父目录publicbooleanrenameTo(Filedest)重新命名此抽象路径名表示的文件。如果是文件路径是不一样的话,就相当于剪切的功能。如果一样的话,也可以看成是重命名1.6使用File类浏览目录中的文件和子目录方法名描述publicString[]list()返回此目录中的文件名和目录名的数组,遍历输出publicFile[]listFiles()返回此目录中的文件和目录的File实例数组,文件路径。如果不是目录就输出为空publicFile[]listFiles(FileFilterfilter)返回此目录中满足指定过滤器的文件和目录。newFileFilter匿名内部类

课堂练习:使用递归算法打印出目录(文件夹)中所有文件与目录(包括目录内部的文件和目录)。

``javaprivatestaticvoidlistChilds(Filef){if(f==null)return;System.out.println(f.getPath());if(f.isFile())return;File[]files=f.listFiles();for(Filefile:files)listChilds(file);}publicclassMain5{privatestaticFilefile=newFile(“F:\\java和HTML等”);publicstaticvoidfindFile(Filefile){if(file.isDirectory()){File[]listFiles=file.listFiles();if(listFiles==null||listFiles.length==0){return;}else{for(Filef:listFiles){System.out.println(f);if(f.isDirectory()){findFile(f);//递归}}}}}publicstaticvoidmain(String[]args){findFile(file);}}

2.IO概念和种类:2.1什么是IO流?

IO指的是Input/Output,IO流:输入输出流。统称为数据流。(IOStream)

在Java程序中,对于数据的输入/输出操作以流的方式进行;流是从起源到接收的有序数据。JDK提供了各种各样的Stream类,用以获取不同种类的数据;

IO流的作用就是对文件数据的读(输入)和写(输出)。

2.2流的作用和原理?

3.IO流的种类:3.1输入流、输出流输入流:程序可以从中读取数据的流(流入程序的流)输出流:程序能向其中写入数据的流(从程序流出的流)3.2字节流、字符流字节流:以字节为单位传输数据的流字符流:以字符为单位传输数据的流3.3节点流、处理流节点流:用于直接操作目标设备的流处理流:是对一个已存在的流的连接和封装,通过对数据的处理为程序提供更为强大、灵活的读写功能。3.4IO流的分类图:

4.字节输入流:4.1InputStream类的常用方法available()方法,获取与之关联的文件剩余可读的字节数。

intread()方法,读取输入流。读取输入流的下一个字节,返回一个0-255之间的int类型整数。如果到达流的末端,返回-1。

intread(byte[]b)方法,读取输入流。读取多个字节,存入字节数组b,返回实际读入的字节数。如果到达流的末端,返回-1。

intread(byte[]b,intoff,intlen);方法,读取输入流。每次读取len个字节,存入字节数组b,从off下标开始存储。如果到达流的末端,返回-1。

close()方法,关闭当前流,释放与该流相关的资源,防止资源泄露。在带资源的try语句中将被自动调用。关闭流之后还试图读取字节,会出现IOException异常。4.2InputStream类的子类:文件输入流FileInputStream

FileInputStream用于读取本地文件中的字节数据,继承自InputStream类

4.2.1FileInputStream构造方法和常用方法4.2.1.1构造方法FileInputStream(Filefile);通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。FileInputStream(Stringname);通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。4.2.1.2常用方法

read()方法,读取输入流。读取输入流的下一个字节,返回一个0-255之间的int类型整数。如果到达流的末端,返回-1。

is=newFileInputStream("test.txt");inti;while((i=is.read())!=-1){System.out.println("out:"+(char)i);}

read(byte[]b)方法,读取输入流。读取多个字节,存入字节数组b,返回实际读入的字节数。

InputStreamis=null;byte[]buffer=newbyte[4];//每次读取4个字节try{is=newFileInputStream("test.txt");is.read(buffer);System.out.println("available:"+is.available());//观察在读取的过程中,available值。for(byteb:buffer){System.out.println((char)b);}}...

read(byte[]b,intoff,intlen);方法,读取输入流。每次读取len个字节,存入字节数组b,从off下标开始存储。

~~~java

Filefile=newFile("helloworld.txt");try(InputStreamis=newFileInputStream(file);){byte[]b=newbyte[10];while(true){intread=is.read(b,0,10);//当每次读取的个数刚好是byte[]的长度,则可以这么简写://intread=is.read(b);if(read==-1){break;}Stringstring=newString(b,0,read);System.out.print(string);}}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}

~~~

close()方法,关闭当前流,释放与该流相关的资源,防止资源泄露。在带资源的try语句中将被自动调用。关闭流之后还试图读取字节,会出现IOException异常。

skip(longn)方法,跳过(放弃)当前流的n个字节,返回实际跳过的字节数。(了解)

5.字节输出流:5.1OutputStream类的常用方法write(intb);将指定的字节写入此输出流。write(byte[]byte);将b.length个字节从指定的byte数组写入此输出流。write(byte[]byte,intoff,intlen);将指定byte数组中从偏移量off开始的len个字节写入此输出流。flush();用于清空缓存里的数据,并通知底层去进行实际的写操作。(强制把缓存区里面的数据写入到文件)close();关闭当前流,释放与该流相关的资源。5.2OuputStream类的子类:文件输出类FileOutputStream

提供了文件的基本写入能力,继承自OuputStream类

注意:

如果进行写操作的文件不存在,则自动创建该文件。如果文件所在的路径也不存在则报错。5.2.1FileOutputStream构造方法和常用方法

课堂练习一:Stringcontent=“拉萨扩大解放了as建立地方看见拉萨的肌肤绿卡时间的分绿卡时间的分利咔”;

写一个方法,接收一个字符串。将该字符串写入到File(路径自己指定)中。返回boolean

课堂练习二:编写一个方法,接受第一个FIlefromFile,接受第二参数FiletoFile;

将fromFIle文件内容复制到toFile中。

一边读,一边写

5.2.1.1构造方法publicFileOutputStream(Stringname);通过打开一个到实际文件的连接来创建一个FileOutputStream,该文件通过文件系统中的路径名name指定。publicFileOutputStream(Stringname,booleanappend);通过打开一个到实际文件的连接来创建一个FileOutputStream,该文件通过文件系统中的路径名name指定。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。publicFileOutputStream(Filefile):通过打开一个到实际文件的连接来创建一个FileOutputStream,该文件通过文件系统中的File对象file指定。publicFileOutputStream(Filefile,booleanappend);通过打开一个到实际文件的连接来创建一个FileOutputStream,该文件通过文件系统中的File对象file指定。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。5.2.1.1常用方法

write(intb);将指定的字节写入此输出流。

try{Filefile=newFile("test.txt");OutputStreamfos=newFileOutputStream(file);byteb='a';fos.write(b);fos.flush();fos.close();}...

结果:

write(byte[]byte);将b.length个字节从指定的byte数组写入此输出流。

try{Filefile=newFile("test.txt");OutputStreamfos=newFileOutputStream(file);byteb[]="abcdefg".getBytes();fos.write(b);fos.flush();fos.close();}...

结果:

write(byte[]byte,intoff,intlen);将指定byte数组中从偏移量off开始的len个字节写入此输出流。

try{Filefile=newFile("test.txt");OutputStreamfos=newFileOutputStream(file);byteb[]="abcdefg".getBytes();fos.write(b,1,3);fos.flush();fos.close();}...

结果:

flush();用于清空缓存里的数据,并通知底层去进行实际的写操作。(强制把缓存区里面的数据写入到文件)

close();关闭当前流,释放与该流相关的资源。

6字节缓冲流

BufferedInputStream与BufferedOutputStream分别是FilterInputStream类和FilterOutputStream类的子类,实现了装饰设计模式。提高了读写性能。

6.1字节输入缓冲流BufferedInputStream

BufferedInputStream是带缓冲区的输入流,默认缓冲区大小是8Kb,能够减少访问磁盘的次数,提高文件读取性能;

使用方式:

try{Filefile=newFile("test.txt");InputStreamfos=newFileInputStream(file);BufferedInputStreambis=newBufferedInputStream(fos,2*1024);//2*1024设置需要的缓冲区大小byteb[]=newbyte[1024];while(bis.read(b)!=-1){for(bytec:b){System.out.println((char)c);}}bis.close();}6.2字节输出缓冲流BufferedOutputStream

BufferedOutputStream是带缓冲区的输出流,能够提高文件的写入效率。

使用方式:

try{Filefile=newFile("test.txt");OutputStreamfos=newFileOutputStream(file);BufferedOutputStreambos=newBufferedOutputStream(fos,2*1024);//2*1024设置需要的缓冲区大小byteb="a";bos.write(b);bos.flush();//带有缓冲区,所以必须刷新。bos.close();}...6.3字节缓冲输入流特有的方法(了解)

(了解)mark(intreadlimit)方法(只有BufferedInputStream才支持),在流的当前位置做个标记,参数readLimit指定这个标记的“有效期”,如果从标记处开始往后,已经获取或者跳过了readLimit个字节,那么这个标记失效,不允许再重新回到这个位置(通过reset方法)。也就是你想回头不能走得太远呀,浪子回头不一定是岸了,跳过(获取)了太多字节,标记就不再等你啦。多次调用这个方法,前面的标记会被覆盖。

如果我们在M处做标记,readLimit为绿色部分,当流的指针在A处的时候,这个标记依然有效,可是一旦指针跑到B处,标记就失效了。

(了解)reset()方法(只有BufferedInputStream才支持),用于重定位到最近的标记。如果在这之前mark方法从来没被调用,或者标记已经无效,会抛出IOException。如果没有抛出这个异常,将当前位置重新定位到最近的标记位置。

InputStreamis=null;try{is=newBufferedInputStream(newFileInputStream("test.txt"));is.mark(4);is.skip(2);is.reset();System.out.println((char)is.read());}finally{if(is!=null){is.close();}}}课后练习写一个方法,接收一个参数Stringtext,接受第二个参数FilesaveFile。将text字符串内容写入到saveFile中。返回booleanpublicclassSaveFile{publicstaticbooleanRead(Stringtext,FilesaveFile){if(text==null||"".equals(text)||saveFile==null){returnfalse;}byte[]bytes=text.getBytes();//Filefile=newFile("saveFile");try(FileOutputStreamfileOutputStream=newFileOutputStream(saveFile);){fileOutputStream.write(bytes,0,text.length());returnfalse;}catch(FileNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returnfalse;}publicstaticvoidmain(String[]args){booleanread=Read("abcdefg",newFile("a.txt"));System.out.println(read);}

2编写一个方法,接受第一个参数FIlefromFile,接受第二参数FiletoFile;将fromFIle文件内容复制到toFile中。

publicclassMain{publicstaticvoidcopyFile(FileformFile,FiletoFile){if(formFile.exists()){try(FileInputStreamfileInputStream=newFileInputStream(formFile);FileOutputStreamfileOutputStream=newFileOutputStream(toFile);){byte[]b=newbyte[1024];//以这个大小来读取while(true){intread=fileInputStream.read(b);//fileInputStream.read(b,0,b.length);if(read==-1){return;}fileOutputStream.write(b,0,read);//指定数组b从0开始到read的长度}}catch(FileNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}publicstaticvoidmain(String[]args){copyFile(newFile("a.txt"),newFile("c.txt"));}

3.从键盘输入一个关键字,在D:盘查找文件,如果文件名中包含该关键字,则输出这个文件的绝对路径,如果都没有找到,则输出找不到相关信息。

publicclassFind{publicstaticintfindFile(Filefile,StringkeyName){inti=0;File[]listFiles=file.listFiles();//String[]str=file.list();if(listFiles.length==0||listFiles==null){return-1;}for(Filef:listFiles){if(f.isDirectory()){try{intfindFile=findFile(f,keyName);i+=findFile;}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}if(f.getName().contains(keyName)){//System.out.println(f.getName());System.out.println(f.getAbsolutePath());}}returni;}publicstaticvoidmain(String[]args){Filefile=newFile("D:");Scannerscanner=newScanner(System.in);System.out.println("请输入关键字");StringkeyName=scanner.next();intfindFile=findFile(file,keyName);if(findFile<=0){System.out.println("找不到");}}

4.将JAVALOGO图片通过鼠标右键保存到D盘(D:\cat.jpg)中,然后使用java程序实现:

剪切该图片到E盘(E:\cat.jpg)中。

再从E盘把该图片的“一半”复制一份到D盘中。

Filefile1=newFile("Letter/1.jpg");Filefile2=newFile("Love/1.jpg");try(FileInputStreamfis=newFileInputStream(file2);FileOutputStreamfos=newFileOutputStream(file1);){byte[]b=newbyte[1024];inta=0;while(true){intread=fis.read(b);if(read==-1){return;}fos.write(b,0,read);a+=read;if(a>=file2.length()/2){//只复制一半break;}}System.out.println("复制结束");}catch(FileNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}

在D盘指定一个目录(要求目录下面有子目录和文件(图片,文档等),子目录里面也放一些目录和文件,以此类推,可以多放几层)。然后,复制该D盘该目录下所有文件(含目录)到E盘指定目录下。

即:将一个目录内的所有文件(含目录)全部复制到另一个目录下!

publicclasscopyAll{publicstaticvoidcopyDirectory(FilesrcDir,FiledestDir){File[]listFiles=srcDir.listFiles();if(listFiles==null){return;}for(Filefile:listFiles){FilesrcFile=file;FiledestFile=newFile(destDir,file.getName());//得到目标文件的路径描述if(file.isDirectory()){System.out.println("正在创建目录:"+destFile);destFile.mkdir();//在destDir创建对应的目标目录copyDirectory(srcFile,destFile);//递归,得到里面的文件}else{//复制文件System.out.println("正在copy文件:从"+srcFile+"到"+destFile);Main.copyFile(srcDir,destDir);//复制}}}publicstaticvoidmain(String[]args){FilesrcDir=newFile("");FiledestDir=newFile("");copyDirectory(srcDir,destDir);}

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017