Java IO流

来源:互联网 发布:易观的数据来源 编辑:程序博客网 时间:2024/06/02 00:22

Java IO

理解Java I/O 系统

熟练使用java.io包下的相关类与接口进行I/O编程。

掌握Java I/O设计原则与使用模式

 

File

File表示文件或目录。可以这么理解File既可以表示文件也可以表示目录,千万别理解成文件就是目录,文件和目录是有区别的。

File类是在java.io包中唯一与文件本身有关的。

其实文件是操作系统中操作数据的最小单元体。

Linux系统分隔符为 / ;window的分隔符为 \。开发的时候最好使用File.separator()表示。

File常用方法:

1.创建文件方法 boolean createNewFile();

2.创建目录: boolean mkdir()boolean mkdirs();

3.判断是否为一个文件或目录:boolean isFile()isDirection()

4.判断文件或目录是否存在:boolean exist()

5.获得文件长度:long length()

6.获得目录下的文件列表:File[]  listFiles()

7.操作父类相关的方法:File getParentFile()String getParent()

 

练习:使用递归的方法列出某个目录下的所有文件(包括子文件夹下面的文件)

备注:递归没有十足的把握就尽量少用,控制不好递归出口的话就会出现内存溢出的危险。

File是使用流操作的入口,相当于反射时候首先第一步是先获得clazz对象。

流操作

程序中所有数据都是以流的方式进行传输或保存的,程序需要数据的时候就使用输入流读取数据,而当程序需要将数据保存到硬盘的话我们就需要使用到输出流。

程序中的输入输出都是以流的方式保存,流中保存的实际上都是字节文件。

java.io包中操作文件内容的主要有两大类:字节流、字符流。字节流能够操作所有类型的数据。字符流只是设计来为操作字符数据的。最核心的四个抽象类:InputStreamOutputStreamReaderWriter

数据流操作流程:

1.使用File类打开一个文件

2.通过字节流或字符流的子类,指定输出位置

3.进行读写操作

4.关闭流资源

备注:只要是资源的操作就一定要记得关闭。例如:IO、数据库连接资源。

 

Java流分类:

流向分:(内存为参照)

输入流:简单理解就是从硬盘读取数据到程序

输出流:简单理解就是从程序写出数据到硬盘

传输单位分:

字节流:以字节为单位传输数据的流

字符流:以字符为单位传输数据的流

功能分:(装饰模式)

节点流:用于直接操作目标设备的流

过滤流:是对一个已经存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。

 

备注:想要学好Java IO操作需要掌握两点面向对象、装饰设计模式。

备注:在最底层,所有的输入/输出都是以字节形式传输的。字符流只是为了处理字符提供更方便有效的方法。

 

读数据逻辑:

1.open a stream开启一个数据流

2.while more information如果有更多信息

3.read information读取信息

4.close the stream关闭流操作

 

写数据的逻辑:

1.open a stream开启一个数据流

2.while more information如果有更多信息

3.write information写出信息

4.close the stream关闭数据流

 

 

字节流读取数据:(标准操作字节流读取操作)

//定义缓存大小

byte[] buffer=new byte[100];

Integer len=0;//定义一个读取字节长度

//当输入流还能读取字节的时候,就继续往下读。

while((len=in.read(buffer))!=-1){

System.out.print(new String(buffer,0,len));

}

/关闭流操作

in.close();

 

字节流写入数据:(标准操作字节流写入操作)

 

//获得字节输出流

OutputStream out=new FileOutputStream(file);

//要输出的数据

String string="hello world!你好世界。中国 hello china.";

//获得要输出数据的对应字节数组

byte[] bytes=string.getBytes();

//输出字节

out.write(bytes);

 

 

IO流的关系图

 

 

 

 

IO流体系

 

 

分析装饰设计模式在Java io设计中的体现

 

JAVA IO设计中大量使用的装饰设计模式、以及体现了大量面向对象的思想。

Component:顶层组件接口------>InputSteam(抽象类)

ConcreteComponent:顶层接口的实现------>FileInputStream(实现了InputStream抽象类的具体类)

Decorator:顶层装饰类(抽象类也可以)------>FilterInputStream(含有顶层抽象类(InputStream)的引用)

ConcreteDecoratorA:继承顶层装饰类(增加自己的附加功能A)------>BufferInputStream(含有顶层抽象类(InputStream)的引用)

ConcreteDecoratorB:继承顶层装饰类(增加自己的附加功能B)------>DataInputStream(含有顶层抽象类(InputStream)的引用)

 

 

备注:其实IO中的FilterInputStream(节点流就相当于这里的Decorator装饰类)

备注:掌握好装饰设计模式、以及面向对象思想,那么IO就很简单了。

流的总结:

InputStreamOutputStream:字节流的输入输出

ReaderWriter:字符流的输入和输出

流的链接:(Java I/O流的设计原则)

 

对象序列化

将对象转换为字节流保存起来,并在以后还原这个对象,这种机制叫对象序列化。

将一个对象保存到永久存储设备上称为持久化。

一个对象想要能够实现序列化,必须实现Serializable接口(表示性接口,里面没有定义任何方法)Externalizable接口

对象序列化:是为了将对象以字节形式保存到文件中

对象反序列化:是为了程序将文件中的字节流转换为对象。

 

当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态成员变量。如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。

声明为transientstatic的变量不被序列化工具存储。

 

ObjectInputStreamObjectOutputStream操作对象的流

备注:控制台输入两种方法

Scanner scanner = new Scanner(System.in); JDK1.5之后出现在java.util包中

BufferedReader scanner=new BufferedReader(new InputStreamReader(System.in));JDK1.5之前

0 0
原创粉丝点击