《输入输出和反射》教案.docx
《《输入输出和反射》教案.docx》由会员分享,可在线阅读,更多相关《《输入输出和反射》教案.docx(24页珍藏版)》请在冰豆网上搜索。
《输入输出和反射》教案
《输入输出和反射》教案
第三章本章题目
1.回顾上一章:
[10分钟]………………………………………………………………………..…..…….…340
2.课程知识点讲解………………………………………………………………………………..……………340
2.1.具体知识点1:
[XX分钟]……………………………………………………………………………….340
2.2.具体知识点2.:
[XX分钟]………………………………………………………………………………340
2.3.具体知识点3:
[XX分钟]………………………………………………………………………………..341
3.本章总结[10分钟]…………………………………………………………………….……………………341
4.考核点………………………………………………………………………………………………………..341
5.扩展部分………………………………………………………………………………….…………………..341
6.学员问题汇总…………………………………………………………………………….……………..........341
7.作业………………………………………………………………………………………….………………..341
授课教师:
XXX
课时:
2小时
本章主要目的
XXX
本章重点
XXX
本章难点
XXX
1、预习检查:
[X分钟]
什么是流?
简述使用字节流读文本文件的步骤
使用什么流读写字符内容更高效?
2、课程知识讲解:
2.1具体知识点1:
File类[30分钟]
什么是文件?
文件可认为是相关记录或放在一起的数据的集合
文件一般存储在哪里?
磁盘,硬盘软盘U盘等
JAVA程序如何访问文件属性?
JAVAAPI:
java.io.File类操作文件或目录的属性
老师提问
问题:
File类是如何操作文件或目录的属性?
File类访问文件属性
a.通过File类,创建File对象Filefile=newFile(Stringpathname);pathname文件在磁盘中的目录
b.通过文件对象的方法操作文件或目录属性
注意:
文件路径中的分隔符可以是正斜杠/也可以是反斜杠\,但是反斜杠必须是\\
File.separator与系统有关的默认名称分隔符。
此字段被初始化为包含系统属性file.separator值的第一个字符。
在UNIX系统上,此字段的值为'/';在MicrosoftWindows系统上,它为'\'。
File类的常用方法:
(参考API)
通过案例讲解集中常用的方法
//booleandelete()删除此对象指定的文件或目录
//booleancreateNewFile()创建名称的空文件不创建文件夹,如果已经存在就不能建
//获取文件的名字
System.out.println("文件的名字:
"+file.getName());
System.out.println("文件的相对路径:
"+file1.getPath());
//获取绝对路径
System.out.println("绝对路径:
"+file.getAbsolutePath());
//获得文件最后修改的时间
Calendarc=Calendar.getInstance();
c.setTimeInMillis(file.lastModified());
Datedate=c.getTime();
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
System.out.println("文件最后修改的时间:
"+sdf.format(date));
//获得文件的大小
System.out.println("文件的大小:
"+file.length()+"Kb");
老师提问
问题:
如何读写文件?
分析:
java中的File类只能操作文件或目录的属性,不能操作文件里面的数据。
读文件:
是指把文件中的数据读取到内存中。
写文件:
就是把内存中的数据写入到文件中。
在java中是通过流来读写文件的。
2.2具体知识点2:
流[XX分钟]
知识点讲解1:
流的定义
通过流来读写文件
流是指一连串流动的字符,是以先进先出方式发送信息的通道
用生活中的例子(比如水管流水)
知识点讲解2:
流的分类
流分为输入流和输出流。
输入输出是相对计算机内存说的,如果数据是输入到内存,则称为输入流,如果是从内存中输出,则称为输出流。
数据源与流的关系:
数据源分为源数据源和目标数据源输入流联系的是源数据源,输出流联系的是目标数据源。
详见PPT12PPT13
知识点讲解:
文件的读写
文本文件的读写
用FileInputStream和FileOutputStream读写文本文件
用BufferedReader和BufferedWriter读写文本文件
二进制文件的读写
使用DataInputStream和DataOutputStream读写二进制文件(和文本文件的读写类似不详细的讲解)
使用FileInputStream读文本文件的步骤是什么?
(对照API讲解FileInputStream的方法)
FileInputStream就是将文件中的数据输入到内存中,它是InputStream抽象类的子类,用来读取文件中的数据。
1引入相关的类(相关的jar包)
②构造文件输入创建流FileInputStream对象
FileInputStreamfis=newFileInputStream("text.txt");
③读取文本文件的数据
fis.available();//获得文件的字节数
fis.read();
④关闭文件流对象fis.close();
案例讲解:
publicstaticvoidmain(String[]args)throwsException{
Filefile=newFile("D:
\\test.txt");
FileInputStreamfis=newFileInputStream(file);//2步
System.out.println("可读取的字节数:
"+fis.available());
System.out.println("文件内容是:
");
intdate;
while((date=fis.read())!
=-1){//3步
//强制类型转换如果不强转那么就是对呀的ASCII码
System.out.println((char)date+"");
}
fis.close();
}
或者
publicstaticvoidmain(String[]args)throwsException{
Filefile=newFile("D:
\\test.txt");
FileInputStreamfis=newFileInputStream(file);//2
System.out.println("可读取的字节数:
"+fis.available());
System.out.println("文件内容是:
");
byte[]buffer=newbyte[fis.available()];//创建合适文件大小的数组
fis.read(buffer);//读取文件中的内容到b[]数组
fis.close();
//String构造通过使用指定的charset解码指定的byte数组,构造一个新的String。
System.out.println(newString(buffer));
}
使用FileOutputStream写文本文件的步骤是什么?
与读文件的步骤有何不同?
FileOutputStream就是将内存中的数据输出到文件中,它是FileOutputStream抽象类的子类,把内存的数据写入到文本文件中。
2引入相关的类(相关的jar包)
②构造文件输出创建流FileInputStream对象
FileOutputStreamfos=newFileOutputStream(“text.txt");
③把数据写入文本文件
Stringstr="好好学习Java";
byte[]words=str.getBytes();
fos.write(words,0,words.length);
④关闭文件流对象fos.close();
案例:
publicstaticvoidmain(String[]args)throwsException{
//创建输出流对象
FileOutputStreamfos=newFileOutputStream("d:
\\123.txt",true);
//把数据写入文本文件
Stringstr="asdasdasfewfwe";
byte[]b=str.getBytes();
fos.write(b);
fos.flush();//刷新
fos.close();//关闭流
System.out.println("数据写入完成!
!
!
");
}
注意:
FileOutputStream(Filefile)和FileOutputStream(Stringname)两种构造方法在向文件写数据时将覆盖文件中原有的内容,如果是不覆盖原来的内容,直接写在原来的文件内容的后面就需要用到第三种方法FileOutputStream(Stringname,booleanappend)true表示不覆盖
创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件
案例:
复制一个文件的内容到另外一个文件
publicstaticvoidmain(String[]args)throwsException{
//创建输入流对象对文件进行读取
FileInputStreamfis=newFileInputStream("D:
\\student.txt");
//创建输出流对象,将读取到的文件写入到另外的文件中
FileOutputStreamfos=newFileOutputStream("E:
\\studentcopy.txt");
//创建中转的数组,将读取的信息存到数组中
byte[]buffer=newbyte[1024];
//循环读取数据,并写入到文件中
//read()下一个数据字节;如果已到达文件末尾,则返回-1。
System.out.println("开始赋值.......");
while(fis.read()!
=-1){
fis.read(buffer);
fos.write(buffer);
fos.flush();
}
fos.close();
fis.close();
System.out.println("复制结束.......");
}
用字符流类BufferedReader和Reader读文本文件(结合API帮助文档讲解)
BufferedReader和Reader都是Reader抽象类的子类,他们可以通过字符流的方式读取文件,并且使用缓冲区(它可以先把一批数据读到缓冲区,接下来的读操作都是从缓冲区内获取数据,避免每次都从数据源读取数据进行字符编码转换,从而提高读取操作的效率),提高了文件读取的效率。
按行读取内容的readLine()方法一行一行的读取。
步骤和FileInputStream类似
Readerin=null;
BufferedReaderbf=null;
try{
in=newFileReader("D:
\\test.txt");
bf=newBufferedReader(in);
//读取有一行数据
Stringline=bf.readLine();
while(line!
=null){
System.out.println(line);
line=bf.readLine();
}
}catch(Exceptione){
e.printStackTrace();
}finally{//关闭流
try{
if(bf!
=null){
bf.close();
}
if(in!
=null){
in.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
用字符流类BufferedWriter和Writer写文本文件(结合API帮助文档讲解)
将内存中的数据写入到文本文件中。
BufferedWriter带有缓冲区。
BufferedWriter类的缓冲区(BufferedWriter与BufferedReader的流方向正好相反,BufferedWriter是把一批数据写到缓冲区,当缓冲区满的时候,再把缓冲区的数据写到字符输出流中。
这可以避免每次都执行物理写操作,从而提高io操作的效率。
bw.newLine();//写入一个行分隔符。
换行
bw.write(str);//写数据
案例:
publicstaticvoidmain(String[]args){
//创建writer对象
Writerwriter=null;
//创建BufferWriter对象
BufferedWriterbw=null;
Stringstr="好好学习,天天向上!
!
!
!
!
";
try{
writer=newFileWriter("D:
\\234.txt",true);
bw=newBufferedWriter(writer);
bw.newLine();//写入一个行分隔符。
bw.write(str);
bw.flush();//刷新缓冲区
}catch(IOExceptione){//关闭流
e.printStackTrace();
}finally{
try{
if(writer!
=null){//判断流是否是空
writer.close();
}
if(bw!
=null){
bw.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
System.out.println("数据写入完成!
!
!
");
}
老师提问:
问题1:
读取包含中文的文本文件时,可能出现中文乱码,怎么办?
分析:
java为我们提供了一个类:
InputStreamReader,继承Reader类,使用InputStreamReader并设置编码格式(演示乱码出现的过程和解决方案)
publicstaticvoidmain(String[]args)throwsException{
Filefile=newFile("D:
\\1234.txt");
FileInputStreamfis=newFileInputStream(file);
////使用InputStreamReader并设置编码格式
InputStreamReaderisr=newInputStreamReader(fis);
BufferedReaderbr=newBufferedReader(isr);
Stringline=br.readLine();
while(line!
=null){
System.out.println(line);
line=br.readLine();
}
br.close();
isr.close();
fis.close();
}
案例:
使用BufferedReader和BufferedWriter实现文件的拷贝
publicstaticvoidmain(String[]args)throwsException{
//创建FileReader对象
FileReaderfr=null;
//创建bufferedReader对象
BufferedReaderbr=null;
//创建FileWriter对象
FileWriterfw=null;
//创建BufferedWriter对象
BufferedWriterbw=null;
try{
fr=newFileReader("D:
\\123.txt");
br=newBufferedReader(fr);
fw=newFileWriter("E:
\\copy.txt");
bw=newBufferedWriter(fw);
System.out.print("开始复制文件");
Stringline=null;
while((line=br.readLine())!
=null){
System.out.print(".");
bw.write(line);
bw.newLine();
bw.flush();
}
System.out.println();
System.out.println("文件复制完成...");
}catch(Exceptione){
e.printStackTrace();
}finally{
if(bw!
=null){
bw.close();
}
if(fw!
=null){
fw.close();
}
if(br!
=null){
br.close();
}
if(bw!
=null){
bw.close();
}
}
}
2.3具体知识点3:
序列化和反序列化[20分钟]
为什么要使用序列化和反序列化?
(举例讲解)
当两个进程在进行远程通信时(QQ通讯),彼此可以发送各种类型的数据。
无论是何种类型的数据,都会以二进制序列的形式在网络上传送。
发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
序列化:
就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保持或传输格式的过程,在序列化过程中,会将对象的公有成员、私有成员包括类名,转换为字节流,然后再把自己流写入数据流,存储到介质中,这里说的介质就是指文件。
反序列化:
顾名思义就是与序列化相反,反序列化就是从特定的存储介质中讲数据重新构建对象的过程。
(也就是将序列化的对象还原)
知识讲解1:
序列化的步骤:
(四步)
1需要序列化的类实现Serializable接口
2创建对象输出流
FileOutputStreamos=new FileOutputStream(f);
//ObjectOutputStream 核心类
ObjectOutputStreamoos=new ObjectOutputStream(os);
3调用writeObject()方法将对象写入文件
4关闭对象输出流
案例
publicstaticvoidmain(String[]args)throwsException{
//实例化User对象
Useruser=newUser("张三",26,"java12");
//创建对象输出流
FileOutputStreamfos=newFileOutputStream("D:
\\user.txt");
ObjectOutputStreamoos=newObjectOutputStream(fos);
//用输出流的writer()方法将对象写入文件
oos.writeObject(user);
oos.close();
fos.close();
System.out.println("序列化完毕!
!
");
}
注意:
可以使用集合保存对象,然后将集合中所有的对象进行序列化
知识讲解2:
反序列化的步骤:
(四步)
1需要序列化的类实现Serializable接口
2创建对象输入流
InputStreamis=new FileInputStream(f);
//ObjectOutputStream 核心类
ObjectInputStreamois=new ObjectInputStream(is);
3调用readObject()方法读取对象
4关闭对象输出流
案例:
publicstaticvoidmain(String[]args)throwsException{
//创建对象输入流
FileInputStreamfis=newFileInputStream("D:
user.txt");
ObjectInputStreamois=newObjectInputStream(fis);
//调用readObject()方法读取对象返回值是objec类型,要强转
Useruser=(User)ois.readObject();
//关闭流
ois.close();
fis.close();System.out.println(user.getName()+"\t"+user.getAge()+"\t"+user.getClazz());
}
//反序列化list集合返回值是objec类型,要强转
FileInputStreamfis=newFileInputStream("D:
users.txt");
ObjectInputStreamois=newObjectInputStrea