第七章: 内部类与异常类
1. 内部类
(1)类可以有两种重要的成员: 成员变量和方法, 类还可以有一种成员: 内部类.
(2)java 支持在一个类中声明另一个类, 这样的类称为内部类, 而包含内部类的类称为内部类的外部类. 声明内部类如同在类中声明方法和成员变量一样, 一个类把内部类看作是自己的成员. 内部类的外嵌类的成员变量在内部类中仍然有效, 内部类中的方法也可以调用外嵌类中的方法.
(3)内部类的类体中不可以声明类变量和方法, 外嵌类的类体中可以用内部类声明对象, 作为外嵌类的成员.
2. 匿名类
a) 和类有关的匿名类
当使用类创建对象时, 程序允许把类体与对象的创建组合在一起, 也就是说, 类创建对象时, 除了构造方法还有类体, 此类体被认为是该类的一个子类去掉类声明后的类体, 称作匿名类. 匿名类就是一个子类, 由于无名可用, 所以不可能用匿名类声明对象, 但却可以直接用匿名类创建对象.
注:(1)匿名类可以继承父类的方法也可以重写父类的方法. 使用匿名类时, 必然是在某个类中直接用匿名类创建对象, 因此匿名类一定是内部类, 匿名类可以访问外嵌类中的成员变量和方法, 匿名类的类体中不可以声明 static 成员变量和 static 方法.
(2)尽管匿名类创建的对象没有经历类声明的步骤, 但匿名对象的引用必须传递一个匹配的参数, 匿名类的主要途径就是向方法的参数传值.
(3)如果匿名类继承了类的方法, x 就调用继承的方法, 如果匿名类重写了父类的方法, x 就调用重写的方法.
b) 和接口相关的匿名类
3. 异常类
(1)异常的概念
异常是指当程序中某些地方出错时创建的一种特殊的运行时错误对象. Java 创建异常对象后, 就发送给 Java 程序, 即抛出异常(throwing an exception). 程序捕捉到这个异常后, 可以编写相应的异常处理代码进行处理. 使用异常处理可以使得程序更加健壮, 有助于调试和后期维护.
(2)异常处理
Java 异常通常在调用某些方法不一定完全成功时抛出, 针对抛出的异常程序需要给出相应的处理, 这称为异常处理. 异常处理分为三个部分: 捕捉异常, 程序流程的跳转和异常处理语句块. 当一个异常被抛出时, 程序中有专门的语句来接收这个被抛出的异常对象, 这个过程就是捕捉异常; 当一个异常类的对象被捕捉或接收后, 用户程序就会发生流程跳转, 系统中止程序运行, 跳转到异常处理语句的执行, 或者直接跳出系统, 回到操作系统状态下. 在 Java 语言中, try 语句用来启动 Java 的异常处理机制, 通常是可能抛出异常的语句的调用; 而 catch 语句进行捕捉和处理异常, 有时添加 finally 语句块, finally 中的语句是正常执行或者处理异常之后必须执行的语句. 语句格式如下:
try
{
语句块;
- }
- catch(异常类 异常类参数名)
- {
异常处理语句块;
}
finally
{
try 或者 catch 语句完毕后必须执行的语句(通常用于关闭文件
流对象或者数据库对象等);
}
(3)用户自定义异常
用户自定义异常用来处理用户应用程序中的特定逻辑的运行错误, 用户自定义的异常类通常继承自 Exception 类.
第十章: 输入, 输出流
一, 理解数据流
流一般分为输入流 (Input Stream) 和输出流 (Output Stream) 两类.
二, Java 的标准数据流
标准输入输出指在字符方式下(如 DOS), 程序与系统进行交互的方式, 分为三种:
标准输入 studin, 对象是键盘.
标准输出 stdout, 对象是屏幕.
标准错误输出 stderr, 对象也是屏幕.
三, 字节流方法
字节流: 从 InputStream 和 OutputStream 派生出来的一系列类. 这类流以字节 (byte) 为基本处理单位.
- InputStream,OutputStream
- FileInputStream,FileOutputStream
- PipedInputStream,PipedOutputStream
- ByteArrayInputStream,ByteArrayOutputStream
- FilterInputStream,FilterOutputStream
- DataInputStream,DataOutputStream
- BufferedInputStream,BufferedOutputStream
1,InputStream 和 OutputStream
read(): 从流中读入数据
skip(): 跳过流中若干字节数
available(): 返回流中可用字节数
mark(): 在流中标记一个位置
reset(): 返回标记过得位置
markSupport(): 是否支持标记和复位操作
close(): 关闭流
int read() : 从输入流中读一个字节, 形成一个 0~255 之间的整数返回(是一个抽象方法).
int read(byte b[]) : 读多个字节到数组中.
int read(byte b[], int off, int len): 从输入流中读取长度为 len 的数据, 写入数组 b 中从索引 off 开始的位置, 并返回读取得字节数.
write(int b) : 将一个整数输出到流中(只输出低位字节, 抽象)
write(byte b[]) : 将字节数组中的数据输出到流中
write(byte b[], int off, int len) : 将数组 b 中从 off 指定的位置开始, 长度为 len 的数据输出到流中
flush(): 刷空输出流, 并将缓冲区中的数据强制送出
close(): 关闭流
2, 管道流
管道用来把一个程序, 线程和代码块的输出连接到另一个程序, 线程和代码块的输入. java.io 中提供了类 PipedInputStream 和 PipedOutputStream 作为管道的输入 / 输出流
管道输入流作为一个通信管道的接收端, 管道输出流则作为发送端. 管道流必须是输入输出并用, 即在使用管道前, 两者必须进行连接
管道输入 / 输出流可以用两种方式进行连接:
在构造方法中进行连接
- PipedInputStream(PipedOutputStream pos);
- PipedOutputStream(PipedInputStream pis);
通过各自的 connect()方法连接
在类 PipedInputStream 中, connect(PipedOutputStream
在类 PipedOutputStream 中, connect(PipedInputStream pis);
3, 数据流
DataInputStream 和 DataOutputStream
在提供了字节流的读写手段的同时,
以统一的通用的形式向输入流中写入 boolean,int,long,double 等基本数据类型, 并可以在次把基本数据类型的值读取回来.
提供了字符串读写的手段.
分别实现了 DataInput 和 DataOutput 接口
声明类: Public class DataInputStream extends filterInputStream implements DataInput
4, 对象流
对象的持续性(Persistence)
能够纪录自己的状态一边将来再生的能力, 叫对象的持续性
对象的串行化(Serialization)
对象通过写出描述自己状态的数值来记录自己的过程叫串行化. 串行化的主要任务是写出对象实例变量的数值, 如果变量是另一个对象的引用, 则引用的对象也要串行化. 这个过程是递归的
对象流
能够输入输出对象的流称为对象流.
可以将对象串行化后通过对象输入输出流写入文件或传送到其它地方
在 java 中, 允许可串行化的对象在通过对象流进行传输. 只有实现 Serializable 接口的类才能被串行化, Serializable 接口中没有任何方法, 当一个类声明实现 Serializable 接口时, 只是表明该类加入对象串行化协议
要串行化一个对象, 必须与一定的对象输出 / 输入流联系起来, 通过对象输出流将对象状态保存下来(将对象保存到文件中, 或者通过网络传送到其他地方) , 再通过对象输入流将对象状态恢复
类 ObjectOutputStream 和 ObjectInputStream 分别继承了接口 ObjectOutput 和 ObjectInput, 将数据流功能扩展到可以读写对象, 前者用 writeObject()方法可以直接将对象保存到输出流中, 而后者用 readObject()方法可以直接从输入流中读取一个对象
四, 字符流的方法
1, 字符流: 从 Reader 和 Writer 派生出的一系列类, 这类流以 16 位的 Unicode 码表示的字符为基本处理单位.
- Reader,Writer
- InputStreamReader,OutputStreamWriter
- FileReader,FileWriter
- CharArrayReader,CharArrayWriter
- PipedReader,PipedWriter
- FilterReader,FilterWriter
- BufferedReader,BufferedWriter
- StringReader,StringWriter
2,Reader 类和 Writer 类
在 JDK1.1 之前, java.io 包中的流只有普通的字节流(以 byte 为基本处理单位的流), 这种流对于以 16 位的 Unicode 码表示的字符流处理很不方便. 从 JDK1.1 开始, java.io 包中加入了专门用于字符流处理的类, 它们是以 Reader 和 Writer 为基础派生的一系列类
同类 InputStream 和 OutputStream 一样, Reader 和 Writer 也是抽象类, 只提供了一系列用于字符流处理的接口. 它们的方法与类 InputStream 和 OutputStream 类似, 只不过其中的参数换成字符或字符数组
1,Reader 类
• void close()
• void mark(int readAheadLimit)
• boolean markSupported() :
• int read()
• int read(char[] cbuf)
• int read(char[] cbuf, int off, int len)
• boolean ready()
• void reset()
• long skip(long n)
2,Writer 类
• void close()
• void flush()
• void write(char[] cbuf)
• void write(char[] cbuf, int off, int len)
• void write(int c)
• void write(String str)
• void write(String str, int off, int len)
五,, 文件操作类的方法 File 类
1,File 类声明如下:
public class File ectends Object implements Serializable,Comparable
构造方法:
- public File(String pathname)
- public File(File patent,String child)
- public File(String patent,String child)
2, 文件名的处理
- String getName( ); // 得到一个文件的名称(不包括路径)
- String getPath( ); // 得到一个文件的路径名
- String getAbsolutePath( );// 得到一个文件的绝对路径名
- String getParent( ); // 得到一个文件的上一级目录名
- String renameTo(File newName); // 将当前文件名更名为给定文件的完整路径
3, 文件属性测试
- boolean exists( ); // 测试当前 File 对象所指示的文件是否存在
- boolean canWrite( );// 测试当前文件是否可写
- boolean canRead( );// 测试当前文件是否可读
- boolean isFile( ); // 测试当前文件是否是文件(不是目录)
- boolean isDirectory( ); // 测试当前文件是否是目录
4, 普通文件信息和工具
- long lastModified( );// 得到文件最近一次修改的时间
- long length( ); // 得到文件的长度, 以字节为单位
- boolean delete( ); // 删除当前文件
5, 目录操作
- boolean mkdir( ); // 根据当前对象生成一个由该对象指定的路径
- String list( ); // 列出当前目录下的文件
6, 文件过滤器
类 FilterInputStream 和 FilterOutputStream 分别对其他输入 / 输出流进行特殊处理, 它们在读 / 写数据的同时可以对数据进行特殊处理. 另外还提供了同步机制, 使得某一时刻只有一个线程可以访问一个输入 / 输出流.
类 FilterInputStream 和 FilterOutputStream 分别重写了父类 InputStream 和 OutputStream 的所有方法, 同时, 它们的子类也应该重写它们的方法以满足特定的需要
• 要使用过滤流, 首先必须把它连接到某个输入 / 输出流上, 通常在构造方法的参数中指定所要连接的流:
- - FilterInputStream(InputStream in);
- - FilterOutputStream(OutputStream out);
注: 这两个类是抽象类, 构造方法也是保护方法
类 BufferedInputStream 和 BufferedOutputStream 实现了带缓冲的过滤流, 它提供了缓冲机制, 把任意的 I/O 流 "捆绑" 到缓冲流上, 可以提高读写效率
• 在初始化时, 除了要指定所连接的 I/O 流之外, 还可以指定缓冲区的大小. 缺省大小的缓冲区适合于通常的情形; 最优的缓冲区大小常依赖于主机操作系统, 可使用的内存空间以及机器的配置等; 一般缓冲区的大小为内存页或磁盘块等地整数倍, 如 8912 字节或更小.
- - BufferedInputStream(InputStream in[, int size])
- - BufferedOutputStream(OutputStream out[, int size])
7, 文件对话框
随机文件操作
于 InputStream 和 OutputStream 来说, 它们的实例都是顺序访问流, 也就是说, 只能对文件进行顺序地读 / 写. 随机访问文件则允许对文件内容进行随机读 / 写. 在 java 中, 类 RandomAccessFile 提供了随机访问文件的方法. 类 RandomAccessFile 的声明为:
public class RandomAccessFile extends Object implements DataInput, DataOutput
File: 以文件路径名的形式代表一个文件
FileDescriptor: 代表一个打开文件的文件描述
FileFilter & FilenameFilter: 用于列出满足条件的文件
- File.list(FilenameFilter fnf)
- File.listFiles(FileFilter ff)
- FileDialog.setFilenameFilter(FilenameFilter fnf)
• FileInputStream & FileReader: 顺序读文件
• FileOutputStream & FileWriter: 顺序写文件
• RandomAccessFile: 提供对文件的随机访问支持
类 RandomAccessFile 则允许对文件内容同时完成读和写操作, 它直接继承 Object, 并且同时实现了接口 DataInput 和 DataOutput, 提供了支持随机文件操作的方法
DataInput 和 DataOutput 中的方法
• readInt(), writeDouble()...
int skipBytes(int n): 将指针乡下移动若干字节
length(): 返回文件长度
long getFilePointer(): 返回指针当前位置
void seek(long pos): 将指针调到所需位置
void setLength(long newLength): 设定文件长度
构造方法:
- RandomAccessFile(File file, String mode)
- RandomAccessFile(String name, String mode)
mode 的取值
- "r" 只读. 任何写操作都将抛出 IOException.
- "rw" 读写. 文件不存在时会创建该文件, 文件存在时, 原文件内容不变, 通过写操作改变文件内容.
- "rws" 同步读写. 等同于读写, 但是任何协操作的内容都被直接写入物理文件, 包括文件内容和文件属性.
- "rwd" 数据同步读写. 等同于读写, 但任何内容写操作都直接写到物理文件, 对文件属性内容的修改不是这样.
六, Java 中 Scanner 的用法
Scanner 是 SDK1.5 新增的一个类, 可是使用该类创建一个对象.
Scanner reader=new Scanner(System.in);
然后 reader 对象调用下列方法(函数), 读取用户在命令行输入的各种数据类型: next.Byte(),nextDouble(),nextFloat,nextInt(),nextLin(),nextLong(),nextShot()
上述方法执行时都会造成堵塞, 等待用户在命令行输入数据回车确认. 例如, 拥护在键盘输入 12.34,hasNextFloat()的值是 true, 而 hasNextInt()的值是 false. NextLine()等待用户输入一个文本行并且回车, 该方法得到一个 String 类型的数据.
2019-2020-4《Java 程序设计》第六周学习总结
1. 通过第二周的学习, 利用教材和老师在蓝墨云上的一些教学视频以及通过老师和同学的博客以及一些课外资料, 充分学习了第七, 十章的内容, 学习的内容有: 内部类, 匿名类, 异常类, 断言, File 类, 文件字节输入流, 文件字节输出流, 文件字符输入, 输出流, 缓冲流, 随机流, 数组流, 数据流, 对象流, 序列化与对象克隆, 使用 Scanner 解析文件, 文件对话框, 带进度条的输入流, 文件锁. 由于本周的学习任务较重, 对这两章学习内容并不是十分理解, 但通过学习七, 十章内容, 会使得编程更加便捷, 方便, 总体来说, 自我感觉这两章内容相对较难.
2. 通过手打第七, 十章代码, 对语法有一定的帮助, 并在调试完代码后上传至码云仓库, 并提交脚本.(由于这两章例子过多, 博客中体现部分程序运行截图)
部分程序运行截图:
脚本截图:
注: 我的码云链接: https://gitee.com/zzm-zcc/zhang_zhi_min
2019-2020-4 《Java 程序设计》第六周练习题生疏题, 错题总结
1, 下列关于异常的说法, 错误的是(AD)
A .Java 使用 throws 抛出一个异常, 使用 throw 声明方法可能抛出异常.
B . 执行 System.out.println(3/0); 语句会报 ArithmeticException 异常.
C .Java 中的错误是以对象的方式呈现为 java.lang.Throwable 的各种子类实例.
D . 方法 parseInt()在执行过程中可能抛出 DataFormatException 异常.
2, 下列关于断言的说法, 错误的是(D)
A . 断言语句通常用于调试代码.
B . 如果使用 assert booleanException:messageException; 形式的断言语句, 当 booleanException 的值是 false 时, 程序从断言语句处停止执行, 并输出 messageException 的值.
C . 在调试程序时, 可以使用 - ea 启动断言语句.
D .String n = new AssertDemo().getName("Magical");
3, 下列无法通过编译的是(C)
- class OutClass {
- int m = 1;
- static float x; //A
- class InnerClass {
- int m =12; //B
- static float n =20.89f; //C
- InnerClass(){
- }
- void f() {
- m = 100;
- }
- }
- void cry() {
- InnerClass tom = new InnerClass(); //D
- }
- }
- A .A
- B .B
- C .C
- D .D
4, 调用线程的 interrupt()方法 , 会抛出哪些异常对象?(ADE)
- A .ClosedByInterruptException
- B .IllegalStateException
- C .RuntimeException
- D .InterruptedException
- E .SecurityException
5, 如果某个方法的参数是接口类型, 那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数, 类体必须要重写接口中的全部方法.(A)
A .true
B .false
来源: https://www.cnblogs.com/zzmzcc/p/10664472.html