一.InputStream和OutputStream,Reader和Writer
InputStream类是字节输入流的抽象类,是所有字节输入流的父类。
部分方法;read(),read(byte[] b),mark(int readlimit),reset(),skip(long n),markSupport(),close();
OutputStream类是字节输出流的抽象类,是所有字节输出流的父类
部分方法:write(int b),write(byte[] b),write(byte[] b,int off,int len),flush();close();
Reader是字符输入流的抽象类,是所有字符输入流的父类
Writer是字符输出流的抽象类,是所有字符输出流的父类
二.File类
File类是java.io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操作文件,同时可以通过File类来获取文件本身的信息。文件可以是一个路径。
构造方法省略;
获取文件信息的办法:getname();canread&canwrite();isfile&isdirectory&ishidden();getabsolutepaht&getparent();
<span style="font-family:SimSun;font-size:18px;">import java.io.*;
public class FileTest { // 创建类
public static void main(String[] args) {
File file = new File("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("该文件不存在"); // 输出信息
}
}
}</span>
三.文件输入输出流
1.FileInputStream和FileOutputStream提供简单的文件操作,仅提供简单的文件输入输出,可以通过文件路径或者File创建。
2.FileReader和FileWriter一般用于有汉字存在的情况下(双字节)。只要不关闭流,可一通过不断调用read()提取文件内容。
<span style="font-family:SimSun;font-size:18px;">import java.io.*;
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(); // 输出异常信息
}
}
}</span>
四.带缓存的输入输出流
缓存是对文件操作的优化,缓存流提供了定位操作。
1.BufferedInputStream和BufferedOutputStream,可以通过输入输出流为参数来创建,默认32字节的缓冲区,也可以自己定义。
2.BufferedReader和BufferedWriter,可以通过文件类为参数来哦创建(注意字符流可以读取一行)。
<span style="font-family:SimSun;font-size:18px;">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();
}
}
}</span>
五.输出输入输出流
DateInputSream和DateOutStream允许应用程序用与机器无关的方式从底层输入流中读取基本Java数据类型。
以输入流和输出流为参数创建
三种写入方法:writeBytes(String s),writeChars(String s),writeUTF(String s).
补充:UTP编码对于字符串的操作很方便,可以通过readUT获得UTP方式写入的字符串,否则将不知道字符串的开始结束。
<span style="font-family:SimSun;font-size:18px;">import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class DataStreamTest {
public static void main(String[] args) {
try{
//创建Fileoutputstream对象
FileOutputStream fs=new FileOutputStream("word.txt");
//创建DataOutputStream对象
DataOutputStream ds=new DataOutputStream(fs);
ds.writeUTF("使用writeUTF写入数据"); //写入磁盘文件数据
ds.writeChars("使用writechar写入数据");
ds.writeBytes("使用writeBytes写入数据");
ds.close();
//创建文件输入对象
FileInputStream fis = new FileInputStream("word.txt");
//创建数据输入对象
DataInputStream dis = new DataInputStream(fis);
System.out.print(dis.readUTF());
dis.close();
}catch(Exception e){
e.printStackTrace();
}
}
}</span>
六.ZIP压缩输入输出流
ZIP操作时要求使用ZipEntry对象作为进入点
<span style="font-family:SimSun;font-size:18px;">import java.io.*;
import java.util.zip.*;
public class MyZip { // 创建类
private void zip(String zipFileName, File inputFile) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFileName)); // 创建ZipOutputStream类对象
zip(out, inputFile, ""); // 调用方法
System.out.println("压缩中…"); // 输出信息
out.close(); // 将流关闭
}
private void zip(ZipOutputStream out, File f, String base)
throws Exception { // 方法重载
if (f.isDirectory()) { // 测试此抽象路径名表示的文件是否是一个目录
File[] fl = f.listFiles(); // 获取路径数组
out.putNextEntry(new ZipEntry(base + "/")); // 写入此目录的entry
base = base.length() == 0 ? "" : base + "/"; // 判断参数是否为空
for (int i = 0; i < fl.length; i++) { // 循环遍历数组中文件
zip(out, fl[i], base + fl[i]);
}
} else {
out.putNextEntry(new ZipEntry(base)); // 创建新的进入点
// 创建FileInputStream对象
FileInputStream in = new FileInputStream(f);
int b; // 定义int型变量
System.out.println(base);
while ((b = in.read()) != -1) { // 如果没有到达流的尾部
out.write(b); // 将字节写入当前ZIP条目
}
in.close(); // 关闭流
}
}
public static void main(String[] temp) { // 主方法
MyZip book = new MyZip(); // 创建本例对象
try {
// 调用方法,参数为压缩后文件与要压缩文件
book.zip("hello.zip", new File("src"));
System.out.println("压缩完成"); // 输出信息
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
</span>
<span style="font-family:SimSun;font-size:18px;">import java.io.*;
import java.util.zip.*;
public class Decompressing { // 创建文件
public static void main(String[] temp) {
ZipInputStream zin; // 创建ZipInputStream对象
try { // try语句捕获可能发生的异常
zin = new ZipInputStream(new FileInputStream("hello.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();
}
}
}</span>