1、Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,第 二 章,JAVA IO,File类中常用的方法,JAVA IO,File类中常用的方法,文件File类,文件,和,目录,的类,File可以对文件和目录进行,新建,、,删除,、,重命名,等,File,不能读取文件内容,JAVA IO,File类中常用的方法,绝度路径,:从磁盘根目录算起的路径名,相对路径,:相对于某一文件的路径,形象地说是把文件的绝对路径,相同的部
2、分砍掉,剩下的就是相对路径。,文件的路径,JAVA IO,File类中常用的方法,File类的常用构造方法,:,new,File(String pathname),,new File(File parent,String child),字符串作为文件路径,:文件的路径既可以是相对路径也可以是绝对路径,,相对路径通常是工程目录作为文件的相对路径,创建,File类的实例,JAVA IO,File类中常用的方法,isDirectory():,判断File对象指向的文件是否为目录,isFile():,判断File对象指向的文件是否是标准文件,length():,得到File对象指向文件的长度,以字节计
3、算,mkdirs():,如果File对象名字有多级目录,调用该方法一次性创建多级目录,delete():,调用该方法可以删除File对象所指向的文件,PrintWriter(OutputStream out,boolean autoFlush):通过现有的 OutputStream 创建新的 PrintWriter,其中autoFlush参数表示PrintWriter是否具有自动刷新。,GBK/GB2312:中文的国际编码,专门用来表示汉字,是双字节编码。,减少了读取的次数,提高了读取的效率。,RandomAccessFile类,GBK/GB2312:中文的国际编码,专门用来表示汉字,是双字节
4、编码。,JAVA IO流的分类,它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。,PrintWriter是具有自动刷新的缓冲字符输出流,InputStream是所有字节输入流的抽象基类,输出流主要以OutputStream和Writer作为基类。,字节流,当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。,Java的IO流是实现输入输出的基础,实现了数据的输入和输出操作,length():得到File对象指向文件的长度,以字节计算,FileOutputStream(File fi
5、le,boolean append):创建一个向指定File对象表示的文件中写出数据的文件输出流。,isDirectory():判断File对象指向的文件是否为目录,文件过滤器,在File类中的listFiles()方法中可以接收一个FileFilter的参数,方法格式:,f.listFiles(FileFilter filter),作用,:通过,FileFilter,参数可以列举出指定目录下符合条件的文件,JAVA IO,文件过滤器,文件过滤器,JAVA IO,文件过滤器,FileFilter接口,FileFilter接口中包含一个,accept(File file),方法,accept(F
6、ile file),方法会对指定的File中的子目录以及文件进行迭代,如果方法返回true,则list方法会列出该目录或者文件,RandomAccessFile类,JAVA IO,RandomAccessFile类,RandomAccessFile是Java的文件内容访问类,RandomAccessFile,可以读取文件内容,也可以向文件写入数据,Rand,o,mAc,ce,ssFile支持随机访问的方式,程序可以直接跳转到文件的任意地方读写数据,RandomAccessFile类,JAVA IO,RandomAccessFile类,RandomAccessFile类,RandomAccess
7、File对象包含了一个,记录指针,,用以表示当前读写处的位置,当程序新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处)。当读写了n个字节后,该文件记录指针将会向后移动n个字节。,RandomAccessFile可以自由移动该记录指针,既可以向前移动,也可以向后移动。,JAVA IO,RandomAccessFile类,RandomAccessFile包含了如下两个方法来操作文件记录指针:,long getFilePointer():返回文件记录指针的当前位置。,v,oid seek(long pos):将文件记录指针定位到pos位置。,JAVA IO
8、RandomAccessFile类,RandomAccessFile类的构造器,RandomAccessFile(File file,String mode),RandomAccessFile(String name,String mode),r,:只读方式,如执行写入方法,将抛出IOException异常。,rw,:读写方式,如该文件尚不存在,则尝试创建该文件。,rws,:读写方式,相对于”rw”模式,还要求对文件内容的每个更新都,同步写入到底层存储设备。,rwd,:读写方式,相对于”rw”模式,还要求对文件内容的每个更新都,同步写入到磁盘。,JAVA IO,RandomAccessFil
9、e类,访问模式参数值,JAVA IO,RandomAccessFile类,RandomAccessFile类提供了如下方法读写文件,(1),int read():,读取单个字节,返回所读取的字节数据。,(2),int read(byte b):,最多读取b.length个字节的数据,返回实际读取的字节数。,(3),int read(byte b,int off,int len),:读取len个字节的数据,返回实际读取的字节数。,JAVA IO,RandomAccessFile类,RandomAccessFile类提供了如下方法读写文件,(4),void write(int c),:将指定的字节
10、/字符输出到输出流中,(5),void write(byte/char buf),:将字节数组、字符数组数据输出到指定输出流中,(6),void write(byte/char bufe,int off,int len),:将字节数组/字符数组中从off位置,开始,长度为len的字节/字符输出到输出流中。,JAVA IO流的分类,JAVA IO,JAVA IO流的分类,输入,:是一个从外界进入程序的方向,通常我们需要”读取”外界的,数据时使用输入,所以输入是用来读取数据的。,输出,:是一个从程序发送到外界的方向,通常我们需要“写出”数据到,外界时使用输出,所以输出是用来写出数据的。,JAVA
11、IO,JAVA IO流的分类,Java的IO流是实现输入输出的基础,实现了数据的输入和输出操作,在Java中把不同的输入输出源抽象表达为“流“,通过流的方式允许Java程序使用相同的方式来访问不同的输入输出源。,JAVA把所有的设备里的有序数据抽象成流的模型,简化了输入输出处流,Java的IO流多个类都是从下面4个抽象基类派生的:,(1)InputStream/OutputStream:,前者是所有字节输入流的基类,后者是所有字节输,出流的基类。,(2)Reader/Writer:,前者是所有字符输入流的基类,后者是所有字符输出流的基类。,JAVA IO,JAVA IO流的分类,按照,流的流向
12、可以将流分为输入流和输出流。,(1)输入流:只能从文件中读取数据。,(2)输出流:只能向文件中写入数据。,注:,输入流主要以InputStream和Reader作为基类,,输出流主要以OutputStream和Writer作为基类。,JAVA IO,JAVA IO流的分类,输入流和输出流,JAVA IO,JAVA IO流的分类,(1)字节流:,操作的数据单元是8位的字节,,表示以字节为单位从,stream中读取或往stream中写入信息,通常用来读取,二进制数据,如图象和声音。,(2)字符流:,操作的数据单元是16位的字符,,表示以Unicode字符为,单位从,以Unicode字符为导向的,
13、stream中读取或往,stream中写入信息。,字节流和字符流,JAVA IO,JAVA IO流的分类,按照流是否直接与特定的地方(如磁盘、内存、设备等)相连分类,节点流(低级流):,可以向一个特定的IO设备(如磁盘、网络)读写数,据的流,和实际的输入/输出节点连接。,包装流(,高级流,):,则用于对一个已存在的流进行连接或封装。当使用,处理流进行输入输出时,程序并不会直接连接到实,际的数据源,没有和实际的输入输出节点连接。,节点流和包装流,JAVA IO,JAVA IO流的分类,JAVA IO,JAVA IO流的分类,字节流,JAVA IO,字节流,InputStream类,InputSt
14、ream是所有字节输入流的抽象基类,JAVA IO,字节流,int read(),:读取一个byte的数据,返回值是高位补0的int类型值。,int read(byte b),:读取b.length个字节的数据放到b数组中。返回,值是读取的字节数。,int read(byte b,int off,int len),:从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。,Inputstream中的常用方法,JAVA IO,字节流,int available(),:返回输入流中可以读取的字节数。,long skip(long n),:忽略输入流中的n个字节,返回值是实际忽略的字节
15、数,int close(),:在使用完流以后,必须对打开的流进行关闭。,Inputstream中的常用方法,JAVA IO,字节流,OutputStream类,OutputStream是所有字节输出流的父类,JAVA IO,字节流,public void write(byte b),:将参数b中的字节写到输出流,public void write(byte b,int off,int len),:将参数b的从偏移量off开,始的len个字节写到输出流。,public abstract void write(int b),:先将int转换为byte类型,把低字节,写入到输出流中。,Out,put
16、stream中的常用方法,JAVA IO,字节流,Out,putstream中的常用方法,public void flush(),:将数据缓冲区中数据全部输出,并清空缓冲区,public void close(),:关闭输出流并释放与流相关的系统资源,JAVA IO,字节流,FileInputStream类,FileInputStream是文件的字节输入流,使用该流可以以字节为单位从文件中读取数据,FileInputStream(File file):,创建一个指定的File对象表示的文件中读,取数据的文件输入流,FileInputStream(String name):,创建用于读取给定的文
17、件系统中的路,径名name所指定的文件的文件输入流。,JAVA IO,字节流,File,Out,putStream类,FileOutputStream是文件的字节输出流,我们可以以字节为单位将数据写入文件,FileOutputStream(File file):,创建一个向指定File对象表示的文件中写出数据的文件输出,FileOutputStream(String filename):,创建一个向具有指定名称的文件中写出数据的文件输出流,JAVA IO,字节流,可以向已经存在的文件中追加内容的,构造方法,FileOutputStream(File file,boolean append),:
18、创建一个向指定File对象表示的文件中写出数据的文件输出流。,FileOutputStream(String filename,boolean append),:创建一个向具有指定名称的文件中写出数据的文件输出流。,JAVA IO,JAVA IO流的分类,字节缓冲流,JAVA IO,缓冲,流,在向硬件设备做读取和写出操作时,增大读取次数或者写出次数无疑会,降低程序的效率,,因此我们可以使用,缓冲流,来一次性批量写出若干数据或者一次性批量读取若干数据来,提高程序的效率。,为什么使用缓冲流,JAVA IO,缓冲,流,BufferedInputStream类,BufferedInputStream是
19、缓冲字节输入流,内部维护着一个,缓冲区(字节数组),减少了读取的次数,提高了读取的效率。,JAVA IO,缓冲,流,Buffered,Out,putStream类,BufferedOutputStream缓冲输出流内部维护着一个,缓冲区,,每当我们向该流写数据时,都会先将数据存入缓冲区,当缓冲区已满时,缓冲流就会将数据一次性的全部写出。,JAVA IO,缓冲,流,Buffered,Out,putStream类,void flush():,清空缓冲区,将缓冲区中的内容强制写出,JAVA IO,JAVA IO流的分类,文件加密器,JAVA IO,文件加密器,案例描述,编写程序,实现简单的文件加密/
20、解密器。要求在界面中选择文件(使用JFileChooser),并指定加密算子(0255之间的整数),然后完成对任意文件的加密和解密。,对文件的加密规则,:将原文件中每个字节与加密算子做异或运算,得到的值做为加密后的文件相应字节上的值。(解密时规则一样)。,JAVA IO,文件加密器,加密过程要求采用两种不同模式实现,:,第一:覆盖原文件。(使用RandomAccessFile来完成),第二:生成新的加密文件。(使用FileInputStream和FileOutputStream来完成),这两种模式可在界面中选择。,JAVA IO,文件加密器,JAVA IO,文件加密器,JLabel,用于提示“
21、请选择加密文,件”、,“,加密因子”,JFileChooser,文件选择器,JCheckBox,是否覆盖源文件选择框,JTextField,加密因子输入框,JButton,加密/解密按钮,JButton,取消按钮,JAVA IO,文件加密器,窗体布局为,BorderLayout,分别创建两个JPanel(jp1和jp2),两个按钮组件添加在,jp2,上,jp2放在窗体布局以后的,SOUTH,方向,其余组件按照顺序依次添加在,jp1,上,然后把jp1添加在窗体布局后的,CENTER,方向,jp1,的布局是默认布局,FlowLayout,,组件添加到边界自动换行,JAVA IO,文件加密器,在事件
22、逻辑处理中需要注意:,(,1,)是否已经选中文件,如果没有选,择,则提示没选择需要加密的文,件。,(,2,)是否覆盖源文件。如果覆盖源文,件,则用RandomAccessFile来,操文件,否则生成新的文件。,JAVA IO,JAVA IO流的分类,字符流,在事件逻辑处理中需要注意:,字符流提供了两个适配器(adapter)类。,(1)int read():读取单个字节,返回所读取的字节数据。,文本文件的读写字符编码,字符串作为文件路径:文件的路径既可以是相对路径也可以是绝对路径,,public void flush():将数据缓冲区中数据全部输出,并清空缓冲区,文本文件的读写,JAVA IO
23、流的分类,JAVA IO流的分类,BufferedReader(Reader in):将指定的字符流包装成BufferedReader。,文本域用组件JTextArea组件,JTextField 加密因子输入框,符,不过utf编码是不定长编码,每一个字符的长度从1-6个字节不等。,JAVA IO,字符流,Reader和Writer是所有字符输入流、字符输出流的抽象基类,可以解决国际化问题。原先的I/O类库只支持8位的字节流,不能很好地处理16位的Unicode字符流。,字符流提供了两个适配器(adapter)类。InputStreamReader负责将InputStream转化成Reader,
24、而OutputStreamWriter则将OutputStream转化成Writer。,JAVA IO,字符流,Reader类,Reader是所有字符输入流的抽象基类,JAVA IO,字符流,public int read(),:,从输入流中读取单个字符,返回所读取的字符数据,public int read(char buf),:,从输入流中最多读取buf.length个字符的数,据,并将其存储在字符数组buf中,返回实际读取的字符数。,public read(char buf,int off,int len),:,从输入流中读取len个字符的数据,并,将其存储在字符数组buf中,放入数组bu
25、f中时,并不是从数,组起点开始,而是从off位置开始,返回实际读取的字符数。,Reader中常用的方法,JAVA IO,字符流,Writer类,Writer类是所有字符输出流的抽象基类,JAVA IO,字符流,public void write(char b),:将参数b中的字符写到输出流,public void write(char b,int off,int len),:将参数b的从偏移量off,开始的len个字符写到输出流。,public abstract void write(int b),:把低,16,位写入到输出流中。,Writer类,中常用的方法,JAVA IO,字符流,publ
26、ic void write(String str),:将str字符串里包含的字符输出到指定,输出流中。,public void write(String str,int off,int len),:将str字符串里从off位,置开始,长度为len的字符输出到指定输出流中。,public void flush(),:将数据缓冲区中数据全部输出,并清空缓冲区。,public void close(),:关闭输出流并释放与流相关的系统资源。,Writer类,中常用的方法,JAVA IO,字符流,InputStreamReader类,InputStreamReader是字符流(处理流),可以将字节流转
27、换为字符流,InputStreamReader是将字节输入流转换为字符输入流的桥梁,它使用指定的字符集读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。,JAVA IO,字符流,InputStreamReader(InputStream in),:,创建一个使用默认字符集的 InputStreamReader,构造方法中传入的参数是要转换的字节流。,InputStreamReader(InputStream in,String charsetName),:,创建使用指定字符集的 InputStreamReader,构造方法中传入的第一个参数是要转换
28、的字节流,第二个参数是指定的字符集比如:“utf-8“,。,InputStreamReader类的构造方法,JAVA IO,字符流,OutputStreamWriter类,OutputStreamWriter是Writer的实现类,使用该流可以设置字符集,并按照指定的字符集将字符转换为对应的字节后通过该流写出。,JAVA IO,字符流,OutputStreamWriter类,的构造方法,OutputStreamWriter(OutputStream out,string charSetName):,基于给定的字节输出流和字符编码创建OutputStreamWriter,OutputStream
29、Writer(OutputStream out),:,按照给定的字节输出流和系统默认的字符集创建OutputStreamWriter。,JAVA IO,字符流,JAVA IO,JAVA IO流的分类,字符流的缓冲流,JAVA IO,字符流,BufferedReader类,BufferedReader是缓冲字符输入流,其内部提供了缓冲区,可以提高读取效率。,BufferedReader拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取。,J
30、AVA IO,字符流,BufferedReader(Reader in):,将指定的字符流包装成BufferedReader。,BufferedReader(Reader in,int size):,按照指定的字符输入流和指定的缓冲区大小创建BufferedReader。,BufferedReader,类,的构造方法,JAVA IO,字符流,BufferedReader类,String readLine(),:该方法连续读取一行字符串,直到读取到换行符为止,,返回的字符串中不包含该换行符。,JAVA IO,字符流,BufferedWriter类,BufferedWriter类是拥有8192字符
31、的缓冲区,当使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。,JAVA IO,字符流,BufferedWriter类,的构造方法,BufferedWriter,(,Writer,out,):,将指定的字符流包装成,BufferedWriter,。,BufferedWriter,(,Writer,out,int size):,按照指定的字符输出流和指定的缓冲区大小创建,BufferedWriter,。,JAVA IO,字符流,PrintWriter类,PrintWriter是具有自动刷新的缓冲字符输出流,
32、PrintWriter(File file),:,使用指定文件创建不具有自动行刷新的新 PrintWriter,PrintWriter(OutputStream out),:,根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。,PrintWriter(OutputStream out,boolean autoFlush),:,通过现有的 OutputStream 创建新的 PrintWriter,其中autoFlush参数表示PrintWriter是否具有自动刷新。,JAVA IO,字符流,PrintWriter(String fileName):,创建具有
33、指定文件名称且不带自动行刷新的新 PrintWriter。,PrintWriter(Writer out):,创建不带自动行刷新的新 PrintWriter。,PrintWriter(Writer out,boolean autoFlush),:创建新 PrintWriter,其中autoFlush参数表示PrintWriter是否具有自动刷新。,JAVA IO,字符流,JAVA IO,JAVA IO流的分类,文本文件的读写,字符编码,JAVA IO,文本文件的读写,java.io包中提供了Reader和Writer可以对文本文件进行操作,例如可以对文本文件整行读取和写入,但在操作文本文件时候
34、要注意字符编码,否则有可能会造成乱码问题。,GBK/GB2312:中文的国际编码,专门用来表示汉字,是双字节编码。,PrintWriter是具有自动刷新的缓冲字符输出流,外界时使用输出,所以输出是用来写出数据的。,isDirectory():判断File对象指向的文件是否为目录,FileInputStream类,RandomAccessFile类,Java的IO流是实现输入输出的基础,实现了数据的输入和输出操作,缓冲流,如果缓冲区中的数据满了,才会一次对目的地进行写出。,(2)输出流:只能向文件中写入数据。,Reader是所有字符输入流的抽象基类,当读写了n个字节后,该文件记录指针将会向后移动
35、n个字节。,文本文件的读写,FileOutputStream类,BufferedWriter类的构造方法,JAVA IO流的分类,输入:是一个从外界进入程序的方向,通常我们需要”读取”外界的,JAVA IO,文本文件的读写,在计算机世界里,任何文字都是以指定的编码方式存在的,在JAVA程序的开发中最常见的是一下几种编码:ISO8859-1、GBK/GB2312、unicode、UTF等。,JAVA IO,文本文件的读写,Iso,8859-1编码:,属于单字节编码,最多只能表示0-255的字符范围,主要,在英文上应用。,GBK/GB2312:,中文的国际编码,专门用来表示汉字,是双字节编码。,u
36、nicode,:java中使用此编码方式,也是标准的一种编码,是使用16进制表,示的编码,但此编码不兼容iso8859-1编码。,UTF,:utf编码兼容了iso8859-1编码,同时也可以用来表示所有的语言字,符,不过utf编码是不定长编码,每一个字符的长度从1-6个字节不等。,JAVA IO,字符流,JAVA IO,JAVA IO流的分类,简易记事本,JAVA IO,简易记事本,案例描述,一个简单的记事本,要求如下功能,:,第一:可以编辑内容,并且保存数据到指定的位置;,第二:可以打开指定位置的文本文件,第三:并且要完成对字体颜色的设置等。,JAVA IO,简易记事本,JAVA IO,简易记事本,案例分析,第一:分析其布局可以把窗体分为两部分,,菜单栏,和,文本域,。,其中,菜单栏,添加File、Edit、View等菜单,文本域,用组件JTextArea组件,窗体布局设置为,BorderLayout,,菜单栏添加在窗体布局后的,NORTH,,文本域添加在窗体布局后的,CENTER,。,JAVA IO,简易记事本,第二:布局完成以后完成菜单,栏中的每个菜单事件的添加。,Thanks!,关注,达内科技,官方微信 获取最新资讯,






