1.File类

Java中对文件有操作时,可以实例化一个File对象,将文件路径利用这样的形式赋给File对象。

File f = new File(filePath);

File类的基本操作包括:

判断是否存在:f.exists()

获取文件名:f.getName()

获取其绝对路径:f.getAbsolutePath()

 

但是如果涉及文件的查看与存储,就要利用IO的输入和输出流进行操作。

2.输入流:

常用的有InputStream类。

对于txt类文件查看的操作如下:

// 创建输入流
InputStream input = new FileInputStream(file);
// 开辟一块存储读入数据的缓存区域
byte[] contentBytes = new byte[input.available()];
// 读取所有的字节到缓存中
for (int i = 0; i < contentBytes.length; i++) {
        contentBytes[i] = (byte) input.read();
        }
// 根据字节数组创建字符串
content = new String(contentBytes);
// 关闭流
input.close();

这样就将txt文件中的内容通过输入流存入到名为content的字符串中,可以利用java进行下一步操作。

 

但是输入流只解决了查看等问题,如果要利用java改变txt文档中的内容,并存储到原来的txt中,就要采用输出流。

4.输出流:

常用的有OutputStream类等。

以改变txt文档中的内容再将其存储到原来的文档中为例,步骤参考输入流如下:

//创建输出流
OutputStream output = new FileOutputStream(file);
//创建一个用来存储读取字符串数据的数组
byte[] contentBytes = new byte[content.getBytes().length];
//将存储在字符串里的数据存入字节数组
contentBytes = content.replaceAll("\n", "\r\n").getBytes();
//因为OutputStream中的写出方法只能接收字节类型或者整型数据
output.write(contentBytes);
//刷新输出流,写出所有还在缓存中的字节
output.flush();
//关闭流
output.close();

 

例如如何制作一个文件查找器:

1.设计并制作出一个界面,其中包括最基本的输入文件路径框、搜索按钮、显示查找到的文件列表框。

2.利用读取的输入文件路径,创建一个File类对象。再创建一个File类型的动态数组,准备将符合对象的所有文件存入其中用来输出。创建一个数组,将读取到的f文件对象下所有的文件列表存入其中。

List<File> files = new ArrayList<File>();
File f = new File(filePath);

File[] fl = f.listFiles();

3.将File对象进行判断是否存在、判断是文件夹还是文件等操作,如果是文件夹,则将该文件夹再次调用文件查找的方法FileSearch(String filePath)。将读取到的文件存入files动态数组中。

for (int i = 0; i < fl.length; i++) {
if (fl[i].isDirectory()) {
for (File child1 : FileSearch(fl[i].getAbsolutePath()))
{
files.add(child1);
                                  }
                         }
                 }
                 for
(File child1 : fl) {
                         files.add(child1);
                 }

4.在搜索结果框中输入得到的files动态数组中元素的绝对路径。

for (File child : FileSearch(fp)) {
        if
(flag == false) {
                 jtextarea.setText(child.getAbsolutePath());
        }
}

 

5.加入文件名搜索功能:

新增一个文本框用来输入文件名,将得到的文件名与fl中列举的文件名进行比较,符合要求的才加入到files动态数组中用来显示。

if (fl[i].getName().contains(fn) &&
!fn.equals("")) {
        files.add(fl[i]);
        }

 

6.加入点击结果列表中的文件就能打开的功能:

1.普通的JTextArea不支持点击返回点击选项的功能,所以要利用JList组件。JList中存入的数据为Vector类型,故需要一个Vector动态数组来存储得到的files动态数组。

Vector<String> list = new
Vector<String>();
                 for
(File child : FileSearch(fp)) {
                         list.addElement(child.getAbsolutePath());
                 }
        console.setListData(list);

 

打开选取的文件:利用监听器返回得到的显示在JList上的对象后,新建一个Desktop类用来打开选取的文件。使用open(文件名)的方法打开。

Desktop op = new Desktop();
op.open(filepath);

 

7.序列化与反序列化

什么是序列化?

一个对象产生之后实际上是在内存上开辟一个存储空间,方便存储信息。对象序列化,就是把对象变成二进制数据流的一种方法,方便保存和传输。

一个对象想被序列化,就需要继承Serialiazable接口。

Serialiazable接口没有任何方法,此接口是一个标识接口,标识具有某种能力。例如一个Person类的序列化标识:

import java.io.Serializable ;
public class Person implements
Serializable{
private static final long serialVersionUID
= 1L;       //版本声明
        private
String name ;      // 声明name属性,但是此属性不被序列化
        private
int age ;               // 声明age属性
        public
Person(String name,int age){       // 通过构造设置内容
                 this.name
= name ;
                 this.age
= age ;
        }
        public
String toString(){  // 覆写toString()方法
                 return
"姓名:" + this.name + ";年龄:" + this.age
;
        }
};

以后此对象就能被序列化为二进制的btye流。

 

ObjectOutputStream序列化对象

传入输出对象:ObjectOutputStream(ObjectStream o)

输出对象:writeObject(Object o)

public class SerDemo01{
        public
static void main(String args[]) throws Exception {
                 File
f = new File("D:" + File.separator + "test.txt") ;        // 定义保存路径
                 ObjectOutputStream
oos = null ;    // 声明对象输出流
                 OutputStream
out = new FileOutputStream(f) ;    // 文件输出流
                 oos
= new ObjectOutputStream(out) ;
                 oos.writeObject(new
Person("张三",30)) ;     // 保存对象
                 oos.close()
;     // 关闭
        }
};

ObjectInputStream反序列化对象

构造输入对象:ObjectInputStream(ObjectStream o)

从指定位置读取对象:

readObject()
public class SerDemo02{
        public
static void main(String args[]) throws Exception {
                 File
f = new File(“地址”) ;       // 定义保存路径
                 ObjectInputStream
ois = null ;        // 声明对象输入流
                 InputStream
input = new FileInputStream(f) ;        //
文件输入流
                 ois
= new ObjectInputStream(input) ;    // 实例化对象输入流
                 Object
obj = ois.readObject() ;        // 读取对象
                 ois.close()
;      // 关闭
                 System.out.println(obj)
;
        }
};

序列化一组对象最好使用数组接收

public class SerDemo05{
        public
static void main(String args[]) throws Exception{
                 Person
per[] = {new Person("张三",30),new Person("李四",31),
                         new
Person("王五",32)} ;
                 ser(per)
;
                 Object
o[] = (Object[])dser() ;
                 for(int
i=0;i<o.length;i++){
                         Person
p = (Person)o[i] ;
                         System.out.println(p)
;
                 }
        }
        public
static void ser(Object obj[]) throws Exception {
                 File
f = new File("D:" + File.separator + "test.txt") ;        // 定义保存路径
                 ObjectOutputStream
oos = null ;    // 声明对象输出流
                 OutputStream
out = new FileOutputStream(f) ;    // 文件输出流
                 oos
= new ObjectOutputStream(out) ;
                 oos.writeObject(obj)
;     // 保存对象
                 oos.close()
;     // 关闭
        }
        public
static Object[] dser() throws Exception {
                 File
f = new File("D:" + File.separator + "test.txt") ;        // 定义保存路径
                 ObjectInputStream
ois = null ;        // 声明对象输入流
                 InputStream
input = new FileInputStream(f) ;        //
文件输入流
                 ois
= new ObjectInputStream(input) ;    // 实例化对象输入流
                 Object
obj[] = (Object[])ois.readObject() ;      //
读取对象
                 ois.close()
;      // 关闭
                 return
obj ;
        }
};