IO

本文深入探讨Java中File类的使用及流概念,详细解释File类如何与磁盘文件交互,以及流如何用于输入/输出操作。文章还介绍了字节流、过滤流等关键概念,并通过实例展示了如何使用File类和流进行文件读写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、File类

一个File类的对象表示了磁盘上的文件或目录,提供了与平台无关的方法来对磁盘上的文件或目录进行操作,直接处理文件和文件系统,没有指定信息怎么从文件读取或向文件存储,描述了文件本身的属性,用来获取和处理与磁盘文件相关的信息,如权限,时间,日期蔌目录路径,还可以浏览子目录层次结构。

public class FileTest1 {
	public static void main(String[] args) {
		File file = new File("C:\\text.txt");
		try{
			System.out.println(file.createNewFile());
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
public class FileTest2 {
	public static void main(String[] args) {
		File file = new File("C:/Program Files");
		String[] names = file.list();
		for(String name : names){
			System.out.println(name);
		}
	}
}
public class FileTest2 {
	public static void main(String[] args) {
		File file = new File("C:/Program Files");
		File[] files = file.listFiles();
		for(File f : files){
			System.out.println(f.getName());
		}
	}
}
public class FileTest3 {
	public static void main(String[] args) {
		File file = new File("C:/Program Files");
		String[] names = file.list(new FilenameFilter(){
			public boolean accept(File dir, String name) {
				if(name.endsWith(".java")){
					return true;
				}
				return false;
			}
		});
	}
}

2、流的概念

Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类或方法适用于所有类型的设备。这意味阒一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。

输入/输出是相对于程序来说的。程序在使用数据时所扮演的角色有两个:一个是源,一个目的。若程序是数据流的源,即数据的提供者,这个数据流对程序来说就是一个“输出数据流”(数据从程序流出)。若程序是数据流的终点,这个数据流对程序而言就是一个“输入数据流”(数据从程序外流向程序)。

3、字节流(byte stream)的基础是两个抽象类InputStream和OutputStream,字符流(character stream)的基础是抽象类Reader和Writer。在最底层,所有的输入/输出都是字节形式的,基于字符的流只为处理字符提供方便有效的方法。

4、节点流(Node InputStream):从特定的地方读写的流类,例如,磁盘或一块内存区域。

过滤流(Filter InputStream):使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。

5、InputStream三个基本的读方法:

(1)abstract int read() 读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。

(2)int read(byte[ ] b) 将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。

(3)int read(byte[ ] b, int off, int len) 将数据读入一个字节数组,同进返回实际读取的字节数。如果返回-1,表求读到了输入流的末尾。off指定数组b中存放数据的超始偏大移位置,len指定读取的最大字节数。

为什么只有每一个read方法是抽象的,而其余的两个read方法都是具体的?

因为第二个read依靠第三个read方法来实现,而第三个read方法又依靠第一个read方法来实现,所以只有第一个read方法是与具体的I/O设备相关的,它需要InputStream的子类来实现。


InputStream is = new FileInputStream("C:/hello.txt");
byte[] buffer = new byte[200];
int length = 0;
while(-1 != (length=is.read(buffer, 0, 200))){
    String str = new String(buffer, 0, length);
}


OutputStream os = new FileOutputStream("1.txt");
BufferedOutputStream bos = new BufferedOutputStream(os);
bos.write("hello".getBytes());
bos.close();


public class InputStreamTest1 {
	public static void main(String[] args) throws Exception {
		InputStream is = new FileInputStream("D:/springsource/workspace-sts-3.3.0.RELEASE/JavaTest/src/io/InputStreamTest1.java");
		byte[] buffer = new byte[200];
		int length = 0;
		while(-1!=(length=is.read(buffer, 0, 200))){
			String str = new String(buffer, 0, length);
			System.out.println(str);
		}
		is.close();
	}
}
6、BufferedOutputStream缓冲输出流

缓冲输出流BufferedOutputStream类提供和FileOutputStream类同样的写操作方法,但所有输出全部写入缓冲区中。当写满缓冲区或关闭输出流时,它再一次性输出流,或者用flush方法主动将缓冲区输出到流。通过减小系统写数据的时间而提高性能。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值