Java笔记(IO流、文件流)

本文详细介绍了Java中的IO流,包括输入流、输出流、字节流和字符流的使用,以及如何进行文件的读写操作。通过实例展示了如何使用InputStream、OutputStream、Reader和Writer进行数据的读取和写入,以及如何实现文件的复制功能。同时,还讲解了字节流转字符流的转换方法,以及File类的相关操作,如创建、删除和判断文件等。
摘要由CSDN通过智能技术生成
/**
 * IO流
 * 文件流
 */



1.IO流(输入(input)输出(output)流)

	输入流(读取文件,输出文件):input,reader
	输出流(在文件中写入数据):output,writer
	字节流(每一次读取一个字节数据):以Stream结尾的流一定是字节流
	字符流(每一次读取一个字符数据):以Reader或者是Writer结尾的流一定是字符流

	注意:一个汉字占两个字节长度,一个汉字算一个字符

	Java中任何一个流一定继承于下列四个抽象类中的某一个
		InputStream 它是所有输入字节流的父类
		OutputStream 它是所有输出字节流的父类
		Reader 它是所有输入字符流的父类
		Writer 它是所有输出字符流的父类

2.字节流

	2.1 用字节流读取文件(InputStream)

		//读取目录下的文件(没有指定盘符,默认在此项目下创建该文件)
		InputStream is = new FileInputStream("hello.txt");	//文件或文件夹不存在会报错
		
		//read() 从输入流中读取一个字节,读取成功后,用于读取数据的光标的位置将会向后移一位
		//在文件中每次读取一个字节,并返回它的 ascii 值
		int c = is.read();

		//强转得到字符
		System.out.println((char)c);

		//把读取的字节放到数组里
		byte[] bs = new byte[8192];

		//把读取的字节放到数组里面去
		is.read(bs);

		//遍历字节数组
		for(byte b : bs) {
			System.out.print((char)b);
		}
	
	问题:如果字节数组存满了,但还有字节在文件中,怎么办呢?		用循环

		//如果文件中没有字节了会返回 -1
		System.out.println(is.read(bs));	// -1

		//记录读取的实际长度
		int len = 0;
	
		// is.read(bs) 把读取的字节放到数组里并返回长度
		while ((len = is.read(bs)) != -1) {	
			for(int i = 0; i < len; i++) {
				System.out.println((char)bs[i]);
			}
		}

		//关闭流
		is.close();

	2.2 用字节流往文件中写入数据(OutputStream)

		OutputStream os = new FileOutputStream("hello.txt");	//在目录正确的情况下,如果没有该文件,那么会在该目录下主动创建文件

		//os.write(97);	//这种方式太慢了,而且还要知道该字符的 ascii


//		byte[] bs = {97, 98, 99, 100};
//		os.write(bs);	//这种方法也太慢了,也是需要知道这些字符的 ascii

		String msg = "我是汉字";

		//把字符串转化为字节数组
		byte[] bs = msg.getBytes();

		//写入文件中
		os.write(bs);
			
		os.close();

	案例:复制粘贴功能

		//读取需要复制的文件
		InputStream is = new FileInputStream("/Users/youjing/Downloads/picture/My/小叮当.jpg");
		
		//要被写入的文件
		OutputStream os = new FileOutputStream("new.jpg");
		
		//读取的字节要存入的数组
		byte[] bs = new byte[1024];
		
		//记录读取字节的实际长度
		int len;
		
		while ((len = is.read(bs)) != -1) {
			//把字节数组从第 0 个到实际存入的字节长度写进文件中
			os.write(bs, 0, len);
		}
		
		os.close();
		is.close();


3.字符流

	3.1 用字符流读取文件(Reader, BufferedReader)

		Reader rd = new FileReader("hello.txt");
		
		//上面的字符流有点低级,用高级一点的流(功能更强大)
//		BufferedReader br = new BufferedReader(rd);

		BufferedReader br = new BufferedReader(new FileReader("hello.txt"));	//这种写法只需要关一个流

		//跳过前三个,从第四个开始读取
		r.skip(3);
		System.out.println(r.read());

		//读取一行
//		String line = br.readLine();
//		System.out.println(line);

		//循环读取多行
		String line = null;
		while ((line = br.readLine()) != null) {	//全部读取完会返回 null
			System.out.println(line);
		}

		rd.close();
		br.close();

	3.2 用字符流在文件中写入数据(Writer, BufferedWriter)

		Writer w = new FileWriter("hello.txt");

		BufferedWriter bw = new BufferedWriter(new FileWriter("hello.txt"));

		//window 换行符:	\r\n
		//linux 换行符:	\r
		//mac 换行符:	\n
		//因为 \r\n 在三个系统中都解释为换行,所以一般用 \r\n 换行

		//把 啦啦啦 写入文件中
		bw.write("啦啦啦\r\n");	

		//这也是换行
		bw.newLine();

		bw.write("略略略");
		
		bw.close();
		w.close();

4.字节流转字符流
	
	InputStream in = new FileInputStream("/Users/youjing/Documents/a.txt");
	
	//将字节流转换成字符流	
	//Reader rd = new InputStreamReader(in);
	
	Reader rd = new InputStreamReader(new FileInputStream("/Users/youjing/Documents/a.txt"));

	//OutputStream 同理

5.文件流

	5.1 定义一个名字叫 test 的东西(不是文件夹也不是文件,看创建的方法)

		File file = new File("test");
		//创建单文件夹
		file.mkdir();
	
		file = new File("a/b/c");
		//创建多级文件夹
		file.mkdirs();

		file = new File("a.txt");
		//创建文件
		file.createNewFile();

		//文件是否存在
		System.out.println(file.exists());

		//判断文件是否为一个目录
		System.out.println(file.isDirectory());

		//判断文件是否为一个文件
		System.out.println(file.isFile());

		file = new File("/Users/youjing/Documents");
		
		//获得当前目录下所有的文件名称
		String[] fname = file.list();
		System.out.println(Arrays.toString(fname));		//打印数组元素

		//获得当前目录下所有的文件
		File[] files = file.listFiles();
		System.out.println(Arrays.toString(files));

		file = new File("new.jpg");

		//删除目录或文件
		System.out.println(file.delete());

		//判断该文件的上一级是否存在
		System.out.println(file.getParentFile().exists());

		//在原有的数据上追加内容
//		Writer wt = new FileWriter(new File("hello.txt"), true);

		BufferedWriter bw = new BufferedWriter(new FileWriter("hello.txt", true)`));
		 
		bw.write("123123123");
		 
		bw.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值