-
流概述
- 流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流两种
- I/O(Input/Output)流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地
- I/O流经常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口等
-
输入输出流
输入流概念
1.InputStream类是字节输入流的抽象类,是所有字节输入流的父类
2.InputStream类中所有方法遇到错误时都会引发IOException异常
3.Java中的字符是Unicode编码,是双字节的
4.InputStream是用来处理字节的,在处理字符文本时不是很方便。Java为字符文本的输入提供了专门一套单独的类Reader,但Reader类并不是InputStream类的替换者,只是在处理字符串时简化了编程
5.Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类
输出流概念
1.OutputStream类是字节输入流的抽象类,此抽象类是表示输出字节流的所有类的超类
2.OutputStream类中的所有方法均返回void,在遇到错误时会引发IOException异常
3.常用的操作方法
3.Writer类是字符输出流的抽象类,你会吗所有字符输出类的实现都是它的子类
-
File类
- 文件的创建与删除
可以使用File类创建一个文件对象,通常使用以下3种构造方法来创建文件对象
- File(String pathname)
- File(String parent , String child)
- File(File f , String child)
- 获取文件信息
package com.liu.java;
import java.io.File;
public class FileTest {
//主方法
public static void main(String[] args){
//创建文件对象
File file = new File("word.txt");
//如果该文件存在
if(file.exists()){
//将文件删除
file.delete();
//输出的提示信息
System.out.println("文件已删除");
}else{
//如果文件不存在
try{
//try语句块捕捉可能出现的异常
//创建该文件文件
file.createNewFile();
System.out.println("文件以创建");
System.out.println("文件修改的最后时间:"+file.lastModified());
System.out.println("获取文件的名称"+file.getName());
System.out.println("获取文件的长度(单位:字节):"+file.length());
System.out.println("获取文件的绝对路径:"+file.getAbsolutePath());
boolean hidden = file.isHidden(); // 判断文件是否是隐藏文件
System.out.println("是否隐藏文件夹:" + hidden);
}catch(Exception e){//处理该异常
//输出异常信息
e.printStackTrace();
}
}
}
public void setDefaultCloseOperation(int exitOnClose) {
// TODO Auto-generated method stub
}
}
-
文件的输入输出流
1、FileInputStream与FileOutputStream类
- FileInputStream类与FileOutputStream类都是用来操作磁盘文件
- 如果用户的文件读取需求比较简单,则可以使用FileInputStream类。该类继承自InputStream类
- FileOutputStream类与FileInputStream类对应,提供了基本的文件写入能力
- FileOutputStream类是OutoputStream类的子类
2、FileReader类和FileWriter类
- 使用FileOutputStream类向文件中写入数据
- 使用FileInputStream类从文件中将内容读出来
- 不足:即这两个类都只提供了对字节或字节数组的读取方法
- 汉字在文件中占用两个字节,如果使用字节流,读取不好可能会出现乱码现象用字符流Reader或Writer类可避免
- FileReader、FileWriter字符流对应了FileInputStream、FileOutputStream类
- FileReader流顺序地读取文件,只要不关闭流,每次调用read()方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭
package com.liu.java;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileTest01 {
//主方法
public static void main(String[] args){
File file = new File("word.txt");//创建一个文件对象
//捕捉异常
try{
FileOutputStream out = new FileOutputStream(file);//创建文件输出对象
byte buy[] ="日照香炉生紫烟。".getBytes();//创建byte(字节)型的数组
out.write(buy);//将buy写入文件
out.close(); //将流关闭
}catch(Exception e){//catch语句处理异常
e.printStackTrace();
}
try{
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();
}
}
}
-
带缓存的输入输出流
1、BufferedInputStream类与BufferedOutputStream类
- BufferedInputStream类可以对任何的InputStream类进行带缓存区的包装以达到性能的优化。
- 使用BufferedOutputStream输出信息和往OutputStream输出信息完全一样,只不过BufferedOutputStream有一个flush()方法用来将缓存区的数据强制输出完。
2、BufferedReader与BufferedWriter类
- BufferedReader类与BufferedWriter类分别继承Reader类与Writer类。这两个类同样具有内部缓存机制,并可以以行为单位进行输入输出。
- 在使用BufferedWriter类的Write()方法时,数据并没有立刻被写入至输出流中,而是首先进入缓存区中。如果想立刻将缓存区中的数据写入输出流中,一定要调用flush()方法
package com.liu.java;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class fileTest03{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();
}
}
}
-
数据输入输出流
- 数据输入输出流(DataInputStream类与DataOutputStream类)
- 当读取一个数据时,不必再关心这个数值应当是什么字节
- DataInputStream类只提供了一个readUTF()方法返回字符串。这是因为要在一个连续的字节流读取一个字符串,如果没有特殊的标记作为一个字符串的结尾,并且事先也不知道这个字符串的长度,也就无法知道读取到什么位置才是这个字符串的结束
- DataOutputStream类中只有writeUTF()方法向目标设备中写入字符串的长度,所以我们也只能准确地读回写入字符串
package com.liu.java;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class fileTest04 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// 创建FileOutputStream对象
FileOutputStream fs = new FileOutputStream("word.txt");
// 创建DataOutputStream对象
DataOutputStream ds = new DataOutputStream(fs);
ds.writeUTF("使用writeUFT()方法写入数据;"); // 写入磁盘文件数据
ds.writeChars("使用writeChars()方法写入数据;");
ds.writeBytes("使用writeBytes()方法写入数据.");
ds.close(); // 将流关闭
// 创建FileInputStream对象
FileInputStream fis = new FileInputStream("word.txt");
// 创建DataInputStream对象
DataInputStream dis = new DataInputStream(fis);
System.out.print(dis.readUTF()); // 将文件数据输出
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
}
}
-
zip压缩输入输出流
1、压缩文件
- 利用ZipOutputStream类对象,可将文件压缩为“.zip”文件。
- ZipOutputStream类的构造函数
ZipOutputStream(OutputStream out);
ZipOutputStream
类的常用方法如下表所示:
2、解压缩ZIP文件
- ZipInputStream类可读取ZIP压缩格式的文件,包括对已压缩和未压缩条目的支持(entry)
- ZipInputStream类的构造函数
ZipInputStream(InputStream in)
ZipInputStream类的常用方法如下表所示
package com.liu.java;
import java.io.File;
import java.io.FileInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class fileTest05 {
public static void main(String[] temp) {
ZipInputStream zin; // 创建ZipInputStream对象
try { // try语句捕获可能发生的异常
zin = new ZipInputStream(new FileInputStream("project.zip"));
// 实例化对象,指明要进行解压的文件
ZipEntry entry = zin.getNextEntry(); // 获取下一个ZipEntry
while (((entry = zin.getNextEntry()) != null)
&& !entry.isDirectory()) {
// 如果entry不为空,并不在同一目录下
File file = new File("D:\\" + entry.getName()); // 获取文件目录
System.out.println(file);
if (!file.exists()) { // 如果该文件不存在
file.mkdirs();// 创建文件所在文件夹
file.createNewFile(); // 创建文件
}
zin.closeEntry(); // 关闭当前entry
System.out.println(entry.getName() + "解压成功");
}
zin.close(); // 关闭流
} catch (Exception e) {
e.printStackTrace();
}
}
}