您的位置:首页 > 编程语言 > Java开发

Java的IO基础学习

2014-09-03 17:22 405 查看
1、Java.io.File类的使用

IO原理及流的分类:

文件流:(重点)

FileInputStream/FileOutputStream/FileReader/FileWriter

缓冲流:(重点)

BufferedInputStream/BufferedOutputStream/BufferedReader/BufferedWriter

转换流:

InputStreamReader/OutputStreamWriter

标准输入/输出流:

打印流:

PrintStream/PrintWriter

数据流:

DataInputStream/DataOutputStream

对象流 -- 涉及序列化、反序列化 (重点)

ObjectInputStream/ObjectOutputStream

随机存取文件流 (重点) 既能存又能取

RandomAccessFile

2、java.io.File类

1、凡是与输入、输出相关的类、接口等都定义在java.io包下

2、File是一个类,可以有构造器创建对象,此对象对应着一个文件(.txt .avi .doc .ppt .jpg)或文件目录

3、File类的对象是与平台无关的。

4、File中的方法,仅涉及发到如何让创建、删除、重命名等等(主要是涉及文件内容的,File是无能为力的,必须由io流来完成)

5、File类的对象常作为io流的具体类的构造器的形参。

file1.renameTo(file2):file1重命名为file2.要求:file1文件一定存在,file2一定不存在(要保证都是文件或者都是文件目录)

mkDir():创建一个文件目录,只有上层文件目录存在的情况下,才能返回true

mkDirs():创建一个文件目录,若上层文件目录不存在,一并创建

list():返回文件夹下的文件字符串数组

listFiles();返回文件夹下的File数组

3、路径:

① 相对路径:包括盘符在内的完整路径

②相对路径:在当前文件目录下的文件的路径

4、流的分类:

按照数据流向的不同:输入流、输出流

按照处理数据的单位不同:字节流、字符流(处理的文本文件)

按照角色的不同:节点流(直接作用于文件的)、处理流

5、IO的体系:

抽象基类 节点流(文件流) 缓冲流(处理流的一种,可以提升文件的传输效率)

InputStream FileInputStream BufferedInputStream

OutputStream FileOutputStream BufferedOutputStream(bos.flush())

Reader FileReader BufferedReader(br.line())

Writer FileWriter BufferedWriter(bw.flush())

注:word文件中包含图片等,不是纯粹的文本文件,所以应使用字节流

6、转换流:

转换流提供了在字节流和字符流之间的转换

Java API提供了两个转换流:

InputStreamReader (解码:字节数组--》字符串) 和 OutputStreamWriter (编码:字符串--》字节数组)

字节流中的数据都是字符时,转换成字符流操作更高效

7、打印流(都是输出流):PrintStream PrintWriter

可是使用System.setOut(PrintStream p) 重新设置一下输出的位置

PrintStream p = new PrintStream(new FileOutputStream("hello.text"),true)

8、数据流:

为了方便地操作Java语言的基本数据类型的数据,可以使用数据流

数据流有两个类:(用于读取和写出基本数据类型的数据)

DataInputStream 和 DataOutputStream

分别 “套接” 在InputStream 和 OutputStream 节点流上

DataInputStream中的方法:

boolean readBoolean() byte readByte()

char readChar() float readFloat()

double readDouble() short readShort()

long readLong() int readInt()

String readUTF() void readFully(byte[] b)

DataOutputStream中的方法:

将上述的方法的read改为相应的write即可。

9、对象流:

ObjectInputStream 和 ObjectOutputStream

用于存储和读取对象的处理流。他的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。

序列化(Serialize):用ObjectOutputStream类将一个Java对象写入IO流中

反序列化(Deserialize):用ObjectInputStream类从IO流中恢复该Java对象

ObjectOutputStream 和 ObjectInputStream 不能序列化static和transient修饰的成员变量

如何创建流的对象:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("properties.text")))

ObjectInputStream ois = new ObjectInputStream(new FileInputStreamStream(new File("ss.text")))

10、对象的序列化 :

对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或者通过网络将这种二进制流传输到另一个网络节点。当其他程序获取了这种二进制流,就可以恢复成原来的Java对象。

序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可以被还原。

序列化是RMI(Remote Method Invoke - 远程方法调用)过程的参数和返回值都必须实现的机制,而RMI是javaEE的基础。因此序列化机制是JavaEE平台的基础。

如果需要让某个对象支持序列化机制,则必须让其他类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:

Serializable

Externalizable

凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:

private static final long serialVersionUID;

serialVersionUID用来表明类的不同版本间的兼容性

如果类没有显示定义这个静态变量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的源代码作了修改,serialVersionUID可能发生变化。故建议,显示声明

显示定义serialVersionUID的用途:

希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID

不希望类的不同版本对序列化兼容,因此需确保类的不同版本具有不同的serialVersionUID

要实现序列化的类:

1、要求此类是可序列化的,实现序列化接口Serializable

2、要求类的属性同样的要实现serializable接口

3、提供一个版本号

4、static和transient修饰的成员变量不能序列化(这个信息是加载不进去的)

11、RandomAccessFile:

RandomAccessFile类支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读、写文件

支持只访问文件的部分内容

可以向已存的文件后追加内容

RandomAccessFile对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile类对象可以自由移动记录指针:

long getFilePointer() : 获取文件记录指针的当前位置

void seek(long pos) : 将文件记录指针定位到pos位置

构造器:

public RandomAccessFile(File file,String mode)

public RandomAccessFile(String name,String mode)

创建RandomAccessFile类实例需要制定一个mode参数,该参数制定RandomAccessFile的访问模式:

r:以只读方式打开

rw:打开以便读取和写入

rwd:打开以便读取和写入:同步文件内容的更新

rws:打开以便读取和写入:同步文件内容和元数据的更新

RandomAccessFile:支持随机访问

1、既可以充当一个输入流,又可以充当输出流

2、支持从文件头读取、写入(实现的是覆盖)

3、支持从任意位置的读取、写入(插入:需要取出,再写入)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: