JAVA的IO
JAVA的IO
一、概述
- 输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
- 输出:将程序(内存)数据输出到磁盘、光盘等存储设备中
- Java的IO流主要包括输入、输出两种IO流,每种输入、输出流有可分为字节流和字符流两大类:
-字节流以字节为单位来处理输入、输出操作
-字符流以字符为单位来处理输入、输出操作
1、File类
- File类代表与平台无关的文件和目录。
- File能新建、删除、重命名文件和目录,但File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
File:代表物理的意义的文件或目录
public void testFile(){
//1.创建File对象
File file = new File("Hello.txt");
//2.测试File对象的方法。
//2.1文件名相关的方法
String fileName = file.getName();
System.out.println(fileName);
//2.2访问文件的绝对路径
String path = file.getAbsolutePath();
System.out.println(path);
}
IO流的分类
- 按流向分:
-输入流
-输出流 - 按处理的单位:
-字节流(8位的字节)
-字符流(16位的字节) - 按流的角色
-节点流:可以从一个特定的IO设备读/写数据的流
-处理流:对一个已存在的流进行连接和封装,通过封装后的流来实现数据读/写操作
IO流体系
InputStream & Reader
- InputStream 和Reader 是所有输入流的基类。
- InputStream (典型实现:FileInputStream):
-int read()
-int read(byte[] b)
-int read (byte[] b,int off,int len) - Reader (典型实现FileReader)
-int read()
-int read (char[] c )
-int read (char[] c,int off,int len) - 程序中打开的文件IO资源不属于内存里的资源呢,垃圾回收机制无法回收该资源,所以应该显示关闭文件IO资源。
public void testInutStream(){
//创建了一个字节输入流。
InputStream in = new FileInputStream(hello.txt);
byte[] buffer = new byte[10];
int len = 0;
//返回一次实际读取的字节数,若为-1表示读取到文件的结尾
while((len = in.reader(buffer))!=-1){
for(int i = 0 ; i < len ; i++){
System.out.println((char)buffer[i]);
}
}
in.close();
}
OutputStream & Writer
- OutputStream 和Writer 也非常相似:
-void write(byte write/int c)
-void (char[] buff)
-void write(byte[]/char[] buff , int off , int len); - 因为字符流直接以字符作为操作单位,所以Write可以用字符串来替换字符数组,即以String对象作为参数
-void write(String str);
-void write(String str, int off , int len )
对象的序列化
- 对象序列化的目标是将对象保存到磁盘上,或允许在网络中直接传输对象。
- 系列化是RMI(Remote Method Invoke - 远程方法调用)过程的参数和返回值都必须实现的机制,而RMI是JavaEE的基础。因此序列化机制是JavaEE平台的基础。
- 如果需要让某个对象支持序列化机制,则必须让的类是可序列化的,为了让某个类是可序列化的, 该类必须实现如下两个接口之一:
-Serializable
-Externalizable
用缓冲流对文件的copy
public void testBufferedReaderAndBufferedWriter(){
//创建BufferedReader 和 BufferedWriter
Reader reader = new FileReader("hello.txt");
BufferedReader bufferedreader = new BufferdReader(reader);
Writer out = new FileWriter("hello4.txt");
BufferedWriter bufferedWriter = new BufferedWriter(out);
String str = null;
int i = 0;
while((str = bufferedreader.readLine()) != null){
if(i != 0){
bufferedwriter.write("\n");
}
bufferedwrite.write(str);
i++:
}
bufferedreader .close();
reader.close();
bufferedWriter.lose();
out.close();
}
使用对象流序列化对象
- 若某个类实现了Serializable 接口,该类的对象就是可序列化的:
-创建一个ObjectOutputSream
-调用ObjectOutputStream 对象的writeObject()方法输出可序列化对象 - 反序列化
-创建一个ObjectInputStream
-调用readObject()方法读取六种的对象 - 如果某各类的字段不是基本数据类型或String类型,而是另一个引用类型,那么这个引用类型必须是可序列化阿德,否则拥有该类型的Field的类特不能序列化
RandomAccessFile类
- RandomAccessFile类既可以读取文件内容,也可以项文件输出数据。
- RandomAccessFile类支持“随机访问 ”的方式,程序可以直接跳到文件ad额任意地方来读写文件
-支持只访问文件的部分内容
-可以向已存在的文件后追加内容 - RandomAccessFile对象包含一个记录指针,用以表示当前读写处的位置。RandomAccessFile类对象可以自由移动记录指针:
-long getFilePointer():获取文件记录指针的当前位置
-void seek(long pos):将文件记录指针定位到pos位置 - 创建RandomAccessFile类可以指定一个mode参数,该参数指定RandomAccessFile的访问模式:
-r:以只读方式打开
-rw:以读、写方式打开 - 创建RandomAccessFile类可以指定一个mode参数,该参数指定RandomAccessFile的访问模式:
-r:以只读方式打开
-rw:以读、写方式打开