Java程序设计基础教程(慕课版)(第2版) 课件 朱丽萍 第7-12单元 文件及流 -综合实训-简易网上银行系统_第1页
Java程序设计基础教程(慕课版)(第2版) 课件 朱丽萍 第7-12单元 文件及流 -综合实训-简易网上银行系统_第2页
Java程序设计基础教程(慕课版)(第2版) 课件 朱丽萍 第7-12单元 文件及流 -综合实训-简易网上银行系统_第3页
Java程序设计基础教程(慕课版)(第2版) 课件 朱丽萍 第7-12单元 文件及流 -综合实训-简易网上银行系统_第4页
Java程序设计基础教程(慕课版)(第2版) 课件 朱丽萍 第7-12单元 文件及流 -综合实训-简易网上银行系统_第5页
已阅读5页,还剩264页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7单元文件及流Java程序设计基础教程((慕课版)(第2版))目录导航7.1

File类7.3项目实战7.2输入输出流7.4单元小结7.1.1File类的常用方法表7-1File类的常用方法方法名称方法说明File(Fileparent,Stringchild)创建一个File对象,该对象的路径由parent的绝对路径与child字符串组成,代表一个新的目录或文件路径File(StringpathName)创建一个File对象,将pathName的指定路径转换成绝对路径File(URLurl)创建一个File对象,将URL(UniformResourceLocator,统一资源定位符)转换成绝对路径booleancanRead()判断文件是否可读booleancanWrite()判断文件是否可写booleancreateNewFile()创建一个文件或目录booleandelete()删除一个文件booleanexist()判断文件是否存在StringgetName()获取文件或目录的名字booleanisDirectory()判断当前对象是否是目录booleanisFile()判断当前对象是否是文件booleanisHidden()判断文件是否是隐藏文件longlastModified()文件最后一次修改时间longlength()返回文件的长度String[]list()返回当前对象所代表的目录下的所有文件和目录列表File[]listFiles()返回当前对象所代表的目录下的所有文件列表File[]listFiles(FileFilterfilter)返回当前对象所代表的目录下的文件列表,要求符合过滤规则booleanmkdir()创建目录booleanrenameTo(Filedest)将文件改名成dest对象所指示的名字booleansetLastModified(longtime)设置文件或目录的最后修改时间booleansetReadOnly()将文件或目录设置成可读7.1.1File类的常用方法下面通过任务7-1来了解创建与删除文件的操作。01OPTION文件的创建与删除为了获取文件的固有属性,例如文件的路径、内容长度和是否隐藏等,可在项目路径下创建一个.txt文件,名称是InherenetAttributeTest;然后在里面写一些内容,如“Thisfileisthetestforfile'sinherentattribute.”,让getlength()方法不返回0。

下面通过任务7-2了解如何获取文件的固有属性。文件的固有属性02OPTION文件的可变属性03OPTION文件的有些属性是可以被修改的,这些内容包含文件的可读性、可写性和最后修改时间等。

下面通过任务7-3来了解如何获取文件的可变属性。任务7-1文件的创建与删除文件FileCreateAndDelDemo.javaimportjava.io.File;importjava.io.IOException;publicclassFileCreateAndDelDemo{publicstaticvoidmain(String[]args){Filefile=newFile("Hello.txt");//创建一个文件类型对象Filedir=newFile("\\creatDir");System.out.println("文件是否存在:"+file.exists());System.out.println("文件夹是否存在:"+dir.exists());if(!file.exists()){try{file.createNewFile();//如果文件不存在,则创建一个新的文件}catch(IOExceptione){e.printStackTrace();}}if(!dir.exists()){dir.mkdir();//如果文件夹不存在,则创建一个文件夹}System.out.println("文件是否存在:"+file.exists());System.out.println("文件夹是否存在:"+dir.exists());System.out.println("文件的绝对路径是:"+file.getAbsolutePath());System.out.println("文件夹的绝对路径是:"+dir.getAbsolutePath());file.delete();//删除文件System.out.println("文件是否存在:"+file.exists());}}运行结果如图7-1所示。文件对象是通过newFile("文件路径")的方式创建的,但是创建之前虚拟机不知道这个文件是否存在。文件是否存在是使用File类的exists()方法来判断的。如果文件不存在,可以使用createNewFile()方法创建一个这样的文件。如果文件存在,但这个文件是一个文件夹而非一个文件,如果将此以文件类型而非文件夹类型进行处理,也会抛出文件找不到的异常。文件的删除比较简单,直接调用File对象的delete()方法就可以了。任务7-2获取文件的固有属性文件FileInherentAttributeDemo.javaimportjava.io.File;publicclassFileInherentAttributeDemo{publicstaticvoidmain(String[]args){Filefile=newFile("InherenetAttributeTest.txt");if(file.exists()){System.out.println("文件的长度:"+file.length());System.out.println("文件的绝对路径:"+file.getAbsolutePath());System.out.println("文件的相对路径:"+file.getPath());System.out.println("文件是否是隐藏文件:"+file.isHidden());System.out.println("是否是文件类型:"+file.isFile());System.out.println("是否是文件夹类型:"+file.isDirectory());}}}运行结果如图7-2所示。任务7-3获取文件的可变属性文件FileVariableAttributeDemo.javaimportjava.io.File;publicclassFileVariableAttributeDemo{publicstaticvoidmain(String[]args){Filefile=newFile("InherenetAttributeTest.txt");//创建文件对象if(file.exists()){//判断文件是否存在System.out.println("文件是否可读:"+file.canRead());System.out.println("文件是否可写:"+file.canWrite());System.out.println("文件上一次修改的时间(系统当前毫秒值):"+file.lastModified());file.setReadable(!file.canRead());//设置文件是否可读file.setWritable(!file.canWrite());//设置文件是否可写file.setLastModified(0);//设置文件的最后修改时间(毫秒值)System.out.println("文件是否可读:"+file.canRead());System.out.println("文件是否可写:"+file.canWrite());System.out.println("文件上一次修改的时间(系统当前毫秒值):"+file.lastModified());}}}运行结果如图7-3所示。Java中的文件包含文件夹,所以有时候要判断一个路径是指向一个普通文件还是一个文件夹。如果把一个文件夹当作文件去处理,会引发FileNotFoundException异常。这个异常并非是因为该文件不存在,也可能是误把文件夹当成文件处理了。7.1.2目录文件遍历下面通过任务7-4了解如何获取子文件列表和目录。01OPTION获取子文件列表和目录下面通过任务7-5了解如何获取目录下的所有文本文件并输出。获取目录下的所有文本文件并输出02OPTION删除文件夹03OPTION文件夹的删除需要使用到递归的思想,即如果是文件夹,就一直递归,直到碰到空文件夹或者只有文件的文件夹。为了便于演示,我们首先选择一个需要删除的文件夹,然后将此文件夹复制到另一个位置,再进行删除,直到剩下一个空文件夹为止。为了便于操作,笔者将C盘下C:\Windows\AppPatch文件夹复制到E盘根目录下,具体信息如图所示。目录文件也是文件夹,文件夹中会有子文件夹和子文件,子文件夹中有可能也有子文件或者子文件夹,所以对一个文件夹的遍历应当是一个递归的过程。如果只对一个文件夹下的所有文件夹和文件进行遍历则比较简单。任务7-4获取子文件列表和目录文件IteratorFilesDemo.javaimportjava.io.File;publicclassIteratorFilesDemo{publicstaticvoidmain(String[]args){Filefile=newFile("C:\\Users");//获取Users目录对象if(file.exists()){//如果文件或目录存在String[]files=file.list();//获取目录下的文件和目录的名称for(StringfileName:files){System.out.println(fileName);}System.out.println("***********************************");File[]subFiles=file.listFiles();//获取文件列表for(Filef:subFiles){if(f.isDirectory()){//如果是目录System.out.println("|—"+f.getName());}else{//如果是文件System.out.println("-"+f.getName());}}}}}运行结果如图7-4所示。如果只是单纯获取子文件的名称,使用list()方法即可。该方法可以获取子文件的名称列表,包含子文件和子文件夹,返回的是一个字符串数组,在简单遍历时比较方便。如果需要对子文件进行处理,则使用listFiles()方法更加有效。listFiles()方法还支持过滤,读者可以给定过滤规则,过滤掉不需要的文件对象。任务7-5获取目录下的所有文本文件并输出文件FilterFileDemo.javaimportjava.io.File;importjava.io.FilenameFilter;publicclassFilterFileDemo{publicstaticvoidmain(String[]args){Filefile=newFile("C:/ProgramFiles/Intel/MediaSDK");//自定义一个文件过滤器,用于筛选以.dll结尾的文件FilenameFilterfilter=newFilenameFilter(){@Overridepublicbooleanaccept(Filedir,Stringname){FilecurFile=newFile(dir,name);//只有文件真实存在且以.dll结尾才返回true,否则返回falseif(curFile.isFile()&&name.endsWith(".dll")){returntrue;}returnfalse;}};//使用自定义的过滤器过滤文件File[]files=file.listFiles(filter);for(Filef:files){//循环输出System.out.println(f.getName());}}}任务7-5获取目录下的所有文本文件并输出运行结果如图7-5所示。想要过滤不需要的文件需要自定义过滤规则,只需要自定义一个FilenameFilter对象,并实现该对象的accept()方法即可。accept()方法包含两个参数,一个是文件对象,另一个是文件对象的名称。任务对以非.dll结尾的文件进行过滤,凡是不以此结尾的文件类型全部跳过,最后返回文件列表。任务7-6删除文件夹文件DirDelDemo.javaimportjava.io.File;publicclassDirDelDemo{publicstaticvoidmain(String[]args){Filefile=newFile("E:/AppPatch");//创建file对象if(file.exists()&&file.isDirectory()){//只有文件存在并且是文件夹才进行此操作DirDelDemodel=newDirDelDemo();System.out.println("删除开始!");del.delFile(file);//递归删除System.out.println("删除结束!");}}//递归删除文件夹publicvoiddelFile(Filefile){File[]files=file.listFiles();//获取文件夹下的文件列表for(Filef:files){//遍历文件列表if(f.isDirectory()){//如果是文件夹delFile(f);//递归删除文件夹System.out.println("删除文件夹;"+f.getAbsolutePath());f.delete();}else{//否则,如果是文件,则直接删除文件System.out.println("删除文件"+f.getAbsolutePath());f.delete();}}//如果想将该文件目录也删除,则可以直接调用delete()方法//因为经过递归删除方式删除后,该文件夹已经是空的了file.delete();//删除根文件夹}}运行结果如图7-7所示。目录导航7.1

File类7.3项目实战7.2输入输出流7.4单元小结7.2.1输入输出流的概念Java在处理标准的设备文件和普通文件时并不区分类型,而是采用“数据流”的概念来实现对文件系统的操作,所以流的性质是完全类似的。流中存放的是有序的字符(字节)序列。在操作流对象时,只需要指定对应的目标对象,其数据读写操作基本一致。流式输入输出是一种很常见的输入输出方式,输入流代表从外部设备流入计算机内存的数据序列,输出流则代表从计算机内存向外部设备流出的数据序列。流中的数据因数据类型不同,可以分为两类,一类是字节流,其顶级父类是InputStream类和OutputStream类,这种流一次读写8位二进制;一类是字符流,其顶级父类是Reader类和Writer类,这种流一次读写16位二进制。对于输入输出流,每次使用之后都需要执行关闭操作,否则会造成系统资源浪费,同时可能会带来意想不到的问题。Java提供了语法糖try-catch-resource,会在使用输入输出流完毕之后自动将其关闭,不需要开发者手动处理。7.2.1输入输出流的概念try-catch-resource语法糖的使用方式如下:try(BufferedReaderbr=newBufferedReader(newFileReader(file));BufferedWriterbw=newBufferedWriter(newFileWriter(file,true))){//TODO方法处理逻辑…}catch(Exceptione){//TODO异常处理…}注意:如果一个类没有继承Closeable类,则不能使用try-catch-resource。Java中的输入输出操作类繁多,大致可以分为如下4类。①

基于字节操作的输入输出类:InputStream和OutputStream。

基于字符操作的输入输出类:Reader和Writer。

基于磁盘操作的输入输出类:File。

基于网络操作的输入输出类:Socket。7.2.2字节流流中的数据是按字节进行传输的,所有的数据流都可以使用字节流进行读写操作。InputStream类是所有字节输入流的基类,其作用是标识不同数据源产生的输入流。这些数据源包括字节数据、字符串对象、文件、管道和一些由其他流组成的序列等。OutputStream类是所有字节输出流的基类,它定义了数据输出的目的地。字节流本身是抽象类,派生出很多个子类,用于不同情况下的数据输入和输出操作,其类的继承关系如图所示。01OPTION概述7.2.2字节流表7-2InputStream类的常用方法方法名称方法说明intavailable()返回流中可供读取(或跳过)的字节数据

voidclose()关闭输入流,释放相关资源voidmark(intreadlimit)在输入流中标记当前位置booleanmarkSupported()输入流是否支持mark()和reset()方法abstractintread()从流中读取一个字节的数据intread(byte[]b)从流中读取b.length大小的数据,放进b中intread(byte[]b,intoff,intlen)读取最多len长度的数据到b中,从off指定的偏移位置开始存放voidreset()将流重置到mark()方法最后一次标记的位置voidskip(longn)跳过并抛弃n个流中的数据7.2.2字节流任务7-7文件输入输出流02OPTION字节流的应用文件StreamDemo.javaimportjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;publicclassFileStreamDemo{publicstaticvoidmain(String[]args){Filefile=newFile("FileStreamDemo.txt");//创建一个文件对象if(!file.exists()){try{file.createNewFile();//如果文件不存在,则创建文件}catch(IOExceptione){e.printStackTrace();}}/**使用语法糖,因为FileInputStream类和FileOutputStream类分别继承了*InputStream类和OutputStream类,而这两个类继承了Closeable类,*所以此处可以使用try-with-resource方式*/try(FileInputStreamfis=newFileInputStream(file);FileOutputStreamfos=newFileOutputStream(file)){//如果FileInputStream类支持标记,则在文件的开始设置标记if(fis.markSupported()){fis.mark(1000);//设置标记System.out.println("文件开始标记设置成功!");}else{System.out.println("流对象不支持标记设置!");}intdata=-1;System.out.println("文件输入流读取开始:");while(-1!=(data=fis.read())){System.out.print((char)data+"");}System.out.println("\n文件输入流读取结束!");7.2.2字节流StringwriteLine="Thisisthefirsttimetowrite!";fos.write(writeLine.getBytes());//在文件中写入一行数据fos.flush();//强制刷新缓存的数据//再次读取文件System.out.println("文件输入流读取开始:");while(-1!=(data=fis.read())){System.out.print((char)data+"");}System.out.println("\n文件输入流读取结束!");}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}运行结果如图所示。7.2.2字节流任务7-8文件的复制文件FileCopyDemo.javaimportjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;publicclassFileCopyDemo{publicstaticvoidmain(String[]args){Stringpath=FileCopyDemo.class.getResource("").toString();//获取当前类的所在路径System.out.println("class文件路径是:"+path);StringfilePath=path.substring(path.indexOf("/")+1).replace("bin","src");System.out.println("java文件路径是:"+filePath);FilecurrFile=newFile(filePath+"FileCopyDemo.java");//获取需要复制的源文件对象FiledestFile=newFile("CopyDemo.txt");//获取需要将数据复制到的目标文件对象try(FileInputStreamfis=newFileInputStream(currFile);FileOutputStreamfos=newFileOutputStream(destFile,false)){byte[]b=newbyte[2048];//需要读取的字节数组while(-1!=fis.read(b)){//如果文件中有数据,则继续读取fos.write(b);//将读取到的数据写入目标文件}fos.flush();//刷新缓存System.out.println("文件复制结束!");}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}7.2.2字节流运行结果如图7-10所示。7.2.2字节流任务7-9使用RandomAccessFile类操作文件文件RandomAccessFileDemo.javapublicclassRandomAccessFileDemo{publicstaticvoidmain(String[]args){Filefile=newFile("Test.txt");//使用Test.txt文件if(!file.exists()){//如果文件不存在//调用StreamDemo的文件处理方法,确保文件中有数据StreamDemodemo=newStreamDemo();demo.streamDemo();}//使用closeable方式创建RandomAccessFile对象try(RandomAccessFileraf=newRandomAccessFile(file,"rw")){System.out.println("文件的长度是:"+raf.length());Stringline=null;intcount=1;while(null!=(line=raf.readLine())){//如果文件中存在数据,则按行读取System.out.println("文件中的第"+(count++)+"行数据是:"+line);}System.out.println("当前文件的偏移位置是:"+raf.getFilePointer());

raf.seek(0);System.out.println("文件当前偏移位置:"+raf.getFilePointer());System.out.println("当前读取的字符是:"+(char)(raf.readByte()));raf.seek(raf.length());raf.writeBytes("\r\n");raf.writeChars("Hello!");raf.seek(0);count=1;while(null!=(line=raf.readLine())){//如果文件中存在数据,则按行读取System.out.println("文件中的第"+(count++)+"行数据是:"+line);}}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}7.2.2字节流运行结果如图7-11所示。输入输出的字节流还有缓存字节流,如ufferedInputStream类和BufferedOutputStream类等。这些流对象有缓存机制,支持mark()方法和reset()方法。对于可能需要多次读取的数据,可以将字节流转换成缓存字节流进行处理。7.2.3字符流字节流的顶级父类是Reader类和Writer类,一个用于读取,一个用于写入,其对应的输入输出字符流是InputStreamReader类和OutputStreamWriter类。为了方便读取,我们可以使用BufferedReader类和BufferedWriter类,对流进行按行读取和写入,其具体应用如任务7-10所示。任务7-10使用缓存字符流读取和写入数据文件ReaderAndWriterDemo.javapublicclassReaderAndWriterDemo{publicstaticvoidmain(String[]args){Filefile=newFile("RW.txt");if(!file.exists()){System.out.println("不存在,创建新文件!");try{file.createNewFile();//不存在就创建一个文件}catch(IOExceptione){e.printStackTrace();}}else{System.out.println("已存在,无须创建!");}try(BufferedReaderbr=newBufferedReader(newFileReader(file));BufferedWriterbw=newBufferedWriter(newFileWriter(file,true))){br.mark(10000);//在流开始读取时进行标记Stringline=null;intcount=1;System.out.println("开始数据读取:");while(null!=(line=br.readLine())){//按行读取数据System.out.println("第"+(count++)+"行数据是:"+line);}//按行写入数据(一行)System.out.println("\n开始数据插入!");bw.write("addnewline\r\n");bw.flush();//强制刷新缓存中的数据7.2.3字符流运行结果如图7-12所示。//再次读取count=1;System.out.println("\n再次读取数据:");br.reset();//跳回到标记位置while(null!=(line=br.readLine())){System.out.println("第"+(count++)+"行数据是:"+line);}}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}目录导航7.1

File类7.3项目实战7.2输入输出流7.4单元小结项目7-1实现MapReduce框架中的SplitprivateStringinputFile;privateStringoutputDir;publicInputSplit(StringinputFile,StringoutputDir){this.inputFile=inputFile;this.outputDir=outputDir;}/***生成分割后文件的文件名*/privatePathgetFilePath(intseq){returnPaths.get(outputDir,String.format("split_%d",seq));}/***方法的功能是将一个大文件按指定大小分割成若干个小文件*input:原始的大文件*outputFile:分割后的小文件*@paramblockSize分割的单位大小*/文件InputSplit.javapublicList<String>split(longblockSize){//用于存储分割后的文件名List<String>files=newArrayList<>();//分割文件的序号intseq=0;try(BufferedReaderbr=Files.newBufferedReader(Paths.get(inputFile),StandardCharsets.UTF_8)){longsize=0L;Stringline;PathfilePath=getFilePath(seq);BufferedWriterbw=Files.newBufferedWriter(filePath,StandardCharsets.UTF_8);files.add(filePath.toString());bw.write(String.valueOf(seq));bw.newLine();学习文件操作之后,就可以继续实现MapReduce框架中的Split阶段了。Split阶段的任务是接收一个输入文件,按指定的大小将文件分割成若干个小文件,具体如下。项目7-1实现MapReduce框架中的Split

while((line=br.readLine())!=null){bw.write(line);bw.newLine();//统计当前文件已经写入了多大的数据size+=line.getBytes(StandardCharsets.UTF_8).length;//达到分割的大小时,关闭当前文件,生成一个新的文件if(size>=blockSize){bw.close();bw.close();++seq;filePath=getFilePath(seq);bw=Files.newBufferedWriter(filePath,StandardCharsets.UTF_8);bw.write(String.valueOf(seq));bw.newLine();files.add(filePath.toString());size=0L;}}}catch(Exceptione){e.printStackTrace();}returnfiles;}}InputSplit类中首先定义了getFilePath()方法,根据序号生成分割文件的文件名,例如第0个分割文件的文件名为split_0。split()方法执行对inputFile的具体分割操作,首先通过BufferedReader类对inputFile按行读取,然后通过BufferedWriter类将数据写入结果文件。在写入的过程中不断统计数据的大小,如果达到一定的大小,则写入一个新的文件中。分割过程中产生的结果文件,其文件名都存储在List中并返回,用于MapReduce的Map阶段,以便从中读取相应的文件名。项目7-2文件系统下面再通过一个小项目来演示如何操作文件。项目的目标是编写一个简单的文件管理系统,通过控制台的输出内容进行文件操作:1表示创建文件,2表示删除文件,3表示复制文件,4表示根据输入文件的名称读取文件内容并执行对应的指令。当用户输入1时,会读取用户的下一行输入,根据用户的名称和后续输入创建一个文件并将输入录入文件。当用户输入2时,会检索当前目录下的文件,如果文件存在,则删除该文件;否则,提示文件不存在。当用户输入3时,读取用户输入的文件名称并进行复制,并在文件名称的末尾添加.copy作为标记。当用户输入4时,会查找当前目录下的文件。如果文件存在,则执行文件的内容。若用户输入“exit”并在系统询问时输入“Y”,则退出当前系统。具体实现如下。文件FileSystemClient.javapackagecom.lw.demo;importjava.util.Scanner;publicclassFileSystemClient{publicstaticvoidmain(String[]args){Scannerscan=newScanner(System.in);//获取控制台输入的内容//文件处理对象初始化FileOperatorfo=newFileOperator();while(true){System.out.println("1-创建文件2-删除文件3-复制文件4-执行文件

exit-退出系统:");switch(scan.nextLine()){case"1":fo.createFile(scan);break;项目7-2文件系统case"2":fo.delFile(scan);break;case"3":fo.copyFile(scan);break;case"4":fo.execFile(scan);break;case"exit":System.exit(0);break;default:System.out.println("未知指令!请输入正确的指令:");break;}}}}文件FileOperator.javapackagecom.lw.demo;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.util.Scanner;publicclassFileOperator{publicstaticfinalStringLINE_END_TAG="\r\n";publicstaticfinalStringEND_INPUT="--END";//创建文件并写入数据publicvoidcreateFile(Scannerscanner){System.out.println("请输入文件名称:");StringfileName=scanner.nextLine();//获取文件名称Filefile=newFile(fileName);//如果文件不存在,则创建文件if(!file.exists()){try{file.createNewFile();}catch(IOExceptione){e.printStackTrace();}}项目7-2文件系统System.out.println("请输入想要写入文件的内容,以--END结束输入:");//获取想要写入文件的内容Stringline=scanner.nextLine();try(BufferedWriterbw=newBufferedWriter(newFileWriter(file))){while(true){//如果不是结束输入的标记,则直接结束输入if(END_INPUT.equals(line)){return;}bw.write(line.concat(LINE_END_TAG));line=scanner.nextLine();}}catch(IOExceptione){e.printStackTrace();}System.out.println("文件创建成功!请执行后续指令!");}//删除文件publicvoiddelFile(Scannerscanner){System.out.println("请输入想要删除的文件全路径:");StringfilePath=scanner.nextLine();Filefile=newFile(filePath);if(file.exists()&&file.isFile()){//文件存在且不是目录,则删除文件file.delete();System.out.println("文件删除成功!删除文件:"+file.getAbsolutePath());}else{System.out.println("文件不存在,无法删除!请执行后续指令!");}}//复制文件publicvoidcopyFile(Scannerscanner){System.out.println("请输入想要复制的文件全路径:");StringfilePath=scanner.nextLine();Filefile=newFile(filePath);if(!file.exists()){System.out.println("文件不存在!");return;}if(!file.isFile()){System.out.println("不是文件,无法复制!");return;}//获取文件路径Stringpath=filePath.substring(0,filePath.lastIndexOf("\\")+1);System.out.println("请输入想要复制到的文件名称:");Stringname=scanner.nextLine();FilenewFile=newFile(path.concat(name));if(newFile.exists()){System.out.println("目标文件已存在,是否要覆盖(Y/N):");Stringtag=scanner.nextLine();if("N".equals(tag)){

项目7-2文件系统System.out.println("请输入想要复制到的文件名称:");name=scanner.nextLine();newFile=newFile(path.concat(name));}}//读取源文件内容并写入目标文件中try(FileInputStreamfis=newFileInputStream(file);FileOutputStreamfos=newFileOutputStream(newFile)){byte[]buf=newbyte[1024];//读取数据while(fis.read(buf)!=-1){fos.write(buf);//如果有内容,则进行文件写入}}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}System.out.println("文件复制成功!");}//读取执行文件,进行非实时文件处理publicvoidexecFile(Scannerscanner){System.out.println("请输入想要执行的执行文件:");StringfilePath=scanner.nextLine();Filefile=newFile(filePath);if(!file.exists()){System.out.println("执行文件不存在!");return;}

if(!file.isFile()){System.out.println("不是文件,无法进行执行!");return;}System.out.println("开始执行执行文件:");//执行执行文件的逻辑try(BufferedReaderbr=newBufferedReader(newFileReader(file))){Stringline=br.readLine();while(null!=line&&!"".equals(line)){String[]infos=line.split("");switch(infos[0]){case"1":createFileByBatch(infos);break;case"2":delFileByBatch(infos);break;case"3":copyFileByBatch(infos);break;default:System.out.println("指令错误!");break;}项目7-2文件系统line=br.readLine();//读取下一行}}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}System.out.println("结束执行执行文件!");}//执行文件的文件创建方法publicvoidcreateFileByBatch(String[]infos){Filefile=newFile(infos[1]);//文件不存在就创建,否则覆盖if(!file.exists()){try{file.createNewFile();}catch(IOExceptione){e.printStackTrace();}}//没有默认写入的数据if(null==infos[2]||"".equals(infos[2])){return;}//将数据写入创建的文件中try(FileOutputStreamfos=newFileOutputStream(file)){for(inti=2;i<infos.length;i++){//如果是文件结束if(END_INPUT.equals(infos[i])){System.out.println("文件创建内容插入结束!创建成功!");return;}if(!LINE_END_TAG.equals(infos[2])){fos.write(infos[2].getBytes());fos.write("".getBytes());}else{fos.write(LINE_END_TAG.getBytes());}}}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}System.out.println("创建文件:"+infos[1]+"成功!");}//执行文件的文件删除方法publicvoiddelFileByBatch(String[]infos){Filefile=newFile(infos[1]);//文件不存在就创建,否则覆盖if(!file.exists()||!file.isFile()){System.out.println("文件不存在或者不是文件,无须删除!");}else{//文件存在,则删除文件file.delete();System.out.println("文件删除成功!");}}项目7-2文件系统//执行文件的文件复制方法publicvoidcopyFileByBatch(String[]infos){Filefile=newFile(infos[1]);FilenewFile=newFile(infos[2]);if(!file.exists()||!file.isFile()){System.out.println("文件不存在或者不是文件,无法复制!");return;}//复制副本文件,不存在则创建if(!newFile.exists()){try{newFile.createNewFile();}catch(IOExceptione){e.printStackTrace();}}//读取目标数据,写入副本文件try(FileOutputStreamfos=newFileOutputStream(newFile);FileInputStreamfis=newFileInputStream(file)){byte[]b=newbyte[1024];while(fis.read(b)!=-1){fos.write(b);}System.out.println("文件"+infos[1]+"复制成功,副本文件是"+infos[2]);}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}运行结果如图7-13所示。目录导航7.1

File类7.3项目实战7.2输入输出流7.4单元小结7.4单元小结本单元着重讲解了文件和流。在Java中,文件的管理依靠File类,而文件的读写则依靠输入输出流。7.1节主要介绍了File类及其常用方法,想要更好地处理文件,File类是必须要掌握的。7.2节讲解了输入输出流的概念及其类的继承关系,同时分类介绍了字节流和字符流及其对应的缓存流。7.3节项目实战演示了File类的具体使用。

输入输出流是Java中非常重要的内容,其使用范围比较广泛。例如项目中配置文件的读取、XML文件的读取和OFFICE文件的读取等,都是使用输入输出流进行的。在Java的Web实际应用中,客户端的浏览器界面与应用服务器之间的交互同样是依靠流的形式进行的。第8单元日期和时间Java程序设计基础教程((慕课版)(第2版))目录导航8.1

Date类8.3项目实战8.2

Calendar类8.4单元小结8.1.1计算机的时间1970年1月1日是UNIX(UniplexedInformationandComputingService,分时复用信息计算服务)和C语言的生日。美国计算机科学家肯尼斯·蓝·汤普逊使用B语言在PDP(ProgrammedDataProcessor,程序数据处理机)-7机器上开发出了UNIX的一个新版本,随后又与同事丹尼斯·里奇改进了B语言,开发出了C语言并重写了UNIX。当时,计算机系统是32位系统。时间若使用32位有符号数表示,可以表示68年;若用32位无符号数表示,可以表示136年。当时人们认为可以以1970年1月1日0时0分0秒为时间原点,并在C语言的time()方法中这么应用了。因此,计算机便使用1970年1月1日0时0分0秒作为时间原点,随后的语言也沿用了这种设定。任务8-1当前时间与计算机时间原点文件ComputerTimeDemo.javapublicclassComputerTimeDemo{publicstaticvoidmain(String[]args)throwsParseException{Dateday=newDate(0);//获取时间原点longtime=System.currentTimeMillis();//获取当前时间相较于时间原点的毫秒数Datedate=newDate(time);//获取Date类型的对象,时间默认为当前时间//Date类型的toLocaleString()方法已经被废弃,不建议使用,但为了演示方便,暂且使用System.out.println("当前时间:"+date.toLocaleString());System.out.println("计算机时间原点:"+day.toLocaleString());longbetween=date.getTime()-day.getTime();System.out.println("系统当前时间与计算机时间原点的毫秒值;"+between);System.out.println("当前时间与时间原点的差值与系统获取的当前毫秒值的差值:"+(time-between));}}运行结果如图8-1所示。从运行结果不难发现,Java中的时间原点是1970年1月1日8时0分0秒(细心的读者可能会问为何不是0点,这是因为北京在东八区,所以使用北京时间时默认是8点)。Java中获取系统当前时间毫秒值的方法是Native()方法,该方法是用C语言实现的。8.1.2Date类的应用Date类的无参构造方法通过获取当前系统的毫秒值来初始化一个日期对象,同时Date类也提供了一个接受毫秒值的构造函数。无参构造方法就是将系统当前毫秒值传入该构造函数,所以在任务8-1中最后的毫秒差值是0。另外,当传入一个0作为参数的时候,返回的是计算机时间原点。SimpleDateFormat类是用于时间格式化的工具类,它可将日期格式化为字符串,同时也支持将字符串转换为日期对象的方法。任务8-2Date类的使用文件DateDemo.javapublicclassDateDemo{publicstaticvoidmain(String[]args){Datedate=newDate();//获取计算机的当前时间SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");//参数是日期的格式StringdateStr=sdf.format(date); //将时间格式化System.out.println("格式化输出时间:"+dateStr);StringdayStr="1990-01-0100:00:00"; //格式化后的日期类型的字符串try{Dateday=sdf.parse(dayStr); //将字符串转换成日期类型System.out.println("使用格式化的日期字符串创建的日期对象;"+day);}catch(ParseExceptione){e.printStackTrace();}}}运行结果如图8-2所示。Date类定义了一些简单的初始化构造方法,SimpleDateFormat类中定义了一些简单的格式化方法,但是日期的使用不仅限于初始化和格式化。目录导航8.1

Date类8.3项目实战8.2

Calendar类8.4单元小结8.2.1Calendar类简介Calendar类用于进行日期的计算操作,其本身可以由Date类来设置需要进行计算的时间原点,同时能快速地转换成Date类的对象并输出。因为编程语言中大多以0为初始值,所以Calendar类中的1月对应的数字实际上是0。由于西方国家认为星期日是一个星期的开始,所以,SUNDAY对应的数字是1,而MONDAY对应的数字是2,其他以此类推。8.2.2Calendar类的计算Calendar类能够快速进行时间的计算,如基于当前日期计算某天之前或者之后的日期,或者计算某个月的第几个星期几的日期。文件CalendarDemo.javapublicclassCalendarDemo{publicstaticvoidmain(String[]args){Datedate=newDate();//当前时间对象SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");System.out.println("当前时间是:"+sdf.format(date));//初始化一个日历对象Calendarcale=Calendar.getInstance();System.out.println("当前日历类型是:"+cale.getCalendarType());//将星期一设置为每个星期的第一天System.out.println("每个星期的第一天是:"+cale.getFirstDayOfWeek());cale.setFirstDayOfWeek(2);System.out.println("每个星期的第二天是:"+cale.getFirstDayOfWeek());cale.setTime(date);//将当前时间设置为日历类的初始计算时间任务8-3日期的计算8.2.2Calendar类的计算//当前时间5天前的时间(在当前域中加上传入的值,正数表示之前,负数表示之后)cale.add(Calendar.DAY_OF_YEAR,-5);Dateday=cale.getTime();System.out.println("5天前的时间是:"+sdf.format(day));//获取每个域的值System.out.println("当前年份是:"+cale.get(Calendar.YEAR));System.out.println("当前月份是:"+cale.get(Calendar.MONTH));System.out.println("当前日是:"+cale.get(Calendar.DATE));//获取各个域的最大值System.out.println("本月份的最大天数:"+cale.getActualMaximum(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论