IO流用来处理设备之间的数据传输,Java程序中,对于数据的输入/输出操作 都是以“流”的方式进行的。java.io包下提供了各种“流”类的接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
一、File类
1、文件的创建与删除
可以使用File类创建一个文件对象,三种构造方法的语法格式如下:
new File(String pathname) //pathname是路径名称
new File(String parent, String child) //parent是父路径字符串,
new File(File f, String child) //f是父路径对象,child是子路径字符串
例:
File file = new File("E:/test.txt");
File file = new File("E:/myword","word.txt");
如果不存在文件,File类对象可通过createNewFile()
方法创建的文件;如果存在文件,可通过delete()
方法将其删除。
2、获取文件信息
常用的方法:
方法 | 说明 |
---|---|
getName() |
获取文件的名称 |
canRead() |
判断文件是否可读 |
canWrite() |
判断文件是否可以被写入 |
exist() |
判断文件是否存在 |
length() |
获取文件的长度 |
getAbsolutePath() |
获取文件的绝对路径 |
getParent() |
获取文件的父路径 |
isFile() |
判断文件是否存在 |
isDirectory() |
判断文件是否是一个目录 |
isHidden() |
判断文件是否是隐藏文件 |
lastModifed() |
获取文件最后修改时间 |
例:
public class Demo04File {
public static void main(String[] args) {
File file = new File("E:/myword", "word.txt"); // 创建文件对象
if(file.exists()) { // 判断文件是否存在
String name = file.getName(); // 获取文件名称
long length = file.length(); // 获取文件长度
boolean hidden = file.isHidden(); // 判断文件是否是隐藏文件
System.out.println("文件名称:" + name);
System.out.println("文件长度是:" + length);
System.out.println("是否是隐藏文件:" + hidden);
} else {
System.out.println("文件不存在");
}
}
}
二、输入/输出流
流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流。
-
而专门负责各种方式的输入、输出的类,都被放在java.io包中。
-
所有输入流都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;
-
所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。
如图所示:
1、字节输入/输出流
所有字节输入/输出流的分别都是InputStream
(输入流)以及OutputStream
(输出流)的抽象类。其中InputStream
负责读取数据;OutputStream
负责写入数据。
代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class Demo01 {
public static void main(String[] args) {
File file = new File("E:\\test.txt"); //创建文件对象
try { //捕捉异常
FileOutputStream out = new FileOutputStream(file); //创建FileOutputStream对象
byte[] buy = "你好,java".getBytes(); //创建byte型数组
out.write(buy); //将数组的信息写入到文件中
out.close(); //将输出流关闭
} catch (Exception e) { //catch语句处理异常信息
e.printStackTrace(); //输出异常信息
}
try {
FileInputStream in = new FileInputStream(file); //创建FileInputStream对象
byte byt[] = new byte[1024]; //创建byte型数组
int len = in.read(byt); //从文件中读取信息
String str = new String(byt,0,len); //创建str对象获取文件信息
System.out.println("文件信息是:" + str); //输出文件信息
in.close(); //关闭输入流
}catch (Exception e){
e.printStackTrace();
}
}
}
注意:InputStream
类常用方法需了解read()、close()、reset()等方法;OutputStream
类常用方法需了解write()、flush()、close()等方法。具体可参照API。
2、字符输入/输出流
所有字节输入/输出流的分别都是Reader
(输入流)类以及Writer
(输出流)类的抽象类。其中Reader
负责读取数据;Writer
负责写入数据。
代码如下:
import java.io.*;
public class Demo02 {
public static void main(String[] args) {
File file = new File("E:\\test.txt"); //创建文件对象
try{ //抛出异常
FileWriter fileWriter = new FileWriter(file); //创建字符输出流对象fileWriter
String cr = "我想学Java";
fileWriter.write(cr); //向文件写入信息
fileWriter.close(); //关闭输出流
}catch (Exception e){
e.printStackTrace();
}
try {
FileReader fileReader = new FileReader(file); //创建字符输入流对象fileReader
char[] ca = new char[1024]; //创建byte型数组
int len = fileReader.read(ca); //从文件中读取信息,获取长度
String str = new String(ca,0,len); //创建str对象获取文件信息,获取内容
System.out.println(str); //输出文件信息
fileReader.close(); //关闭输入流
}catch (Exception e){
e.printStackTrace();
}
}
}
三、带缓存的输入/输出流
缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区。
1. BufferedInputStream类与BufferedOutputStream类
构造函数如下:
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)
BufferedOutputStream(OutputStream in)
BufferedOutputStream(OutputStream in, int size)
2. BufferedReader类与BufferedWriter类
常用方法如下:
方法 | 说明 |
---|---|
read() | 读取单个字符 |
readLine() | 读取一个文本行,返回为字符串;若无数据则返回为null |
write(String s, int off, int len) | 写入字符串的某一部分 |
flush() | 刷新该流的缓存 |
newLine() | 写入一个行分隔符 |
例:
import java.io.*;
public class Demo03 {
public static void main(String[] args) {
String content[] = {"你好!","再见"};
File file = new File("E:\\test.txt"); //创建文件对象
try {
FileWriter fileWriter = new FileWriter(file); //创建FileWriter对象
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); //创建BufferedWriter类对象
for (int i = 0; i < content.length; i++) { //循环遍历数组
bufferedWriter.write(content[i]); //将字符串数组中的元素写入到磁盘文件中
bufferedWriter.newLine(); //将数组中的单个元素以单行的形式写入文件
}
bufferedWriter.close(); //关闭BufferedWriter流
fileWriter.close(); //关闭FileWriter流
}catch (Exception e){ //异常处理
e.printStackTrace();
}
try {
FileReader fileReader = new FileReader(file); //创建FileReader对象
BufferedReader bufferedReader = new BufferedReader(fileReader); //创建BufferedReader类对象
String str = null; //创建字符串对象
int i = 0; //声明int变量
//如果文件的文本行数不为null,则进入循环
while ((str = bufferedReader.readLine()) != null){
i++; //做自增运算
System.out.println("第" + i + "行" + str); //输出文件数据
}
bufferedReader.close(); //关闭BufferedReader流
fileReader.close(); //关闭FileReader流
}catch (Exception e){ //异常处理
e.printStackTrace();
}
}
}
运行结果:
第1行你好!
第2行再见
注意:在使用BufferedWriter
类的write()方法时,数据并没有立刻被写入到输出流时,而是首先进入缓存区中,如果想立刻将缓冲区中的数据写入输出流中,一定要调用flush()方法。
四、数据输入/输出流
数据输入/输出流为DataInputStream
类与DateOutputStream
类,允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型。
构造方法如下:
DataInputStream(InputStream in)
DataOutputStream(OutputStream out)
DataOutputStream
类提供了以下三种写入字符串的方法:
writeBytes(String s)
writeChars(String s)
writeUTF(String s)
五、ZIP压缩输入/输出流
利用ZipOutputStream类对象,可将文件压缩为.zip文件。
构造方法如下:
ZipOutputStream(OutputStream out);
ZipInputStream类可读取ZIP压缩格式的文件,包括对已压缩和未压缩条目的支持。
构造函数如下:
ZipInputStream(InputStream out);