Java笔记----第十二章(XII) 输入输出流

一、IO流

1.概述

概述:数据源和数据目标不仅仅是传统的存储在计算机磁盘上打的文件,也可以是网络上的文件,任何可读/写设备中的文件。数据可以从外界”流入”程序中,即为”I”(Input); 数据也可以从程序”流出”到外界,即为”O”(Output)。

注:
Java IO的所有操作类都放在Java.io包中,主要的类和接口是:
File、InputStream、OutputStream、Reader、Writer、Serializable接口

2.IO流的分类
(1)方法1

数据流的方向不同可以分为输入流输出流(如果数据是从外界流入程序的,则是输入流,反之则是输出流)

(2)方法2

按是否直接操作源或者目标节分为节点流和装饰流

(3)方法3

按处理数据单位不同可以分为字节流和字符流
例如:
字节(最基础的存储单位):byte, 8bit;
字符:a-z, 8000 ,学

二、File类

注:
一个File类的对象,表示了磁盘上的文件或文件夹,只负责文件的本身,而不负责文件的内容。

1.File构造方法
方法声明功能描述
File(String pathname)通过指定的一个字符串类型的文件路径来创建一个新的File对象
File(String parent,String child)根据指定的一个字符串类型的父路径和一个字符串类型的子路径(包括文件名称)创建一个File对象
File(File parent,String child)根据指定的File类的父路径和字符串类型的 子路径(包括文件名称)创建一个File对象
2.File常用方法
方法声明功能描述
boolean exists()测试文件是否存在
boolean canWrite()测试文件是否可写
boolean canRead()测试文件是否可读
boolean isFile()测试当前文件是否是文件
boolean isDirectory()测试当前文件是否是目录
long lastModified()获取文件最后一次修改时间
long length()获取文件的长度,以字节为单位
boolean delete()删除当前文件
boolean renameTo(File dest)重命名当前File对象表示的文件
String getAbsolutePath()获取文件的绝对路径
String getName()获取文件的名称
boolean mkdir()创建当前File对象指定的目录
public String[] list()以字符串数组返回当前文件夹下的所有文件
public File[] listFiles()以文件数组返回当前文件夹下的所有文件
public String[] list(FilenameFilter filter)/
public File[] listFiles(FilenameFilter filter)/

注:
FilenameFilter: 是一个接口,boolean accept(File,dir,String filename)由此来限制由list()方法返回的文件数量,使之只返回符合某一过滤器的文件。

三、字节流

IO流中针对字节的输入输出提供了一系列的流,统称为字节流。根据数据的传输方向可将其分为字节输入流字节输出流。在io包中,提供了两个抽象类InputStreamOutputStream,他们是字节流的顶级父类。

1.输入流

(1)常用方法
方法声明功能描述
int read()从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数
int read(byte[] b)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目
int read(byte[] b,int off,int len)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len 表示读取的字节数目。
void close0关闭此输入流并释放与该流关联的所有系
(2)输入流子类
InputStream
ByteArrayInputStream
FileInputStream
FileterInputStream
PipedInputStream
ObjectInputStream
BufferedInputStream
DataInputStream

2.输出流

(1)常用方法
方法声明说明
close()关闭此输出流并释放写此流有关的所有系统资源。
flush()刷新输出流,即使缓冲区未满强制输出缓冲区中的字节。
write(byte[] b)将b.length个字节从指定的byte数组写入此输出流。
write(byte[] b, int off, int len)将指定byte数组中从偏移量off开始的len个字节写入此输出流
write(int b)将指定的字节写入此输出流。
(2)输出流子类
InputStream
ByteArrayInputStream
FileOuputStream
FileterOuputStream
PipedOuputStream
ObjectOuputStream
BufferedOuputStream
DataOuputStream
PrintStream

四、缓冲区

1.文件复制实现思路
FileInputStream
FileOutputStream
source
程序
destination

注:
当通过流的方式拷贝文件时,为了提高效率也可以定义一个字节数组作为缓冲区。在拷贝文件时,可以一次性读取多个字节的数据,并保存在字节数组中,然后将字节数组中的数据一次性写入文件。

2.案例
(1)字节数组作为缓冲区
public class FileCopyDemo {
	public static void main(String[] args) throws Exception {
		InputStream in = new FileInputStream("source\\text");
		// 创建一个文件字节输出流,用于将读取的数据写入target目录下的文件中
		OutputStream out = new FileOutputStream("target\\text");//想要把source目录下的text文件复制到target目录下名也为text的文件

		byte[] buff = new byte[1024];// 利用字节数组,开辟的空间是1024
		int len;
		long begintime = System.currentTimeMillis();// 获取拷贝文件前的系统时间
		while ((len = in.read(buff)) != -1) {// 读取一个字节并判断是否读到文件末尾
			out.write(buff, 0, len);// 利用write的另一种方法,为了防止最后读取的字节数不是1024的整数倍,这种情况下就从0开始写出len个字节到指定的文件中去
		}
		long endtime = System.currentTimeMillis();// 获取文件拷贝结束时的系统时间
		System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");
		in.close();
		out.close();
	}
}
(2)字节缓冲流
public class FileCopyDemo2 {
	public static void main(String[] args) throws Exception {

		// 创建一个字节输入流,用于读取当前目录下source文件夹中的text文件
		InputStream in = new BufferedInputStream(new FileInputStream("source\\text"));
		// 创建一个文件字节输出流,用于将读取的数据写入target目录下的文件中
		OutputStream out = new BufferedOutputStream(new FileOutputStream("target\\text"));// 这条语句的意思是:想要把source目录下的text文件复制到target目录下名也为text的文件

		byte[] buff = new byte[1024];// 利用字节数组,开辟的空间是1024
		int len;
		long begintime = System.currentTimeMillis();// 获取拷贝文件前的系统时间
		while ((len = in.read(buff)) != -1) {// 读取一个字节并判断是否读到文件末尾
			out.write(buff, 0, len);// 利用write的另一种方法,为了防止最后读取的字节数不是1024的整数倍,这种情况下就从0开始写出len个字节到指定文件中去
		}
		long endtime = System.currentTimeMillis();// 获取文件拷贝结束时的系统时间
		System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");
		in.close();
		out.close();
	}
}

五、字符流

InputStream类和OutputStream类在读写文件时操作的都是字节。如果希望在程序中操作字符,使用这两个类就不太方便,为此io包提供了字符流。同字节流一样,字符流也有两个抽象的顶级父类,分别是ReaderWriter

1.Reader子类
Reader
BufferedReader
CharArrayReader
InputStreamReader
PipedReader
LineNumberReader
FileReader
2.Writer子类
Writer
BufferedWriter
CharArrayWriter
OutputStreamWriter
PipedWriter
FileWriter
PrintWriter
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值