天天看点

Java-I/O流(输入/输出)

流是一组有序的数据序列,根据操作类型分为输入流和输出流

java中定义许多类负责各种输入/输出流,这些类都放在java.io包中

所有的输入流类都是抽象类InputStream(字节输入流)和抽象类Reader(字符输入流)的子类

所有的输出流类都是抽象类OutputStream(字节输出流)和抽象类Writer(字符输出流)的子类

1.输入流

InputStream类:

方法 功能
read() 从输入流读取数据的下一个字节,返回0-255int值,无数据则返回-1
read(byte[] b) 从输入流读入一定长度的字节,以整数形式返回字节数
mark(int readlimit) 在输入流当前位置标记,readlimit为在标记失效前允许读取的字节数
reset() 将输入指针返回到当前所做的标记处
skip(long n) 跳过输入流上的n个字节,并返回实际跳过的字节数
markSupported() 如果当前流支持mark()/reset()操作就返回True
close() 关闭输入流并释放与该流关联的所有系统资源

Reader类:

InputStream是用来处理字节的,不适合处理字符文本,java为字符文本的输入专门提供了一套单独的Reader类

Reader类的层次结构

Java-I/O流(输入/输出)

2.输出流

OutputStream类:

方法 功能
write(int b) 将指定的字节写入此输出流
write(byte[] b) 将b个字节从指定的byte数组写入此输出流
write(byte[] b,int off,int len) 指定数值byte从偏移量off开始的len个字节写入此输出流
flush() 彻底完成输出并清空缓存区
close() 关闭输出流

Write类是字符输出流的抽象类

Java-I/O流(输入/输出)

3.File类

File类可以实现创建、删除、重命名文件等操作,File类的对象主要用来获取文件本身的一些信息,如文件所在的目录、文件的长度、文件读写权限等

①文件的创建和删除:

File file=new File(“d:/1.txt”);创建文件对象

file.delete();删除文件

file.createNewFile();创建该文件

②获取文件信息:

File类提供了很多方法获取文件本身的信息:

方法 返回值 说明
getName() String 获取文件的名称
canRead() boolean 判断文件是否可读
canWirte() boolean 判断文件是否可被写入
exits() boolean 判断文件是否存在
length() long 获取文件的长度(以字节为单位)
getAbsolutePath() String 获取文件的绝对路径
getParent() String 获取文件的父路径
isFile() boolean 判断文件是否存在
isDirectory() boolean 哦按段文件是否是一个目录
isHidden() boolean 判断文件是否是隐藏文件
lastModified() boolean 获取文件最后时间

4.文件输入/输出流:

当程序结束或关闭,数据将消失,如果需要将数据保存,可用文件输入/输出流与指定的文件建立连接,将需要的数据永久保存到文件中

①FileInputStream类与FileOutputStream类:

使用FileInputStream类向文件中写入数据,用FileOutputStream类从文件读取内容

不足:这两个类只提供对字节或数组的读取方法,读取汉字可能出现乱码

public class FileTest { // 创建类
	public static void main(String[] args) { // 主方法
		File file = new File("word.txt"); // 创建文件对象
		try { // 捕捉异常
			// 创建FileOutputStream对象
			FileOutputStream out = new FileOutputStream(file);
			// 创建byte型数组
			byte buy[] = "测试一下文件输入/输出流".getBytes();
			out.write(buy); // 将数组中信息写入到文件中
			out.close(); // 将流关闭
		} catch (Exception e) { // catch语句处理异常信息
			e.printStackTrace(); // 输出异常信息
		}
		try {
			// 创建FileInputStream类对象
			FileInputStream in = new FileInputStream(file);
			byte byt[] = new byte[1024]; // 创建byte数组
			int len = in.read(byt); // 从文件中读取信息
			// 将文件中信息输出
			System.out.println("文件中的信息是:" + new String(byt, 0, len));
			in.close(); // 关闭流
		} catch (Exception e) {
			e.printStackTrace(); // 输出异常信息
		}
	}
}
           

②FileReader类和FileWriter类:

可读取字符流

5.带缓存的输入/输出流:

①BufferedInputStream类

两种构造方法

BufferedInputStream(InputStream in) 创建了一个带有32位的缓存流
BufferedInputStream(InputStream in,int size) 按指定大小创建缓存区

②BufferedOutputStream类

两种构造方法

BufferedOutputStream(OutputStream in) 创建一个32个字节的缓存区
BufferedOutputStream(OutputStream in,int size) 按指定大小创建缓存区

③BufferedReader类:

常用方法

read() 读取单个字符
readLine() 读取一个文本行
write(String s,int off,int len) 写入字符串的一部分
flush() 刷新该流的缓存
newLine() 写入一个行分割符

④BufferedWriter类:

使用Write()方法时,数据没有立刻被写入到输出流,而是首先进入缓存区

import java.io.*;

public class Student { // 创建类
	public static void main(String args[]) { // 主方法
		// 定义字符串数组
		String content[] = { "好久不见", "最近好吗", "常联系" };
		File file = new File("word.txt"); // 创建文件对象
		try {
			FileWriter fw = new FileWriter(file); // 创建FileWriter类对象
			// 创建BufferedWriter类对象
			BufferedWriter bufw = new BufferedWriter(fw); 
			for (int k = 0; k < content.length; k++) { // 循环遍历数组
				bufw.write(content[k]); // 将字符串数组中元素写入到磁盘文件中
				bufw.newLine(); // 将数组中的单个元素以单行的形式写入文件
			}
			bufw.close(); // 将BufferedWriter流关闭
			fw.close(); // 将FileWriter流关闭
		} catch (Exception e) { // 处理异常
			e.printStackTrace();
		}
		try {
			FileReader fr = new FileReader(file); // 创建FileReader类对象
			// 创建BufferedReader类对象
			BufferedReader bufr = new BufferedReader(fr);
			String s = null; // 创建字符串对象
			int i = 0; // 声明int型变量
			// 如果文件的文本行数不为null,则进入循环
			while ((s = bufr.readLine()) != null) { 
				i++; // 将变量做自增运算
				System.out.println("第" + i + "行:" + s); // 输出文件数据
			}
			bufr.close(); // 将FileReader流关闭
			fr.close(); // 将FileReader流关闭
		} catch (Exception e) { // 处理异常
			e.printStackTrace();
		}
	}
}
           

这两个用的少,等用到了再总结:

6.数据输入/输出流

7.ZIP压缩输入/输出流