java学习笔记22-IO

I/O是input/output的简称,表示输入输出,常用于软件系统跟显示设备,文件系统,控制台,网络系统之间的数据流控制。 

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

 

File类

File类是用来处理文件和文件夹的API,它可以表示一个文件,也可以表示文件夹。

文件夹属性:

	public static void main(String[] args){
		String path = "C:/Users/DG02/Desktop/接口重构";
		File file = new File(path);
		System.out.println("是否可写:"+file.canWrite());
		System.out.println("是否是文件夹:"+file.isDirectory());
		System.out.println("是否是文件:"+file.isFile());
}

 

文件(夹)操作:

                String dirname = "C:/Users/DG02/Desktop/接口重构/test";
		File file1 = new File(dirname);
		System.out.println("file1是否是文件夹"+file1.isDirectory());
		file1.mkdir();//在已知路径下创建文件
		System.out.println("file1是否是文件夹"+file1.isDirectory());
		//file1.mkdirs();//可以在不存在的路径下创建文件

		String filename = "C:/Users/DG02/Desktop/接口重构/test/test.text";
		File file2 = new File(filename);
		System.out.println("file2是否是文件"+file2.isFile());
		file2.createNewFile();
		System.out.println("file2是否是文件"+file2.isFile());
		file2.delete();
		System.out.println("file2是否是文件"+file2.isFile());

		file1.delete();
		System.out.println("file1是否是文件夹"+file1.isDirectory());

mkdir():创建已知路径的文件夹

mkdirs():创建不存在路径的文件夹,比如上面代码接口重构这个文件夹不存在。会先创建这个文件,然后再在这下面创建test文件

createNewFile():创建文件

delete():删除文件、文件夹

 

遍历文件:

遍历文件夹下所有文件名

		String filepath = "C:/Users/DG02/Desktop/接口重构/jdk api 1.8_google";
		File file4 = new File(filepath);
		String[] filenames =file4.list();
		for (String i:filenames){
			System.out.println(i);
		}

遍历文件下所有文件对象

		//遍历文件夹下所有文件对象
		File[] files = file4.listFiles();
		for (File f :files){
			System.out.println(f.isFile());
		}

根据文件后缀过滤文件

		for (File f: files){
			if(f.getName().endsWith(".txt")){
				System.out.println(f.getName());
			}
		}

getName():获取文件名

endWith():判断文件后缀名

 

 

过滤文件更加优雅的方式:

在listFiles方法里面传入一个FilenameFilter接口实现类对象,这个对象需要我们自己实现

 public class JavaFilenameFilter implements FilenameFilter {

@Override
public boolean accept(File dir, String name) {
if(name.endsWith(".txt")){
return true;
}
return false;
}

}
File[] files2 = file4.listFiles(new JavaFilenameFilter());

会根据实现类中设置的文件后缀名进行过滤。将true的文件添加到数组。

 

 

读写文件

一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。

下图是一个描述输入流和输出流的类层次图。

 

 

InputStream

是表示从某些数据源中读取数据时产生的一个流对象,流对象产生后,我们就开启了数据读取的通道。

InputStream下常用的有FileInputStream子类,可以帮助我们以字节为单位读取文件 

常用方法,

close():关闭文件输入流

read(int r):根据输入流下一字节,返回对应的0-255的整数。该方法是一个个字节读取的。速度较慢

read(byte[] r):从输入流读取r.lenght长度的字节,返回读入数组缓冲区的总字节数。如果是文件结尾则返回-1

	public static void main(String[] args){
		try{
			//被读取文件的路径
			String filepath = "C:/Users/DG02/Desktop/test.txt";
			//创建文件对象
			File file = new File(filepath);
			//创建文件流对象
			InputStream in = new FileInputStream(file);
			//创建接收字节的数组
			//数组的长度决定了流对象能接收多少内容,所以创建一个和文件内容长度相同的数组
			byte[] bytes = new byte[(int)file.length()];
			//返回读取内容长度
			int length = in.read(bytes);
			while (length!=-1){
				String s = new String(bytes,0,length);
				length = in.read(bytes);
				System.out.println(s);
			}
			//关闭流对象
			in.close();
		}catch (IOException e){
			e.printStackTrace();
		}
	}

读取中文会乱码。

 

OutputStream

表示为某个文件(或其他数据源)输出数据的一个流对象。流对象产生后,我们就开启了写数据的通道。 

OutputStream下常用的实现类是FileOutputStream,可以帮助我们输出内容(写文件) 

close():关闭输出流

write(byte[] b):将b的内容写入

	public static void main(String[] args) throws IOException {
		//写入文件的路径,不在则新建
		String filepath = "C:/Users/DG02/Desktop/test.txt";
		//创建文件对象
		File file = new File(filepath);
		//创建输出流文件对象
		OutputStream op = new FileOutputStream(file);
		//创建字节数组保存要写入的字节内容
		String content = "测试一下";
		byte[] bytes = content.getBytes();
		//写入
		op.write(bytes);
		op.close();
	}

 

 

Writer与Reader

 Writerde和Reader支持Unico字符,面向字符(非字节)的数据读取和写入API

Writer 和Reader下的FileWriter和FileReader 常用于处理文件。 

对于Writer首先我们仍然要用File来表示文件,然后把文件对象传给输出对象(写对象),通过写对象来输出内容到文件。

	public static void main(String[] args) throws IOException {
		//写入文件的路径,不在则新建
		String filepath = "C:/Users/DG02/Desktop/test.txt";
		//创建文件对象
		File file = new File(filepath);
		FileWriter fw = new FileWriter(file);
		fw.write("我使用了FileWrite");
		fw.close();
	}

 

 

对于Reader首先我们仍然要用File来表示文件,然后把文件对象传给输入对象(读对象),然后把内容读取到字符数组,最后把字符数组转化为字符串 

	public static void main(String[] args) throws IOException {
		//写入文件的路径,不在则新建
		String filepath = "C:/Users/DG02/Desktop/test.txt";
		//创建文件对象
		File file = new File(filepath);
		//创建读取字符流对象
		FileReader fr = new FileReader(file);
		//创建字符数组,接收字符内容,需要根据文件内容长度创建
		char[] cbuf = new char[(char)file.length()];
		//读取了多少字符
		int len = fr.read(cbuf);
		System.out.println(new String(cbuf,0,len));
		fr.close();
	}

 

 

BufferedWriter与BufferedReader

 BufferedWriter和BufferedReader可以通过缓冲的方式来实现高效的写和读,

 对于writer,我们可以使用BufferedWriter来包装 

	public static void main(String[] args) throws IOException {
		//写入文件的路径,不在则新建
		String filepath = "C:/Users/DG02/Desktop/test.txt";
		//创建文件对象
		File file = new File(filepath);
		FileWriter fw = new FileWriter(file);
		BufferedWriter out = new BufferedWriter(fw);
		out.write("Heelo world");
		out.newLine();
		out.write("next");
		out.close();
	}

 

对于Reader,我们可以使用BufferedReader来包装 

	public static void main(String[] args) throws IOException {
		//写入文件的路径,不在则新建
		String filepath = "C:/Users/DG02/Desktop/test.txt";
		//创建文件对象
		File file = new File(filepath);
		FileReader fw = new FileReader(file);
		BufferedReader in = new BufferedReader(fw);
		String line = in.readLine();
		while (line != null){
			System.out.println(line);
			//一定要加,不然会一直遍历下去
			line = in.readLine();
		}
		in.close();
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值