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:以读、写方式打开

猜你喜欢

转载自blog.csdn.net/qq_41918895/article/details/83548153