IO流详解

一.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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值