版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十讲第十讲 Java数据流(续)数据流(续) 在上一讲中,我们主要讲了用于对字节流操在上一讲中,我们主要讲了用于对字节流操 作的有关的输入输出流。作的有关的输入输出流。 q基本数据流基本数据流:InputStream和和OutputStream 特点:抽象类,基类,不能直接与数据源和目的地建特点:抽象类,基类,不能直接与数据源和目的地建 立联系。立联系。 q文件数据流:文件数据流:FileInputStream和和FileOutputStream 特点:用于和文件建立联系,从文件中读取字节流。特点:用于和文件建立联系,从文件中读取字节流。 q缓冲区数据流缓冲区数据流:BufferedInpu
2、tStream和和 BufferedOutputStream 特点:用于在已经创建好的数据流上串接一个缓冲区,特点:用于在已经创建好的数据流上串接一个缓冲区, 提高读写速度。提高读写速度。 注意:不能直接与数据源和目的地建立联系。注意:不能直接与数据源和目的地建立联系。 q数据数据流:数据数据流: DataInputStream和和 DataOutputStream 特点:从数据流中读写特点:从数据流中读写java的基本数据类型。的基本数据类型。 注意:不能直接与数据源和目的地建立联系。注意:不能直接与数据源和目的地建立联系。 q对象数据流对象数据流:ObjectInputStream和和 O
3、bjectOutputStream 特点:用于将对象的数据成员以数据流的方式特点:用于将对象的数据成员以数据流的方式 存储。存储。 注意:对象的静态数据成员不能存储,有些非注意:对象的静态数据成员不能存储,有些非 静态的数据成员(线程,保密)需要加修饰字静态的数据成员(线程,保密)需要加修饰字 transient。不能直接与数据源和目的地建立联。不能直接与数据源和目的地建立联 系。系。 分析下列语句的对与错分析下列语句的对与错 输入:输入: FileInputStream is= new FileInputStream(“file.dat”); DataInputStream is= new
4、DataInputStream(“file.dat”); BufferedInputStream is= new BufferedInputStream(System.in); ObjectInputStream is= new ObjectInputStream(“file.dat”); 例题:请写出符合下列要求的数据流。例题:请写出符合下列要求的数据流。 将一个已经存在的文件将一个已经存在的文件f1.dat复制成另一个文复制成另一个文 件件f2.dat。 给出可用的方案:给出可用的方案: 方案方案1: 输入流:输入流: 输出流:输出流: FileInputStream is= new Fi
5、leInputStream(“f1.dat”); FileOutputStream os= new FileOutputStream(“f2.dat”); 例题:请写出符合下列要求的数据流。例题:请写出符合下列要求的数据流。 方案方案2: 输入流:输入流: 输出流:输出流: FileInputStream is= new FileInputStream(“f1.dat”); BufferedInputStream bis= new BufferedInputStream(is); FileOutputStream os= new FileOutputStream(“f2.dat”); Buff
6、eredOutputStream bos= new BufferedOutputStream(os); 刚才介绍的几种字节数据流,刚才介绍的几种字节数据流, 虽然也提供了读写字符串的方法,虽然也提供了读写字符串的方法, 但是一般不提倡用这些方法读写字但是一般不提倡用这些方法读写字 符串。符串。 为什么?为什么? 读写字符串应该用什么流?读写字符串应该用什么流? 编码的原因编码的原因 q计算机计算机最初最初的操作系统支持的编码是的操作系统支持的编码是单字节单字节 的字符编码的字符编码(ASCII),在计算机中一切处理程序在计算机中一切处理程序 最初都是以单字节编码的英文为准进行处理。最初都是以单
7、字节编码的英文为准进行处理。 q为了兼容英文字符和其它民族的文字。人们为了兼容英文字符和其它民族的文字。人们 提出了提出了UNICODE编码编码,它采用,它采用双字节编码双字节编码。 q目前目前,大多数国际性的,大多数国际性的软件内部软件内部均采用均采用 UNICODE编码编码。 q在软件运行时,它获得本地系统(或操作系在软件运行时,它获得本地系统(或操作系 统)默认支持的编码格式,然后再统)默认支持的编码格式,然后再将软件内部将软件内部 的的UNICODE编码转化为本地系统默认支持的编码转化为本地系统默认支持的 格式显示出来。格式显示出来。 读者和写者读者和写者Reader、 Writer
8、读者(读者(Reader)和写者()和写者(Writer)是)是Java提提 供的用于供的用于读写字符读写字符的输入输出流的的输入输出流的基类基类。 其他程序设计语言其他程序设计语言使用使用ASCII字符集,字符集,Java使使 用用Unicode字符集来表示字符串和字符。字符集来表示字符串和字符。 ASCII字符集是以一个字节字符集是以一个字节(8bit)来表示一个字来表示一个字 符,所以可以认为一个字符就是一个字节符,所以可以认为一个字符就是一个字节 (byte) ,一个汉字当作两个字符处理。,一个汉字当作两个字符处理。 Java使用的使用的Unicode是一种大字符集,要用两是一种大字符
9、集,要用两 个字节个字节(16bit)来表示一个字符,这时字节与字来表示一个字符,这时字节与字 符就不再一样了。符就不再一样了。 为了实现与其他程序语言及不同平台进行为了实现与其他程序语言及不同平台进行 交互,交互,Java必须提供一种必须提供一种16位的数据流处位的数据流处 理方案。这种理方案。这种16位方案被称作位方案被称作读者读者Reader 和写者和写者Writer。 在在java.io包中有许多不同类对其进行支持。包中有许多不同类对其进行支持。 其中其中最重要的方案最重要的方案是是InputStreamReader 和和OutputStreamWriter。 这两个类是这两个类是字节
10、流和字符流的接口字节流和字符流的接口。在构。在构 造一个造一个InputStreamReader或或 OutputStreamWriter时,还时,还定义定义了了16位位 Unicode和其他平台的特定表示方法之间和其他平台的特定表示方法之间 的的转换规则转换规则。 使用这种转换使用这种转换规则规则,Java能够充分利用本能够充分利用本 地平台字符集设置的地平台字符集设置的灵活性灵活性,同时又可通,同时又可通 过内部使用过内部使用Unicode保留保留平台无关性平台无关性。 由于单字节表示字符的方法使用的广泛由于单字节表示字符的方法使用的广泛 性,所以在进行性,所以在进行Java字符与其他平台
11、转换时字符与其他平台转换时 如果不进行特定声明,在如果不进行特定声明,在默认情况默认情况下,单纯下,单纯 构造一个读者或写者连接到一个数据流,则构造一个读者或写者连接到一个数据流,则 将字节码作为默认平台和将字节码作为默认平台和Unicode进行转换。进行转换。 转换规则:转换规则: 在许多英语国家中采用的在许多英语国家中采用的Latin-1编码系统。编码系统。 ISO8859-1是是Latin-1编码系统映射到编码系统映射到ASCII 的标准。的标准。 也可以利用目前已提供支持的编码形式列也可以利用目前已提供支持的编码形式列 表中的一项来指定另一种字节编码方式。表中的一项来指定另一种字节编码
12、方式。 这个编码形式列表可以在这个编码形式列表可以在native2ascii工具工具 文件中找到。文件中找到。 转换规则的应用转换规则的应用 有的时候需要从与本地字符编码方式不同有的时候需要从与本地字符编码方式不同 的数据源中读取数据。的数据源中读取数据。 例如从网络上一台不同类型的机器上读取数据,例如从网络上一台不同类型的机器上读取数据, 这时就这时就需要用明确的字符编码方式来构造需要用明确的字符编码方式来构造 InputStreamReader,否则,程序会把读到的,否则,程序会把读到的 字符当作本地表达方法来进行转换,这样可能字符当作本地表达方法来进行转换,这样可能 会引起错误。会引起错
13、误。 InputStreamReaderInputStreamReader和和OutputStreamWriterOutputStreamWriter 是是java.iojava.io包中用于处理字符流的最基本的类,包中用于处理字符流的最基本的类, 用来在字节流和字符流之间作为中介用来在字节流和字符流之间作为中介。使用这。使用这 两者进行字符处理时,两者进行字符处理时,在构造方法中应指定一在构造方法中应指定一 定的平台规范(转换规则),以便把以字节方定的平台规范(转换规则),以便把以字节方 式表示的流转换为特定平台上的字符表示。式表示的流转换为特定平台上的字符表示。 q 输入输入 /缺省规范缺
14、省规范 InputStreamReader(InputStream in); /指定规范指定规范enc InputStreamReader(InputStream in, String enc); q输出输出 /缺省规范缺省规范 OutputStreamWriter(OutputStream out); /指定规范指定规范enc OutputStreamWriter(OutputStream out, String enc); 字节流数字节流数 据源据源 字节流目字节流目 的地的地 如果读取的如果读取的字符流字符流不是来自本地时(比如不是来自本地时(比如 网上某处与本地编码方式不同的机器),那
15、么网上某处与本地编码方式不同的机器),那么 在构造在构造字符输入流字符输入流时就时就不能简单地使用缺省编不能简单地使用缺省编 码规范,码规范,而应该指定一种统一的编码规范而应该指定一种统一的编码规范 “ISO 8859_1ISO 8859_1”,这是一种映射到,这是一种映射到ASCIIASCII码的码的 编码方式,能够在不同平台之间正确转换字符。编码方式,能够在不同平台之间正确转换字符。 InputStreamReader ir = new InputStreamReader( is, “ISO8859_1” ); 举例举例: 缓冲区读者和缓冲区写者缓冲区读者和缓冲区写者 BufferedRe
16、ader、BufferedWriter 像其他像其他I/O操作一样,如果格式转换以较大数操作一样,如果格式转换以较大数 据块为单位进行,那么效率会较高,因此把据块为单位进行,那么效率会较高,因此把 BufferedReader或或BufferedWriter正确串接到正确串接到 InputStreamReader或或InputStreamWriter末末 尾是一个很好的办法。尾是一个很好的办法。 但是要但是要记住记住在在BufferedWriter中应使用中应使用flush() 方法,以强制清空缓冲区中的剩余内容,防止方法,以强制清空缓冲区中的剩余内容,防止 遗漏。遗漏。 文件读者和文件写者文
17、件读者和文件写者 FileReader、FileWriter 当确认读取、存取的文件是字符数据时,直当确认读取、存取的文件是字符数据时,直 接创建接创建FileReader或或FileWriter对象即可对象即可。 如:如: FileReader is = new FileReader(file1.txt); FileWriter os = new FileWriter(file2.txt); 程序程序 /从键盘读取字符串信息然后进行输出从键盘读取字符串信息然后进行输出 import java.io.*; public class CharInput public static void ma
18、in(String args ) throws IOException String s; InputStreamReader ir; BufferedReader in; ir = new InputStreamReader(System.in); in = new BufferedReader(ir); while (s = in.readLine() != null) System.out.println(Read: +s); 在这里,程序将标准输入流在这里,程序将标准输入流(System.in)串串 接到一个接到一个InputStreamReader上,而后又将上,而后又将 其串接到一
19、个其串接到一个BufferedReader上,把键盘上,把键盘 输入的内容经过处理显示在屏幕上。输入的内容经过处理显示在屏幕上。 不能将标准输入流不能将标准输入流(System.in)直接串接到直接串接到 一个一个BufferedReader上。上。 即:即: BufferedReader is= new BufferedReader (System.in) 是错误的。是错误的。 import java.io.*; /方法一:直接用字符流方法一:直接用字符流 class FileTOUnicode public static void main(String args) String s; t
20、ry/file1.txt中的内容为:中的内容为:123中国中国abc / file1.txt的大小是的大小是10个字节个字节 FileReader fis = new FileReader (file1.txt); BufferedReader reader = new BufferedReader(fis); FileWriter fos = new FileWriter (file2.txt); BufferedWriter writer = new BufferedWriter(fos); 程序程序: /从文件中读取字符串信息然后进行输出从文件中读取字符串信息然后进行输出 字符字符 wh
21、ile( (s = reader.readLine() != null ) byte b ; System.out.println(read: +s); b=s.getBytes(); System.out.println(read: +b.length); System.out.println(s.length(); writer.write(s); fis.close(); writer.flush(); fos.close(); catch(IOException e) System.out.println(e); /main() /class import java.io.*; /方法
22、二:将字节流转换成字符流方法二:将字节流转换成字符流 class FileTOUnicode public static void main(String args) String s; try FileInputStream fis = new FileInputStream(file1.txt); InputStreamReader dis = new InputStreamReader(fis); BufferedReader reader = new BufferedReader(dis); 程序程序: /从文件中读取字符串信息然后进行输出从文件中读取字符串信息然后进行输出 字节字节
23、while( (s = reader.readLine() != null ) System.out.println(read: +s); dis.close(); catch(IOException e) System.out.println(e); /main() /class import java.io.*; class FileTOUnicode public static void main(String args) String s1,s2; int len1,len2; byte b1=new byte100; byte b2=new byte100; try System.o
24、ut.print(请输入汉字:请输入汉字:); len1=System.in.read(b1,0,100); s1=new String(b1,0,len1,Default); System.out.println(你的输入是:你的输入是:+s1); 用字节流读取汉字串和不含汉字的字符串用字节流读取汉字串和不含汉字的字符串 System.out.print(n请输入字符:请输入字符:); len2=System.in.read(b2,0,100); s2=new String(b2,0,len2,Default); System.out.println(你的输入是:你的输入是:+s2); ca
25、tch(IOException e) System.out.println(e); /main() /class 汉字输出错误汉字输出错误 import java.io.*; class FileTOUnicode public static void main(String args) String s1,s2; try BufferedReader fis = new BufferedReader( new InputStreamReader(System.in); System.out.print(请输入汉字:请输入汉字:); s1=fis.readLine(); System.out.
26、println(你的输入是:你的输入是:+s1); 将字节流转换成字符流读取汉字串和不含汉字的字符串将字节流转换成字符流读取汉字串和不含汉字的字符串 System.out.print(n请输入字符请输入字符:); s2=fis.readLine(); System.out.println(你的输入是:你的输入是:+s2); fis.close(); catch(IOException e) System.out.println(e); /main() /class 汉字输出正确汉字输出正确 随机访问文件随机访问文件RandomAccessFile 前面讲的能够对文件读写操作的流只能完前面讲的能
27、够对文件读写操作的流只能完 成一种操作,输入流不能完成输出,输出成一种操作,输入流不能完成输出,输出 流不能完成输入。流不能完成输入。 Java语言提供了类语言提供了类RandomAccessFile来来 处理对文件的随机读写处理对文件的随机读写(字节流字节流)。 创建一个随机访问文件有以下两种方法供选择创建一个随机访问文件有以下两种方法供选择 1. 使用文件名使用文件名 myRAFile=new RandomAccessFile(String name, String mode); 2. 使用文件对象使用文件对象 myRAFile=new RandomAccessFile(File file
28、, String mode); 参数参数mode决定是以只读方式(决定是以只读方式(r)还是以)还是以 读写方式读写方式(rw)访问文件。访问文件。 如:如: File f = new File(“file.txt”); new RandomAccessFile(f, “r”); new RandomAccessFile(f, “rw”); new RandomAccessFile(“file1.txt”, “r”); new RandomAccessFile(“file2.txt”, “rw”); 对象对象RandomAccessFile可以访问类可以访问类 DataInputStream和
29、和DataOutputStream中中 的所有的所有read(),write()方法。方法。 文件位置指针:文件位置指针: 文件一旦被打开,系统自动为打开的文文件一旦被打开,系统自动为打开的文 件创建一个文件位置指针,初始状态指向文件创建一个文件位置指针,初始状态指向文 件的开始,随着读写文件的操作,文件位置件的开始,随着读写文件的操作,文件位置 指针向后移动。指针向后移动。 如:如:readInt()一次读一次读4个字节,文件位置指针个字节,文件位置指针 就相应地向后移动就相应地向后移动4个字节。个字节。 Java语言提供了移动文件读写指针的几个语言提供了移动文件读写指针的几个 方法:方法:
30、 (1) long getFilePointer() 返回文件指针的当前位置。返回文件指针的当前位置。 (2) void seek(long pos) 将文件指针置于指定的绝对位置。将文件指针置于指定的绝对位置。 位置值以从文件开始处的字节偏移量位置值以从文件开始处的字节偏移量pos来计来计 算,算,pos为为0代表文件的开始。代表文件的开始。 (3) long length() 返回文件的长度。位置值为返回文件的长度。位置值为length(),代表文,代表文 件的结尾。件的结尾。 import java.io.*; public class random_file /用用RandomAcce
31、ssFile流实现对一个文件的读写操作流实现对一个文件的读写操作 public static void main(String args) int data_arr=12,31,56,23,27,1,43,65,4,99; try RandomAccessFile randf=new RandomAccessFile(“temp.dat”, “ rw ”); for (int i=0;i=0;i-) randf.seek(i*4);/文件位置指针定位文件位置指针定位 System.out.println(randf.readInt(); randf.close(); catch (IOExce
32、ption e) System.out.println(“File access error:”+e); 4个字节个字节 4个字节个字节 4个字节个字节 运行结果运行结果 作作 业业 建立一个学生成绩的文件(在程序之外创建),建立一个学生成绩的文件(在程序之外创建), 存放存放10个学生的某门功课的成绩。数据之间以逗号个学生的某门功课的成绩。数据之间以逗号 或空格隔开。要求从文件中读取数据,求出它们的或空格隔开。要求从文件中读取数据,求出它们的 最大值、最小值和平均值。最大值、最小值和平均值。 要求要求: (1)文件的打开与保存用文件对话框实现)文件的打开与保存用文件对话框实现 (2)原始数据
33、用文本域显示)原始数据用文本域显示 (3)最大值、最小值和平均值用标签显示)最大值、最小值和平均值用标签显示 (4)最大值、最小值和平均值存放在另一个文件中。)最大值、最小值和平均值存放在另一个文件中。 文件的处理文件的处理File File类类 在对一个文件进行在对一个文件进行I/O操作之前,必须先操作之前,必须先 获得有关这个文件的基本信息,例如文获得有关这个文件的基本信息,例如文 件能不能被读取,能不能被写入,绝对件能不能被读取,能不能被写入,绝对 路径是什么,文件长度是多少,等等。路径是什么,文件长度是多少,等等。 类类java.io.File提供了获得文件基本信息提供了获得文件基本信
34、息 及操作文件的一些工具。及操作文件的一些工具。 要创建一个新要创建一个新File对象可以使用以下对象可以使用以下构造方法构造方法: (1)File myFile; myFile=new File(mymotd); (2)myFile=new File(“,mymotd); (3)File myDir=new File(“); myFile=new File(myDir,mymotd); 使用何种构造方法经常要由其他被访问的使用何种构造方法经常要由其他被访问的 文件对象来决定文件对象来决定。 例如,当在应用程序中只用到一个文件例如,当在应用程序中只用到一个文件 时,那么使用第一种构造方法最为实
35、用;时,那么使用第一种构造方法最为实用; 但如果使用了一个共同目录下的几个文但如果使用了一个共同目录下的几个文 件,则使用第二或第三种构造方法会更件,则使用第二或第三种构造方法会更 方便。方便。 创建创建File类的对象后,可以应用其中的文类的对象后,可以应用其中的文 件测定相关方法来获取文件的信息。件测定相关方法来获取文件的信息。 与文件名相关的方法与文件名相关的方法 String getName(): 获取文件名;获取文件名; String getPath(): 获取文件路径;获取文件路径; String getAbsolutePath(): 获取文件绝对路径获取文件绝对路径 String
36、 getParent(): 获取文件父目录名称;获取文件父目录名称; boolean renameTo(File newName): 更改文更改文 件名,成功则返回件名,成功则返回true,否则返回,否则返回false。 文件测定方法文件测定方法 boolean exists(): 文件对象是否存在;文件对象是否存在; boolean canWrite(): 文件对象是否可写;文件对象是否可写; boolean canRead(): 文件对象是否可读;文件对象是否可读; boolean isFile(): 文件对象是否是文件;文件对象是否是文件; boolean isDirectory():
37、文件对象是否是目录文件对象是否是目录 boolean isAbsolute(): 文件对象是否是绝对文件对象是否是绝对 路径。路径。 常用文件信息和方法常用文件信息和方法 long lastModified(): 获取文件最后修改时间获取文件最后修改时间 long length(): 获取文件长度;获取文件长度; boolean delete(): 删除文件对象指向的文件,删除文件对象指向的文件, 成功则返回成功则返回true,否则返回,否则返回false。 程序程序:获取文件的各种信息获取文件的各种信息 import java.io.*; class UseFile public stati
38、c void main(String args ) File f = new File(/export/home/d.Java); System.out.println(The file is exists?- -+f.exists(); System.out.println(The file can write? -+f.canWrite(); System.out.println(The file can read? -+f.canRead(); System.out.println(The file is a file?- +f.isFile(); System.out.println(
39、The file is a directory? -+f.isDirectory(); System.out.println(The file is absolute path?-+f.isAbsolute(); System.out.println(The files name is - +f.getName(); System.out.println(The files path is - +f.getPath(); System.out.println(The files absolute path is -+f.getAbsolutePath(); System.out.println(The f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖南湘科控股集团有限公司本部审计专干岗、企建宣传岗、财务共享中心系统管理岗招聘3人备考题库含完整答案详解【名校卷】
- 2026北京对外经济贸易大学非事业编人员招聘7人备考题库及完整答案详解【全优】
- 2026湖南永州市双牌县融媒体中心(双牌县广播电视台)招聘1人备考题库及完整答案详解【有一套】
- 国泰君安期货2026届金衍新星SSP招募备考题库及完整答案详解(名师系列)
- 2026年山西工程职业学院单招职业技能考试题库有答案详细解析
- 2026年扬州工业职业技术学院单招综合素质考试题库有答案详细解析
- 2026年黑龙江幼儿师范高等专科学校单招职业适应性测试题库附答案详细解析
- 2026年云南省昭通市高职单招职业技能考试题库含答案详细解析
- 2026年内蒙古自治区呼和浩特市高职单招综合素质考试题库有答案详细解析
- 2026年沈阳职业技术学院单招职业技能考试题库含答案详细解析
- 《汽车底盘构造与维修(第三版)》 课件 项目五 制动系构造与维修
- 2025年税务局信息技术专员招聘考试题库
- 北师大版七年级数学下册-第一章-名校检测题【含答案】
- 【《汽车排气系统三维建模及有限元仿真分析》17000字(论文)】
- 急危重症快速识别与急救护理
- 2026年新高考数学专题复习 103.马尔科夫链讲义
- 初中数学备课教案模板
- 浙江建设监理管理办法
- 运输公司废物管理办法
- 水库安全度汛培训课件
- 2025年上海高二学业水平合格性考试信息技术试卷(含答案详解)
评论
0/150
提交评论