首页 > 代码库 > 技术文章-java中的IO流

技术文章-java中的IO流

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 ;

        }

};

技术文章-java中的IO流