案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

32
案案 6 案案案案案案案案案 案案案案案案案 案案案案案 :,一。 案案案案案案 案案案案案 案案案 [email protected]

description

案例 6 :教师输入学生成绩,并将成绩写入一个文件中。. 浙江工业大学 计算机学院 赵小敏 [email protected]. 涉及知识点. 1 、流的基本概念 2 、字节流 3 、字符流 4 、文件类 5 、随机读写文件 6 、对象序列化. 1.1 流的基本概念. 数据流 是从源到目的的字节的有序序列,先进先出。 两种基本流 :InputStream( 输入流 ) 和 OutputStream( 输出流 ). 1.2 字节流. InputStream 和 OutputStream 分别是字节输入流和字节输出流的超类 - PowerPoint PPT Presentation

Transcript of 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

Page 1: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

浙江工业大学 计算机学院赵小敏[email protected]

Page 2: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

涉及知识点 1 、流的基本概念 2 、字节流 3 、字符流 4 、文件类 5 、随机读写文件 6 、对象序列化

Page 3: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

1.1 流的基本概念

数据流是从源到目的的字节的有序序列,先进先出。 两种基本流 :InputStream( 输入流 ) 和 OutputStream( 输出流 )

Page 4: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

1.2 字节流 InputStream 和 OutputStream 分别是字节

输入流和字节输出流的超类 InputStream 和 OutputStream 提供许多用

于字节输入输出的方法,包括:1. 数据的读取2. 数据的写入3. 标记位置4. 获取数据量5. 关闭数据流

Page 5: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

字节输入流 InputStream 类的层次结构

Page 6: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

InputStream 方法 三个基本 read() 方法

int read() // 读一个字节返回int read(byte[ ] ) // 将数据读入 byte[], 返回读的字节数int read( byte[], int offset, int length )

其它方法void close( ) // 关闭流。自顶向下关闭 Filter streamint available() // 返回未读的字节数long skip(long n) // 跳过 n 个字节boolean markSupported( ) // 测试打开的流是否支持书签void mark(int) // 标记当前流,并建立 int 大小缓冲区void reset( ) // 返回标签出

Page 7: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

字节输出流 OutputStream 类层次

Page 8: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

OutputStream 方法

三个基本的 write( ) 方法void write( int ) // 写一个字节void write(byte[ ]) // 写一个字节数组void write(byte[ ], int offset, int length )

其它方法void close( )

void flush( ) // 强行写

Page 9: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

1 、创建文件输入输出流对象并打开文件(2) 创建 FileOutputStream 的对象 , 打开要写入数据的文

件FileOutputStream 的构造方法是:1. public FileOutputStream(String name) throws

FileNotFoundException2. public FileOutputStream(String name,boolean append)

throws FileNotFoundException3. public FileOutputStream(File fiel) throws

FileNotFoundException 其中: name 是要打开的文件名, file 是文件类 File

的对象。如下面语句可以创建文件的输出流对象,并打开要写入数据的文件 D:/java/temp/mytext.txt :

FileOutputStream wf=new FileOutputStream(“D:/java/temp/mytext.txt ”);

Page 10: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

2 、对文件进行读写的方法

(1) 用 read 方法读取文件的数据1. public int read( ) throws IOException // 返回

从文件中读取的一个字节。2. public int read(byte[] b) throws IOException

3. public int read(byte[] b,int off,int len) throws IOException // 返回读取的字节数 , 若 b 的长度为 0 ,返回 0 。

Page 11: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

2 、对文件进行读写的方法(2) 用 write 方法将数据写入文件1. public void write(int b) throws IOException //

向文件写入一个字节, b 是 int 类型,所以将 b的低 8 位写入

2. public void write(byte[] b) throws IOException

3. public void write(byte[] b,int off,int len) throws IOException // 将字节数组写入文件,其中 off 是 b 中的起始位置, len 是写入的最大长度。

Page 12: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

3 、字节文件流的关闭

当读写操作完毕时,要关闭输入或输出流,释放相关的系统资源。

如果发生 I/O 错误,抛出 IOException 异常。 关闭数据流的方法是: public void close( ) throws IOException

Page 13: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

数据输入输出流:DataInputStream 和DataOutputStream 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。

DataInputStream(InputStream in)

数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。

DataOutputStream (OutputStream out)

Page 14: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

1.3 字符流 类 Reader 是字符输入流的抽象超类,其提供的方

法与 InputStream 类似,只是将基于 Byte 的参数改为基于 Char 。

类 Writer 是字符输出流的抽象超类,其提供的方法与 OutputStream 类似,只是将基于 Byte 的参数改为基于 Char 。

Reader 和 Writer 类实现字节和字符间的自动转换。

每一个核心输入、输出流,都有相应的 Reader 和Writer 版本。

Page 15: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

Reader 的类层次结构

Page 16: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

Reader 的基本方法int read() ; // 读单个字符int read(char cbuf[]) ; // 读字符放入数组中int read(char cbuf[], int offset, int length) ; // 读字符放入数

组的指定位置

void close( ) // 关闭流。long skip(long n) // 跳过 n 个字符boolean markSupported( ) // 测试打开的流是否支持书签void mark(int) // 标记当前流,并建立 int 大小缓冲区void reset( ) // 返回标签出 boolean ready() // 测试当前流是否准备好进行读

Page 17: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

Writer 的类层次结构

Page 18: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

Writer 的基本方法int write(int c) ; // 写单个字符int write(char cbuf[]) ;// 写字符数组int write(char cbuf[], int offset, int length) ;

int write(String str) ;

int write(String str, int offset, int length) ;

void close( )

void flush( ) // 强行写

Page 19: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

字符文件输入输出流: FileReader 和FileWrite FileReader 和 Filewriter 类用于字符文件的输

入和输出 读写文件的过程:1. 先创建对象打开文件2. 然后用读写方法从文件中读取数据或将数据写

入文件3. 最后关闭数据流。

Page 20: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

1 、创建字符流文件对象,打开文件 创建 FileReader 或 Filewriter 对象,打开要读写

的文件 FileReader 的构造方法: public FileReader(String filename) public FileReader(File file)

FileWriter 的构造方法: public FlieWriter(String filename) public Filewriter(File file)

Page 21: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

2 、字符文件流的读写 用从超类继承的 read 和 write 方法可以对打开的文件进行

读写 读取文件数据的方法: int read( ) throws IOException int read(char b[ ]) throws IOException int read(char b[ ],int off,int len) throws IOException

数据写入到文件的方法: void write(char b) throws IOException void write(char b[ ]) throws IOException void write(char b[ ],int off,int len) throws IOException

Page 22: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

3 、字符文件流的关闭

对文件操作完毕要用 close 方法关闭数据流。 public void close( ) throws IOException

Page 23: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

字符缓冲流 : BufferedReader 和BufferedWriter BufferedReader 和 BufferedWriter 类以缓冲区

方式对数据进行输入输出。

1.BufferedReader 用于字符缓冲输入,构造方法如下:

public BufferedReader(Reader in) public BufferedReader(Reader in,int sz)

其中: in 为超类 Reader 的对象, sz 为用户设定的缓冲区大小。

Page 24: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

2. BufferedWriter 类

Bufferedwriter 用于字符缓冲流输出,构造方法为: public BufferedWriter(Writer out) public Bufferedwriter(Writer out,int sz)

其中: out 为超类 Writer 的对象, sz 为用户设定的缓冲区大小。

Page 25: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

字节流与字符流的比较

Reader 和 InputStream 以及 Writer 与 OutputStream 定义的 API 类似,但操作的数据类型不同。

所有的流—— InputStream 、 OutputStream 、 Reader 、 Writer 在创建时自动打开;程序中可以调用 close 方法关闭流,否则 Java 运行环境的垃圾收集器将隐含将流关闭。

Page 26: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

1.4 文件类

创建文件流:常用文件名或 File 类的对象创建文件流。

文件过滤:将符合条件的文件选择出来进行操作,通过接口 FileFilter 和 FilenameFilter 来实现。

Page 27: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

文件类 File 提供对文件进行创建目录、创建临时文件、改变

文件名、删除文件等操作 提供获取文件信息的方法,如文件名、文件路径

和文件长度等 File 类的构造方法:1. public File(String pathname)

2. public File(String parent,String child)

3. public File(File parent,String child)

4. public File(URI uri)

Page 28: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

File 类的方法1 、访问文件对象 public String getName( ) public String getPath( ) public String getAbsolutePath( ) public String getParent( ) public File getParentFile( )

2 、文件操作 public boolean renameTo(File  dest) public boolean delete()

Page 29: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

File 类的方法 ( 续 )3 、获得文件的属性public long length()

public boolean exists()

public long lastMoidfied()

4 、目录操作public boolean mkdir()

public String[ ] list()

public File[ ] listFiles();

Page 30: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

作业 6

管理员输入图书信息,并将图书信息写入一个文件中。

Page 31: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

补充作业2 、实现一个简单的学生管理系统,能支持学生数据 (Student) 的显

示、增加、修改和删除等操作 , 学生信息包括学号、姓名、性别、专业等。具体要求如下:

① 学生数据按对象序列化写入 student.dat 文件② 程序启动后,从 student.dat 文件读取学生对象存入 ArrayList

中;③ 增加学生数据时将学生对象 Student 存入 ArrayList ,按保存后

再写入 student.dat ;④ 删除学生必须输入学生的学号;⑤ 修改学生必须输入学号,然后输入姓名、性别和专业进行修改;⑥ 保存时将当前 ArrayList 中的所有学生对象写入 student.dat ;⑦ 退出前也要将当前 ArrayList 中的所有学生对象写入 student.dat ;⑧ 设计一个操作菜单,包括“增加”、“修改”、“删除”、“显

示”、“保存”、“退出”等 6 个选项。

Page 32: 案例 6 :教师输入学生成绩,并将成绩写入一个文件中。

Questions?