流是一组有序的数据序列,根据操作类型分为输入流和输出流
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类的层次结构
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jNyUjM1gDN3EDMyETM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
2.输出流
OutputStream类:
方法 | 功能 |
write(int b) | 将指定的字节写入此输出流 |
write(byte[] b) | 将b个字节从指定的byte数组写入此输出流 |
write(byte[] b,int off,int len) | 指定数值byte从偏移量off开始的len个字节写入此输出流 |
flush() | 彻底完成输出并清空缓存区 |
close() | 关闭输出流 |
Write类是字符输出流的抽象类
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压缩输入/输出流