文件与异常
1. 大纲
- File
- (文件;表示;使用)
- 文件选择器
- (**JFileChooser**)
- 文件过滤器
- (**FileNameExtensionFilter;FileFilter**)
- 一个类
- (**JOptionPane**)
- 异常
- (概念;体系;结构;自定义
2.文件和文件夹表示
■java.io.File ■格式 ■File file = new File(**文件名**); //**将外部文件与内部对象建立联系 ■举例 ■File file = new File(“Note.txt”); //相对文件名 ■File file = new File(“d:/JavaProjects**/HelloWorld.java”); //**绝对**文件名 ■通过**File对象能够操作对应的文件或文件夹 !! ■如何得到File对象? ■直接通过文件名创建:**File file = new File(**文件名**); ■通过文件选择**器得到:由JFileChooser**类提供支持 ■通过参数传递得到:**void method(File file) { … } ■File**对象的使用 ■length(); //long len = file.length**(); ■getAbsolutePath**(); getName**(); getParent**(); ■exists(); ■isFile**(); isDirectory**(); isHidden**(); ■list(); listFiles**(); ■mkdir**(); mkdirs**(); ■delete(); renameTo**(File dest**); 可**查阅JDK帮助文档详细进行了解**
3.文件选择器
₪类:**javax.swing.JFileChooser ₪基本步骤**
操作
示意性代码
1**、创建对象**
JFileChooser chooser = new JFileChooser**(); //**可带参数,用于指定路径
2**、设置对象**
•chooser.**setCurrentDirectory**(File dir**); •setFileSelectionMode(int mode); //FILES_ONLY,DIRECTORIES_ONLY,FILES_AND_DIRECTORIES •setMultiSelectionEnabled(boolean b); •setFileFilter(FileFilter filter); addChoosableFileFilter(FileFilter filter); //**添加 •setSelectedFile**(File file);**
3**、显示对话框**
•int**v = chooser.showOpenDialog(父组件对象**); //**显示打开对话框 •int**v = chooser.show**SaveDialog(父组件对象); //**显示保存对话框
4**、判断返回值**
if (v == JFileChooser.**APPROVE_OPTION**) { … } //**取值:APPROVE_OPTION,CANCEL_OPTION,**ERROR_OPTION
5**、获取文件**
•File getCurrentDirectory**(); •File getSelectedFile**(); //File file = chooser.**getSelectedFile**(); •File[] getSelectedFiles**(); //**可选择多个文件时使用
6**、处理文件**
读取;写入;其他
4.文件过滤器
■类:**javax.swing.filechooser.FileFilter ■这是一个抽象类,抽象方法有 ■public abstract boolean**accept(File f); //**可接受文件的条件**
■public abstract String getDescription**(); //**对文件的描述性文字
自定义文件过滤器—
基本步骤:
操作
示意性代码
1**、定义类**
public class XxxFilter**extends FileFilter** { public XxxFilter**(…) { … } //**构造方法 public boolean** accept(File file) { return …; //使用file**参数构造文件接受条件 } public String getDescription**() { return …; } }**
2**、创建对象**
XxxFilter fiter = new XxxFilter**();**
3**、应用对象**
chooser.setFilter**(filter); //chooser.addChoosableFileFilter(filter); int v = chooser.showOpenDialog**(…); ……
==文件扩展名过滤器
₪类:**javax.swing.filechooser.FileNameExtensionFilter ₪父类:**FileFilter ₪基本步骤
操作
示意性代码
1**、创建**
FileNameExtensionFilter filter = new FileNameExtensionFilter**(“Java File”, “java”, “class”);**
2**、应用**
chooser.**setFilter**(filter);
综合 示例
JFileChooser chooser = new JFileChooser**(“d:/JavaProjects“); FileNameExtensionFilter f1 = new FileNameExtensionFilter(“Java文件 [.java]“, “java”); FileNameExtensionFilter f2 = new FileNameExtensionFilter(“Class文件 [.class]“, “class”); chooser.addChoosableFileFilter**(f1); chooser.addChoosableFileFilter**(f2); int v = chooser.showOpenDialog**(…); ……
5.javax.swing.JOptionPane
₪JOptionPane**提供了以下几个常用方法:**
static void
showMessageDialog**(Component parentComponent, Objectmessage, String title, intmessageType)**
static String
showInputDialog**(Component parentComponent, Object message)**
static int
showConfirmDialog**(Component parentComponent, Object message, String**title, int**optionType**)
messageType
optionType
return value ( int )
ERROR_MESSAGE INFORMATION_MESSAGE WARNING_MESSAGE QUESTION_MESSAGE PLAIN_MESSAGE
DEFAULT_OPTION YES_NO_OPTION YES_NO_CANCEL_OPTION OK_CANCEL_OPTION
YES_OPTION NO_OPTION CANCEL_OPTION OK_OPTION CLOSED_OPTION
6.异常处理
《
₪在调用某个方法时,有时能**正常**执行,有时则出现异常:
■int d1 = Integer.parseInt**(“123”);
■int d2 = Integer.parseInt(“123a”);
■访问值为null的对象的成员
■数组越界访问
■字符串越界访问
■……
₪当出现异常时应该能进行适当的处理,
否则程序会异常终止而影响健壮性
₪Java提供了一种简便、通用的异常处理方式**
》
异常处理程序结构
try {
_ //_**_可能__会出现异常的__方法调用语句_
} catch (**异常类 e1) {
//**异常处理代码,如: //获取信息:e1.getMessage()**; //**显示调用:e1.printStackTrace();
} catch (**异常类 e2) {
//**异常处理代码
} …… {
//**异常处理代码
} finally {
//**最后的处理代码
}**
[caption id=”attachment_227” align=”alignnone” width=”300”] 异常类型[/caption]
P.S.自定义**异常**类:
₪当需要**JDK**中并未涵盖的异常时,需要自定义异常类
public class XxxException**extends Exception** {
public XxxException**() { //**无参构造方法
}
public XxxException**(String message) { //**提供异常信息的构造方法
super(message);
}
}
自定义异常方法:
public void f(int x) throws XxxException, … {
……
if (布尔表达式) {
throw new XxxException(…);
}
……
}
字符流
1.创建文件夹和文件 (data;Notes.txt;Paper.properties) 表示文件夹和文件 (定义成员变量) 文件操作基本步骤 (5个基本步骤) 文本文件 (读;写) 属性文件 (读;写) P.S. 创建文件夹 data 创建文件 Note.txt Paper.properties
2.文件读写的基本步骤:
- 1**、获取要操作的文件**
- 2**、创建基本读写对象**
- 3**、创建实际读写对象**
- 4**、读写处理**
- 5**、关闭**
3.文本文件
读取:
₪基本步骤
1.String**类型的文件名name或File类型的文件对象**file
2.FileReader fin = new FileReader**(name); //或file
3.BufferedReader in = new BufferedReader**(fin);
4.while (true) {
String line = in.readLine**(); //还有其它一些读取**方法 if (line == null) { //**已到达文件末尾 break;
} /* 对line进行处理 */ }
**5.in.close**(); //**关闭 zhuyi
写入文本文件内容
基本步骤
String类型的文件名name或File类型的文件对象file
FileWriter fout = new FileWriter(fileName); //或file
BufferedWriter out = new BufferedWriter(fout);
while (条件) { out.write(待写入的字符串) //还有其它一些写入方法 out.newLine(); //写入换行符}
out.close(); //关闭**
public static String readTextFile(File file) throws IOException {到底在哪里处理异常?
1、就地解决
try - catch
2、交给上级
声明抛出
4.属性文件
_属性文件是一种带格式的文本文件_ _扩展名_ _properties_ _文件格式_ _属性名=属性值_ _说明_ _以“#”开头的行为注释行_ _可在行尾使用“\\”进行续行_
读取基本步骤
String类型的文件名name或File类型的文件对象file
FileReader fin = new FileReader(fileName); //或file
Properties properties = new Properties();properties.load(fin);
String value = properties.getProperty(key);……//参数key为属性名,如:”title”,赋值号左边的value为属性值//返回值类型为String,有时需要转换为其它类型
in.close();
写入基本步骤
Properties properties = new Properties();
Object xxx = properties.setProperty(key, value);……//参数中的key为属性名,value为属性值,类型都是String//返回值xxx是key原来的属性值
String类型的文件名name或File类型的文件对象file
FileWriter fout = new FileWriter(fileName); //或file
properties.store(fout, comments);
* 字节流
- 创建和表示文件夹
- 基本字节流文件的读写
- 数据字节流文件的读写
- 对象字节流文件与序列化
- 随机访问文件
若要把一个对象序列化(即可把整个对象输出到文件中),则需要使该对象对应的类支持可序列化。最简单的支持可序列化的方式是为类声明实现Serializable接口。
Serializable接口定义在io包中,需要使用import语句将其导入。该接口是一个标志性接口,其中没有方法的定义,所以实现该接口时不需要实现任何方法,只要使用implements进行声明即可。
对于一个支持可序列化的类,其中引用类型的成员变量所对应的类也要支持可序列化。
在Paper类中,存在String、Date、Examinee和ChoiceQuestion类型的成员变量,所以它们都需要支持可序列化。对于String和Date,它们已经声明实现了Serializable接口,而对于Examinee和ChoiceQuestion,则需要声明实现Serializable接口。
如果一个类声明实现了Serializable接口,则其子类会继承这种功能,所以在子类声明时不再需要声明实现Serializable接口。所以这里采用为ChoiceQuestion类的父类Question声明实现Serializable接口的方式。
- 1基本字节文件的读/
基本步骤 String类型的文件名name或File类型的文件对象file FileInputStream fi = new FileInputStream(name); //或file BufferedInputStream in = new BufferedInputStream(fi); //可选 / 使用相应类提供的方法读取数据并进行处理 / int read() 读一个字节并返回,-1表示到达文件尾。 int read(byte[] b) 读最多b.length个字节到数组b中,并返回实际读取的字节数,-1表示到达文件尾。 in.close(); //关闭 1.2.基本字节文件的写 基本步骤 String类型的文件名name或File类型的文件对象file FileOutputStream fo = new FileOutputStream(name /, true /); //或file BufferedOutputStream out = new BufferedOutputStream(fo); //可选 / 处理数据并使用相应类提供的方法写入数据 / void write(int b) 写一个字节b。 void write(byte[] b) 写数组b中的b.length个字节。 out.close(); //关闭 2.1数据字节文件的读 基本步骤 String类型的文件名name或File类型的文件对象file FileInputStream fi = new FileInputStream(name); //或file DataInputStream in = new DataInputStream(fi); / 使用相应类提供的方法读取数据并进行处理 / int read() 读一个字节并返回,-1表示到达文件尾。 int read(byte[] b) 读最多b.length个字节存入数组b中,并返回实际读取的字节数,-1表示到达文件尾。 xxx readXxx() 按基本类型xxx读一个数。如:int a = in.readInt(); in.close(); //关闭 2.2数据字节文件的写 基本步骤 String类型的文件名name或File类型的文件对象file FileOutputStream fo = new FileOutputStream(name /, true /); //或file DataOutputStream out = new DataOutputStream(fo); / 处理数据并使用相应类提供的方法写入数据 / void write(int b) 写一个字节b。 void write(byte[] b) 写数组b中的b.length个字节。 void writeXxx(xxx d) 按基本类型xxx写一个数。如:out.writeInt(10); out.close(); //关闭 3.1对象字节文件的读 基本步骤 String类型的文件名name或File类型的文件对象file FileInputStream fi = new FileInputStream(name); //或file ObjectInputStream in = new ObjectInputStream(fi); / 使用相应类提供的方法读取数据并进行处理 / int read() 读一个字节并返回,-1表示到达文件尾。 int read(byte[] b) 读最多b.length个字节存入数组b中,并返回实际读取的字节数,-1表示到达文件尾。 xxx readXxx() 按基本类型xxx读取一个数。如:int a = in.readInt(); Object readObject() 读取一个对象。 如:Paper paper = (Paper) in.readObject(); in.close(); //关闭 3.2对象字节文件的写 基本步骤 String类型的文件名name或File类型的文件对象file FileOutputStream fo = new FileOutputStream(name /, true /); //或file ObjectOutputStream out = new ObjectOutputStream(fo); / 处理数据并使用相应类提供的方法写入数据 / void write(int b) 写一个字节b。 void write(byte[] b) 写数组b中的b.length个字节。 void writeXxx(xxx d) 按基本类型xxx写一个数。如:out.writeInt(10); void writeObject(Object obj) 写一个对象。out.writeObject(paper); out.close(); //关闭 注意:将对象写入到文件中保存(持久化) 前提条件 对象所属的类要实现可序列化接口 java.io.Serializable 标志性接口 接口中没有方法的定义 一个类只需声明实现Serializable接口即可支持其对象的可序列化 注意类中所包含的成员也要支持可序列化 若父类已声明实现Serializable接口,则其子类不需再次声明 4.BOSS++随机访问文件 基本步骤 String类型的文件名name或File类型的文件对象file 确定读写模式mode; // “r” or “rw” RandomAccessFile io = new RandomAccessFile(name, mode); //或file / 使用RandomAccessFile类提供的方法读写数据 / int read() 读一个字节并返回,-1表示到达文件尾。 int read(byte[] b) 读最多b.length个字节存入数组b中,并返回实际读取的字节数,-1表示到达文件尾。 xxx readXxx() 按基本类型xxx读一个数。如:int a = in.readInt(); void write(int b) 写一个字节b。 void write(byte[] b) 写数组b中的b.length个字节。 void writeXxx(xxx d) 按基本类型xxx写一个数。如:out.writeInt(10); void seek(long pos) 定位文件指针 io.close(); //关闭 实现文件的复制: 字节流:copy 如果一次读不完,分批读 8k by b
Object
readObject**() 读取一个对象。 如:**Paper paper = (Paper) in.readObject**();**
l**String.format****("%s/%****s.paper****",** **Config.FOLDER_PAPERLIB****,** **myId****);** l**Config.FOLDER_PAPERLIB** **\+ "/" \+** **myId** **\+ ".paper“** p**“data/****paperlib****/****20150010001****.paper”** ----照片实现 得到试卷
void
seek**(**long pos**) 定位文件指针**
往前往前移动 后移动 i-1 * 4 再readInt 查找JDK 建立文件夹 getSavcFile 在manin 方法中实现 inputstream 如何 name dir props.load(new FileInputStream(“db.properties”)); 是读取当前目录的db.properties文件 getClass.getResourceAsStream(“db.properties”); 是读取当前类所在位置一起的db.properties文件 getClass.getResourceAsStream(“/db.properties”); 是读取ClassPath的根的db.properties文件,注意ClassPath如果是多个路径或者jar文件的,只要在任意一个路径目录下或者jar文件里的根下都可以,如果存在于多个路径下的话,按照ClassPath中的先后顺序,使用先找到的,其余忽略. ————— 如果你只是输入文件名,那java虚拟机默认是执行java XXXX命令所在的目录 例如: C:\\test>java test 那db.properties就是C:\\test\\db.properties