技术文章-java中的IO流
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术文章-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流的主要内容,如果未能解决你的问题,请参考以下文章