技术文章-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 ;

}

};

时间: 2024-07-29 10:18:01

技术文章-java中的IO流的相关文章

Java中的IO流之输入流|乐字节

亲爱的乐字节的小伙伴们,小乐又来分享Java技术文章了.上一篇写到了IO流,这篇文章着重 谈谈输入流,再下次再说输出流. 点击回顾上一篇:乐字节Java之file.IO流基础知识和操作步骤 一. 输入流 字节流和字符流的操作方式几乎完全一样,只是操作的数据单元不同而已 .字节流可 以操作所有文件,字符流仅操作纯文本. 1.抽象类:InputStream 和 Reader InputStream和Reader是所有输入流的基类,它们是两个抽象类,是所有输入流的模版,其中定义的方法在所有输入流中都可

Java中的IO流

Java中的IO流是实现输入/输出的基础. 按照流的方向不同:分为输入流和输出流. 按照处理数据单位的不同:分为字节流(8位)和字符流(16位). 按照功能不同:分为节点流和处理流 所有面向字节的流类都继承于InputStream类(输入流) 或OutputStream类(输出流),这两个类是抽象类,我们可以利用它的子类来完成不同的功能. InputStream.OutputStream都是抽象类 InputStream抽象了应用程序读取数据的方式 OutputStream抽象类应用程序写出数据

JAVA 中的IO流

Java中的IO流是用来处理设备与设备之前的数据传输,在java中以流的形式传输.流分为两类:字节流和字符流. 字节流:InputStream,OutPutSteam.(计算机内的数据都是以字节存储的,字节流可以操作任意数据) 字符流:Reader,Writer.(字符流只能操作字符,但是在实际应用中字符流比较方便) 从操作来看又可以分为:输入流和输出流. 在进行IO流操作的时候分为以下几步:1.导入IO流的包,2.进行IO流的异常处理,3.关闭IO流释放资源. 字节流 ————————————

Java中的IO流总结

Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和BufferedOutputStream.以及对应的FileOutputWriter,FileInputReader,BufferedInputReader,BufferedOutputWriter. 3. 转换流InputStreamReader和OutputStreamWriter 一:流的继承关系 字节

Java中的IO流体系

Java为我们提供了多种多样的IO流,我们可以根据不同的功能及性能要求挑选合适的IO流,如图10-7所示,为Java中IO流类的体系. 注:这里只列出常用的类,详情可以参考JDK API文档.粗体标注为常用! 图10-7 Java中的IO流体系 从上图发现,很多流都是成对出现的,比如:FileInputStream/FileOutputStream,显然是对文件做输入和输出操作的.我们下面简单做个总结: 1. InputStream/OutputStream 字节流的抽象类. 2. Reader

Java中的IO流(五)

上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式.并且此注永远不会抛出IOException. 此流的构造函数大致分三类 1,接收File文件类型的 2,接收OutputStream类型的 3,接收文件名形式的 下演示一下此流的两个方法 1 private static void functio

整理 JAVA中的IO流 (字符流和字节流两个大类)

java中的io流分为两类,字符和字节: OutputStream和InputStream字节流的父类,抽象.OutputStream有两个提供了实现的接口closable和flushable. Writer和Reader字符流的父类,抽象.实际上在流的操作中,底层与文件进行读写的都是字节流,因为即使是字符流的对象,其最终实现读写的也是用的字节流. 操作文件的字节子类FileOutputStream和FileInputStream.记住,这里面写出和读入的都是字节. class useByteS

三、JAVA中的IO流,输出流

JAVA中java.io.*;提供数据的流式输入与输出的相关类,IO流是对于输入与输出的抽象,JAVA把这些不同来源和目标的数据都统一抽象为数据流.将输入与输出的数据统一为流的好处是程序不必关心要读取得是文件,还是网络中的数据,而是统一当作IO流来处理. IO流又分为字符流与字节流,主要区别 字节流 按字节处理(一次处理一个字节) 使用类OutputStream 字符流 按字符处理(一次处理一个字符即两个字节) 使用类Writer 其实字节流与字符流处理十分相似(即每次处理的单位不同),好多书上

Java中的IO流系统详解

Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换.而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换.字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高