Java输入和输出

开发工具与关键技术: Java 和 eclipse
作者:杜永鹏
撰写时间:2021 年 7月 6日

IO(输入/输出)是比较抽象的,看不到明显的运行效果,但输入和输出是所有程序都必需的部分。使用输入机制,允许程序读取外部数据(包括来自磁盘、光盘等存储设备的数据、来自网络的数据)、用户输入数据;使用输出机制,允许程序记录运行状态,将程序数据输出到磁盘、光盘等存储设备中和网络其他设备中。
Java的IO通过java.io包下的类和接口来支持,在java.io包下主要包括输入流、输出流两种IO流,每种输入、输出流又可分为字节流和字符流两大类。其中字节流以字节为单位来处理输入、输出操作,而字符流则以字符来处理输入、输出操作。除此之外Java的IO流使用了一种装饰器设计模式,它将IO流分成底层节点流和上层处理流,其中节点流用于和底层的物理存储节点直接关联(不同的物理节点获取节点流的方式可能存在一定的差异),但程序可以把不同的物理节点流包装成统一的处理流,从而允许程序使用统一的输入、输出代码来读取不同的物理存储节点的资源。
1、File类
File类是java.io包下代表与平台无关的文件和目录的类。在程序中操作文件和目录,都可以通过File类来完成。需要注意的是,不管是文件还是目录都是使用File来操作的,File能新建、删除、重命名文件和目录,但是File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
构造器:
构造器:File(String pathname) 说明:通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
构造器:File(String parent, Stringchild)说明:根据 parent 路径名字符串和 child 路径名字符串创建一个新 File实例。
构造器:File(File parent, Stringchild)说明:根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
构造器:File(URI uri) 说明:通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File实例。
//获取相关文件信息

	System.out.println("length()-->"+file1.length());
	System.out.println("length()"+dirNow.length());
	long lt= file1.lastModified();
	Date dt=new Date(lt);
	System.out.println("length() -->"+dt);
	
	//操作相关
	System.out.println("--操作相关--");
	File fileN=new File("F:file.txt");
	boolean bolCreate=fileN.createNewFile();// 创建文件
	System.out.println("创建文件-->-"+bolCreate);
	File fileT=File.createTempFile("temp", ".tmp");
	System.out.println(fileT);
	
	//删除文件前 需要判断文件是否存在
	if (fileN.exists()) {
		System.out.println("delete() -->"+fileN.delete());
	}

2、了解java IO流
Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream),通过流的方式允许Java程序使用相同的方式来访问不同的输入输出源。 stream是从起源(source)到接收(sink)的有序数据。Java把所有传统的流类型(类或抽象类)都放在java.io包中,用以实现输入输出功能。
流的分类:
1.输入流和输出流
按照流的流向来分,可以分为输入流和输出流。输入、输出都是从程序运行所在内存的角度来划分的。
输入流:只能从中读取数据,而不能向其写入数据。由InputStream和Reader作为基类
输出流:只能向其写入数据,而不能从中读取数据。由OutputStream和Writer作为基类
2.字节流和字符流
字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。
字节流操作的数据单元是8位的字节,由InputStream和OutputStream作为基类。
字符流操作的数据单元是16位的字符,由 Reader和 Writer作为基类。
3.节点流和处理流
按照流的角色来分,可以分为节点流和处理流。
节点流:可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流。也被称为低级流。
处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。也称为高级流。
3、字节流和字符流
字节流和字符流的操作方式几乎完全一样,区别只是操作的数据单元不同而已。字节流操作的数据单元是字节,字符流操作的数据单元是字符。
一、InputStream和Reader
InputStream和Reader是所有输入流的抽象基类,它们的方法是所有输入流都可使用的方法。
InputStream类的方法

修饰符/返回值类型:int 方法名:available() 说明:返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
修饰符/返回值类型:void 方法名:close() 说明:关闭此输入流并释放与该流关联的所有系统资源。
修饰符/返回值类型:void 方法名:mark(intreadlimit) 说明:在此输入流中标记当前的位置。
修饰符/返回值类型:boolean 方法名:markSupported() 说明:测试此输入流是否支持 mark 和 reset 方法。
修饰符/返回值类型:abstract 方法名:int read() 说明:从输入流中读取数据的下一个字节。
修饰符/返回值类型:int 方法名:read(byte[] b) 说明:从输入流中读取一定数量的字节,并将其存储在缓冲区数组b 中。
修饰符/返回值类型:int 方法名:read(byte[] b, int off, int len) 说明:将输入流中最多 len 个数据字节读入 byte 数组。
修饰符/返回值类型:void 方法名:reset() 说明:将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。
修饰符/返回值类型:long 方法名:skip(long n) 说明:跳过和丢弃此输入流中数据的 n 个字节
Reader类的方法:
修饰符/返回值类型:abstract 方法名:void close() 说明:关闭该流并释放与之关联的所有资源。
修饰符/返回值类型:void 方法名:mark(int readAheadLimit) 说明:标记流中的当前位置。
修饰符/返回值类型:boolean 方法名:markSupported() 说明:判断此流是否支持 mark() 操作。
修饰符/返回值类型:int 方法名:read() 说明:读取单个字符。
修饰符/返回值类型:int 方法名:read(char[] cbuf) 说明:将字符读入数组。
修饰符/返回值类型:bstract 方法名:int read(char[] cbuf, int off, int len) 说明:将字符读入数组的某一部分。
修饰符/返回值类型:int 方法名:read(CharBuffer target) 说明:试图将字符读入指定的字符缓冲区。
修饰符/返回值类型:boolean 方法名:ready() 说明:判断是否准备读取此流。
修饰符/返回值类型:void 方法名:reset() 说明:重置该流。
修饰符/返回值类型:long 方法名:skip(long n) 说明:跳过字符。

InputStream和Reader的方法基本一致,只是InputStream读取的是字节,使用的参数是byte数组(byte[]),而Reader读取的是字符,使用的参数是char数组(char[])
InputStream和Reader都是抽象类,本身不能创建实例,但它们分别有一个用于读取文件的输入流:FileInputStream和 FileReader,它们都是节点流需要直接和指定文件关联。
File file1 = new File(“F:/z/BaseDataType.java”);
InputStream in = null;
try {
in = new FileInputStream(file1);
//缓冲区
byte[] bs = new byte[100];
int count = 0;
//读取数据
while ((count = in.read(bs, 0, bs.length)) != -1) {
String str =new String(bs, 0, count,Charset.forName(“GBK”));
System.out.println(str);
}
}catch(FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if (in!=null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//使用流一定要记得关闭!!!
}
}
}
4、处理流
处理流可以隐藏底层设备上节点流的差异,并对外提供更加方便的输入/输出方法,让程序员只需关心高级流的操作。
使用处理流时的典型思路是,使用处理流来包装节点流,程序通过处理流来执行输入输出功能,让节点流与底层的IO设备、文件交互。
实际识别处理流非常简单,只要流的构造器参数不是一个物理节点,而是已经存在的流,那么这种流就
一定是处理流;而所有节点流都是直接以物理IO节点作为构造器参数的。使用处理流的优势:

  1. 对开发人员来说,使用处理流进行输入/输出操作更简单;
  2. 使用处理流的执行效率更高。
    5、转换流
    输入/输出流体系中还提供了两个转换流,这两个转换流用于将字节流转换成字符流,其中InputStreamReader将字节输入流转换成字符输入流, OutputStreamWriter将字节输出流转换成字符输出流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值