当前位置: 首页 > 后端技术 > Java

Java笔记(7)

时间:2023-04-01 19:35:21 Java

文件类与IO流一、文件类一、文件类概述及构造方法File:是文件和目录路径名的抽象表示。文件和目录可以通过File封装成对象。对于File而言,它封装的并不是真正的文件,而只是一个路径名。它可能存在,也可能不存在。未来,这条路径的内容将通过具体的操作转化为具体的存在。方法名称描述File(Stringpathname)通过将给定的路径名??字符串转换为抽象路径名来创建一个新的File实例File(Stringparent,Stringchild)从父路径名字符串和子路径创建一个新的File(Stringparent,Stringchild)pathnamestringFileinstanceFile(Fileparent,Stringchild)createsanewFileinstancefromtheparentabstractpathnameandchildpathnamestring2.文件类创建函数方法名描述publicbooleancreateNewFile()当具有此名称的文件不存在时存在,创建一个以此抽象路径名命名的新空文件publicbooleanmkdir()创建一个以此抽象路径名命名的目录publicbooleanmkdirs()创建一个以此抽象路径名命名的目录,包括任何必需但不存在的父目录3。文件类判断获取函数方法名说明publicbooleanisDirectory()测试该抽象路径名表示的File是否为目录publicbooleanisFile()测试该抽象路径名表示的File是否为文件publicbooleanexists()测试这个抽象路径名所表示的文件是否存在publicStringgetAbsolutePath()返回这个抽象路径名的绝对路径名字符串publicStringgetPath()把这个抽象路径名转换成路径名字符串publicStringgetName()返回这个抽象路径名表示的文件或目录的名称publicString[]list()返回此抽象路径名表示的目录中文件和目录的名称字符串数组publicFile[]listFiles()返回由此抽象路径表示的目录中的文件thisabstractpathname4.文件类删除函数方法名说明publicbooleandelete()删除这个抽象路径名所代表的文件或目录绝对路径和相对路径的区别:绝对路径:完整的路径名,不需要其他任何信息是需要找到它代表的文件。例如:E:\itcast\java.txt相对路径:必须使用从其他路径名获取的信息来解释。例如:myFile\java.txt删除目录时的注意事项:●如果目录中包含内容(目录、文件),则不能直接删除。应该先删除目录中的内容,然后才能删除目录。二、递归1、递归递归概述:从程序设计的角度来看,递归是指在方法定义中调用方法本身的现象。将问题逐层转化为与原问题相似的更小规模的问题,以求解递归策略。只需要少量的程序就可以描述解题过程中所需的多次重复计算。递归解决问题,需要找到两个东西:递归退出:否则会内存溢出递归规则:与原题类似的小问题3.IO字节流1.IO流概述及分类IO流概述:IO:输入/输出(Input/Output)流:是一个抽象概念,是数据传输的总称。也就是说,设备之间的数据传输称为流,流的本质是数据传输。IO流是一种常见的应用,用来处理设备间的数据传输:文件拷贝;上传文件;文件下载。IO流分类:按数据流向输入流:读数据输出流:写数据字节流字节输入流;字节输出流字符流字符输入流;字符输出流一般来说,我们所说的IO流的分类是根据数据类型来划分的,那么这两种流在什么情况下使用呢?如果数据是用Window自带的记事本软件打开的,我们还是可以读到里面的内容的,所以就用字符流,否则就用字符流。节流。如果您不知道使用哪种类型的流,请使用字节流。2.字节流写数据字节流抽象基类InputStream:该抽象类是所有表示字节输入流的类的超类OutputStream:该抽象类是所有表示字节输出流的类的超类Subclass类名特征:子类name为其父类名的后缀作为子类名FileOutputStream:文件输出流,用于向文件写入数据FileOutputStream(Stringname):创建一个文件输出流,写入指定名称的文件使用步骤写入字节输出流中的数据:创建字节输出流对象(调用系统函数创建文件,创建字节输出流对象,字节输出流对象指向文件)调用字节输出流对象的写数据方法●释放资源(关闭文件输出流并释放与该流关联的任何系统资源)3.向字节流写入数据的三种方式方法名称说明voidwrite(intb)将指定字节写入该文件输出流,一次写入一个字节数据voidwrite(byte[]b)将指定字节数组中的b.length字节写入此文件输出流,一次写入一个字节数组数据voidwrite(byte[b,intoff,intlen)从指定字节数组中写入len个字节到此文件输出流从偏移量开始,并一次写入一个字节数组的部分数据。4、字节流写数据加异常处理finally:提供一个finally块来执行异常处理时的所有清理操作。比如IO流中释放资源的特性:finally控制的语句会被执行,除非JVM退出{executeallClearoperation:}5.字节流读取数据(一次读取一个字节数据)需求:读取文件fos.txt中的内容并在控制台输出FileInputStream:从文件系统FileInputStream中的文件获取输入字节(Stringname):通过打开一个到实际文件的连接创建一个FileInputStream,文件系统中以路径名name命名使用字节输入流读取数据的步骤:①创建字节输入流对象②调用字节输入流对象读取数据的方法③释放资源6.字节缓冲流●BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以将字节写入底层输出流,而不会导致底层系统调用每个写入的字节。BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从包含的输入流中重新填充,一次填充许多字节构造方法:字节缓冲输出流:BufferedOutputStream(OutputStreamout)BufferedInputStream(InputStreamin)的构造方法需要一个字节流而不是特定的文件或路径?字节缓冲流只是提供一个缓冲区,真正的读写数据必须基于基本的字节流对象操作四、IO字符流1、为什么会出现字符流?因为字节流操作不是特别方便,Java提供了字符流。字符流=字节流+码表是字节流复制的,如果是文本文件,文本文件也会有中文,但是没有问题,因为底层操作会自动进行字节拼接成中文。如何识别中国人?存储汉字时,无论选择哪种编码存储,第一个字符总是负数。2、编码表基础知识:计算机中存储的信息都是用二进制数来表示的;我们在屏幕上看到的英文、汉字等字符都是二进制数转换的结果。字符按照一定的规则存储在计算机中,称为编码。反之,将存储在计算机中的二进制数按照一定的规则进行解析和显示,这就是译码。这里要强调一下:是按照A码存储的,一定要按照A码解析,才能显示正确的文字符号。否则会导致乱码字符编码:是自然语言字符与二进制数(A,65)对应的一套规则字符集:是一个系统支持的所有字符的集合,包括各种国家字符和标点符号、图形符号、数字等。●计算机要准确地存储和识别各种字符集符号,就必须进行字符编码。一个字符集必须至少有一套字符编码。常见的字符集有ASCII字符集、GBXXX字符集、Unicode字符集等ASCI字符集:ASCII(AmericanStandardCodeforInformationInterchange,美国信息交换标准代码):是一种基于拉丁字母表的计算机编码系统,用于现代英语,主要包括控制字符(回车键、退格、换行等)和可显示字符(英文大小写字符、阿拉伯数字和西方符号)。基本ASCII字符集用7位来表示一个字符,一共有128个字符。ASCII扩展字符集用8位来表示一个字符,共有256个字符,便于支持常用的欧洲字符。它是系统支持的所有字符的集合,包括各国的标点符号、图形符号、数字等。GBXXX字符集:●GB2312:简体中文码表。小于127的字符含义同前。当大于127的两个字连在一起,就代表一个汉字,可以组合7000多个简体汉字。此外,数学符号、罗马希腊字母、日语字符假名等都进行了编码,将原本存在于ASCII中的数字、标点符号、字母等全部重新编码为两字节长的代码。它被称为“半角”字符。●GBK:最常用的中文码表。基于GB2312标准的扩展规范,采用双字节编码方案,共包含21003个汉字,完全兼容GB2312标准,支持繁体汉字、日韩汉字等。●GB18030:最新中文码表。它包含70,244个汉字,采用多字节编码,每个汉字可以由1、2或4个字节组成。支持中国少数民族语言,以及繁体汉字、日韩汉字等Unicode字符集:旨在表达任何语言的任何字符,是业界的一种标准,也称为Unicode和标准通用代码。使用最多4个字节的数字来表示每个字母、符号或文本。共有三种编码方案,UTF-8、UTF-16和UTF32。最常用的UTF-8编码。●UTF-8编码:可用于表示Unicode标准中的任意字符。它是电子邮件、网页和其他存储或传输文本的应用程序的首选编码。Internet工程任务组(IETF)要求所有Internet协议都必须支持UTF-8编码。它使用一到四个字节来编码每个字符。编码规则:.128个US-ASCI字符,只需要一个字节编码拉丁等字符,两个字节编码最常用的字符(包括中文),三个字节编码其他不常用的Unicode辅助字符字符,使用四字节编码总结:无论使用哪种规则进行编码,都必须使用相应的规则进行解码,否则会出现乱码。3、字符串中的编码解码问题charsetName):将String使用指定的字符集编码成一系列的字节,将结果存储在一个新的字节数组中Decode:String(byte[]bytes):通过启用平台默认的字符集Byte数组来解码指定的字符集constructanewStringString(byte[]bytes,StringcharsetName):通过指定的字符集对指定的byte数组进行解码,构造出一个新的String4。字符流中的编解码问题字符流的抽象基类:Reader:字符输入流的抽象类Writer:字符输出流的抽象类字符流中与编解码相关的两个类:InputStreamReaderOutputStreamWriter5.写入数据的五种方式in字符流方法名描述voidwrite(intc)写一个字符voidwrite(char[]cbuf)写一个字符数组voidwrite(char[]cbuf,intoff,intlen)写一个字符数组的一部分voidwrite(Stringstr)写一个字符串voidwrite(Stringstr,intoff,intlen)写一部分字符串方法名说明flush()刷新流,可以继续写数据close()关闭流,释放资源,但流将在关闭前被刷新。一旦关闭,就不能再写入数据。6、字符流读取数据的两种方式方法名说明intread()一次读取一个字符数据intread(char[]chuff)一次读取一个字符数组数据7、字符缓冲流charactersBufferedStream:BufferedWriter:将文本写入字符输出流,缓冲字符以提供单个字符、数组和字符串的高效写入,可以指定缓冲区大小,也可以接受默认大小。对于大多数用途,默认值足够大。●BufferedReader:从字符输入流中读取文本,缓冲字符以提供字符、数组和行的高效读取,可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。构造方法:BufferedWriter(Writerout)BufferedReader(Readerin)8.字符缓冲流独有函数BufferedWriter:voidnewLine0:写入一行分隔符,分隔符字符串由系统属性定义BufferedReader:publicStringreadLine():读取一行文本。结果是一个包含行内容的字符串,不包括任何行终止字符,如果已到达流的末尾,则为null。五。标准流和打印流1.标准输入输出流System类中有两个静态成员变量:publicstaticfinalInputStreamin:标准输入流。通常这个流对应于键盘输入或主机环境或用户指定的另一个输入源●publicstaticfinalPrintStreamout:标准输出流。通常流对应于显示输出或主机环境或用户指定的另一个输出目标来实现键盘输入数据:oBufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));写起来太麻烦了,Java提供了一个实现键盘输入的类:Scannersc=newScanner(System.in);输出语句的本质:是一个标准的输出流PrintStreamps=System.out;PrintStream类和System.out的方法都可以使用2.打印流打印流分类:●字节打印流:PrintStream●字符打印流:PrintWriter打印流特点:●只负责输出数据,不负责读取数据●有自己独特的字节打印流方法:●PrintStream(StringfileName):使用指定的文件名创建一个新的打印流。使用继承父类的方法写入数据,查看时会转码;使用自己独特的方式写入数据,查看到的数据将原样输出字符。打印流的结构PrintWriter方法:方法名称说明PrintWriter(StringfileName)创建一个具有指定文件名的新PrintWriter,而不自动执行刷新。PrintWriter(Writerout,booleanautoFlush)创建一个新的PrintWriter。out:字符输出流,autoFlush:一个布尔值,如果为真,printIn、printf或format方法将刷新输出缓冲区输出流一般方法:ps.write()具体方法:ps.print();附言。println()六。对象序列化流程1.对象序列化概述对象序列化:就是将对象保存到磁盘,或者在网络中传输对象。这种机制是用一个字节序列来表示一个对象,字节序列包含:字节序列将对象的类型、对象的数据、对象存储的属性等信息写入后文件,就相当于在文件中持久保存了一个对象的信息。反过来也可以从文件中读回字节序列,重构对象,反序列化实现序列化和反序列化,必须使用对象序列化流和对象反序列化流:对象序列化流:ObjectOutputStream对象反序列化流:ObjectInputStream2.ObjectserializationStream对象序列化流:ObjectOutputStream●将Java对象的原始数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重建)对象。对象的持久化存储可以通过使用流的文件来实现。如果流是网络套接字流,则可以在另一台主机或另一台进程中重构对象构造函数:将指定的对象写入ObjectOutputStream注意:要序列化的对象,该对象所属的类必须实现Serializable接口。Serializable是一个标记接口。要实现这个接口,不需要重写任何方法。3.对象反序列化流对象反序列化流:ObjectInputStreamObjectInputStream反序列化原始数据和之前使用ObjectOutputStream编写的对象构造方法:ObjectInputStream(InputStreamin):创建一个从指定InputStream中读取的ObjectlnputStream反序列化对象方法:ObjectreadObject0:从ObjectlnputStream中读取一个对象4.serialVersionUID和transient用对象序列化流序列化一个对象后,如果我们修改对象所属的class文件,读取数据会不会有问题?●会有问题,会抛出InvalidClassException。如果有问题,如何解决?●给对象所属的类添加一个serialVersionUIDprivatestaticfinallongserialVersionUID=42L;如果对象中某个成员变量的值不想被序列化,如何实现呢?为该成员变量添加transient关键字修饰,该关键字标记的成员数量将不参与序列化过程。一个独特的可以从流中保存或加载Properties作为集合的方法:方法名称描述ObjectsetProperty(Stringkey,Stringvalue)设置集合的key和value,都是String类型,底层调用Hashtable的方法putStringgetProperty(Stringkey)使用这个属性列表中指定的key来搜索属性SetstringPropertyNames()从这个属性列表中返回一个不可修改的key集合,其中的key和它们对应的值都是strings2.Properties和IO流结合的方法:方法名称描述voidload(InputStreaminStream)从输入字节流中读取属性列表(键和元素对)voidload(Readerreader)从输入字符中读取属性列表(键和元素对)streamvoidstore(OutputStreamout,Stringcomment()将这个属性列表(键和元素对)以适合与load(InputStream)方法一起使用的格式写入此属性表以写入输出字节流voidstore(Writerwriter,Stringcomments)此属性列表(键和元素pair)到此Properties表中,以适合与load(Reader)方法一起使用的格式写入输出字符流