20165315 第五周学习总结
本周学习中遇到的问题和解决过程
- 在编写第七章例子6时,不知道如何在idea中加上
-ea
命令执行assert
断言语句,直接运行后,结果如下:
明显不对(分数中有负数)
解决过程:
经过查询网络,在一篇博客中找到了答案,运行结果如下:
- 在编写第十章例子1时,出现了如下问题:
解决过程: 书上代码用的文件路径是C://ch10
,而由于我的电脑是mac,而且该文件放在src
目录中的ch10
中,所以文件路径应该是src/ch10
- 在编写第十章例子3时,出现了如下问题:
解决过程:
mac电脑里并没有记事本和浏览器,不知道如何修改路径
- 在编写第十章例子4时,出现了如下问题:
书上的占用字节数分别为0,8,22
解决过程:
考虑到可能不同的电脑系统计算字节数的大小方法不同,我查询了网络,在百度知道中得知:一般情况下是汉字编码,一个汉字是占用两个字节的;但如果是在UTF-8编码(一种国际通用的一种变长编码)下,一个汉字占3个字节
- 在编写第十章例子7时,出现了如下问题:
解决过程:
在码代码时漏打了一部分代码
- 在编写第十章例子14时,出现了如下窗口,点击按钮后没有任何反应:
解决过程:
- 在编写第十章需要创建txt文本的文件时,系统无法自动创建txt文本,需要手动添加,但是我又不清楚如何在idea中手动添加txt文本
解决过程:
可以在命令行中输入touch *.txt
添加txt文本,但是仍未解决如何在idea 中自动添加txt文本的问题
学习总结
第七章
- 内部类:内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员
- 声明内部类如同在类中声明方法或变量一样,一个类把内部类看作是自己的成员
- 外嵌类的类体中可以用内部类声明的对象,作为外嵌类的成员
- 外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法
- 内部类的类体中不可以声明类变量和方法
- 外嵌类和内部类在编译时,生成两个.class文件
- 内部类可以被修饰为
static
内部类,非内部类不可以是static
类
- 匿名类
- 和子类有关的匿名类:Java允许我们直接使用一个类的子类的类体创建一个子类对象
- 和接口有关的匿名类
- 匿名类的特点
- 可以继承和重写父类的方法
- 一定是内部类
- 可以访问外嵌类中的成员变量和方法,但是不能声明
static
成员变量和方法 - 创建对象时要直接使用父类的构造方法
- 异常类
try-catch
语句- 如果句尾带有
finally
语句,则无论是否发生异常,都执行该语句;但如果执行System.exit(0);
语句,则直接退出程序,不执行finally
语句
- 如果句尾带有
- 自定义异常类:
throws
关键字抛出异常类
- 断言
assert
关键字- 使用
java -ea [classname]
启用断言语句
第十章
- File类
- 创建一个File对象的构造方法有3个:
File(String filename);
File(String directoryPath,String filename);
File(File f, String filename);
- 获取文件本身的一些信息
public String getName()
获取文件的名字public boolean canRead()
判断文件是否是可读的public boolean canWrite()
判断文件是否可被写入public boolean exits()
判断文件是否存在public long length()
获取文件的长度(单位是字节)public String getAbsolutePath()
获取文件的绝对路径public String getParent()
获取文件的父目录public boolean isFile()
判断文件是否是一个普通文件,而不是目录public boolean isDirectroy()
判断文件是否是一个目录public boolean isHidden()
判断文件是否是隐藏文件public long lastModified()
获取文件最后修改的时间
- 目录
- 创建目录
public boolean mkdir()
- 列出目录中的文件
public String[] list()
用字符串形式返回目录下的全部文件public File [] listFiles()
用File对象形式返回目录下的全部文件public String[] list(FilenameFilter obj)
用字符串形式返回目录下的指定类型的所有文件public File [] listFiles(FilenameFilter obj)
用File对象形式返回目录下的指定类型所有文件
- 创建目录
- 文件的创建与删除
File file=new File()
- 运行可执行文件
- 用
Runtime
类声明一个对象(Runtime
类在java.lang
包):
Runtime ec;
- 然后使用该类的
getRuntime()
静态方法创建这个对象:
ec=Runtime.getRuntime();
- 用
- 创建一个File对象的构造方法有3个:
- 文件字节输入流
- 使用输入流通常包括4个基本步骤:
- 设定输入流的源
- 创建指向源的输入流
- 让输入流读取源中的数据
- 关闭输入流
- 构造方法:设定输入流源->
FileInputStream(String name);
、
FileInputStream(File file);
- 使用输入流读取字节
int read()
读取单个字节的数据,返回字节值,如果未读出字节就返回-1。int read(byte b[])
读取b.length个字节到字节数组b中,返回实际读取的字节数。如果到达文件的末尾,则返回-1。int read(byte b[], int off, int len)
读取len个字节到字节数组b中,并返回实际读取的字节数目。如果到达文件的末尾,则返回-1,参数off指定从字节数组的某个位置开始存放读取的数据
- 使用输入流通常包括4个基本步骤:
- 文件字节输出流
- 使用输出流通常包括4个基本步骤:
- 给出输出流的目的地
- 创建指向目的地的输出流
- 让输出流把数据写入到目的地
- 关闭输出流
- 构造方法:
创建指向文件的输出流->
FileOutputStream(String name);
、FileOutputStream(File file);
- 使用输出流写字节
void write(int n)
向目的地写入单个字节void write(byte b[])
向目的地写入一个字节数组void write(byte b[],int off,int len)
从字节数组中偏移量off处取len个字节写到目的地
- 关闭流:调用
close()
方法
- 使用输出流通常包括4个基本步骤:
- 缓冲流
- BufferedReader和BufferedWriter类创建的对象称作缓冲输入、输出流
BufferedReader(Reader in);
BufferedWriter (Writer out);
- BufferedReader和BufferedWriter类读写文件
readLine()
读取文本行write(String s,int off,int len)
把字符串s写到文件中newLine();
向文件写入一个回行符
- BufferedReader和BufferedWriter类创建的对象称作缓冲输入、输出流
- 随机流
- 构造方法
RandomAccessFile(String name,String mode) ;
RandomAccessFile(File file,String mode) ;
- 相关方法
seek(long a)
定位RandomAccessFile
流的读写位置getFilePointer()
获取流的当前读写位置readLine()
方法在读取含有非ASCII字符的文件时出现“乱码”现象的解决方法:- 读取:
String str=in.readLine();
- 用“iso-8859-1”重新编码:
byte b[]=str.getBytes("iso-8859-1");
- 使用当前机器的默认编码将字节数组转化为字符串:
String content=new String(b);
- 读取:
- 构造方法
- 随机流
- 构造方法:
RandomAccessFile(String name,String mode) ;
RandomAccessFile(File file,String mode) ;
- 相关方法:
seek(long a)
定位RandomAccessFile
流的读写位置getFilePointer()
获取流的当前读写位置
readLine()
方法在读取含有非ASCII字符的文件时出现“乱码”现象的解决方法:- 读取:
String str=in.readLine();
- 用“iso-8859-1”重新编码:
byte b[]=str.getBytes("iso-8859-1");
- 使用当前机器的默认编码将字节数组转化为字符串:
String content=new String(b);
- 读取:
- 构造方法:
- 数组流
- 字节数组流
ByteArrayInputStream
构造方法及常用方法ByteArrayInputStream(byte[] buf);
ByteArrayInputStream(byte[] buf,int offset,int length);
public int read();
顺序地从源中读出一个字节public int read(byte[] b,int off,int len);
顺序地从源中读出参数len指定的字节数
-ByteArrayOutputStream
流构造方法及常用方法ByteArrayOutputStream();
ByteArrayOutputStream(int size);
public void write(int b);
顺序地向缓冲区写入一个字节public void write(byte[] b,int off,int len);
将参数b中指定的len个字节顺序地写入缓冲区public byte[] toByteArray();
返回输出流写入到缓冲区的全部字节
- 字符数组
CharArrayReader
和CharArrayWriter
类是字符数组流,使用字符数组作为流的源和目标
- 字节数组流
- 数据流
- 构造方法:
DataInputStream
创建的数据输入流指向一个由参数in指定的底层输入流DataOutputStream
创建的数据输出流指向一个由参数out指定的底层输出流
- 构造方法:
- 对象流
- 构造方法:
ObjectInputStream(InputStream in)
ObjectOutputStream(OutputStream out)
- 相关方法:
writeObject(Object obj)
将一个对象obj写入到一个文件readObject()
读取一个对象到程序中
- 序列化:一个类如果实现了
Serializable
接口,那么这个类创建的对象就是所谓序列化的对象
- 构造方法:
- 序列化与对象克隆
- 调用
clone()
方法 - 对象输入流通过对象的序列化信息来得到当前对象的一个克隆
- 调用
- 使用
Scanner
解析文件
1.使用默认分隔标记解析文件
创建Scanner
对象,并指向要解析的文件,例如:
File file = new File("hello.java");
Scanner sc = new Scanner(file);
相关方法:
(1) next()
依次返回file中的单词
(2)hasNext()
判断file最后一个单词是否已被next()
方法返回
2.使用正则表达式作为分隔标记解析文件 : 创建Scanner
对象,指向要解析的文件,并使用useDelimiter
方法指定正则表达式作为分隔标记,例如:
File file = new File("hello.java");
Scanner sc = new Scanner(file);
sc.useDelimiter(正则表达式);
相关方法
(1) next()
依次返回file中的单词
(2)hasNext()
判断file最后一个单词是否已被next()
方法返回
-
文件对话框
- 构造方法
JFileChooser()
创建初始不可见的有模式的文件对话框。然后文件对话框调用下述2个方法:showSaveDialog(Component a);
showOpenDialog(Component a);
- 构造方法
-
带进度条的输入流
- 构造方法是
ProgressMonitorInputStream(Conmponent c,String s,InputStream);
- 构造方法是
-
文件锁
- 输入、输出流读写文件时可以使用文件锁
RondomAccessFile
创建的流在读写文件时使用文件锁的步骤如下:- 先使用
RondomAccessFile
流建立指向文件的流对象,该对象的读写属性必须是rw
,例如:
RandomAccessFile input=new RandomAccessFile("Example.java","rw");
input
流调用方法getChannel()
获得一个连接到地层文件的FileChannel
对象(信道),例如
FileChannel channel=input.getChannel();
- 信道调用
tryLock()
或lock()
方法获得一个FileLock
(文件锁)对象,这一过程也称作对文件加锁.
例如:FileLock lock=channel.tryLock();
- 先使用