文件与异常+字符流+字节流_Java_1027,34

文件与异常

1. 大纲

  • File
  • (文件;表示;使用)
  • 文件选择器
  • (**JFileChooser**)
  • 文件过滤器
  • (**FileNameExtensionFilterFileFilter**)
  • 一个类
  • (**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_ONLYDIRECTORIES_ONLYFILES_AND_DIRECTORIESsetMultiSelectionEnabled(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_OPTIONCANCEL_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**类型的文件名nameFile类型的文件对象**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. 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

(っ•̀ω•́)っ✎⁾⁾ 坚持技术学习、内容输出与分享,您的支持将鼓励我继续创作!(*/ω\*)
( • ̀ω•́ )✧如有疑问或需要技术讨论,请留言或发邮件到 aclearzhang@qq.com.(*・ω< ) 
  • 本文作者:: AClearZhang
  • 本文链接:: 209.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!