IO流

输入流 输出流 缓冲流 打印流

*  流是一组有顺序的 , 有起点和终点的字节集合 , 是对数据传输的总称或抽象
 *  即数据在两设备间的传输称为流 , 流的本质是数据传输 , 根据数据传输特性抽象出各种类 , 
 *  方便我们直接操作数据
 *  
 *  流中的操作对象 , 是指内存中 , 当期操作的程序而言 , 
 *  输入 : 往内存中导入数据
 *  输出 : 从内存中写出数据
 *  I : input
 *  O : output
 *  
 *  四大抽象类 : 
 *  		InputStream  字节输入
 *  		OutputStream  字节输出
 *  		Reader  字符输入
 *  		Winter  字符输出
 *  
 *  
 *  原始文件流 : 用于打开链接 , 操作数据
 *  	1 FileInputStream
 *  	2 FileOutputStream
 *  	3 FileReader
 *  	4 FileWinter

FileInputStream 原始字节输入流

* java.io.InputStream
 * 		java.io.FileInputStream  按照自己的方式在原始文件总读取数据
 * 
 * 想要读取一个文件 , 首先要找到他 
 * 		 
 * 		定位方式有两种 , 一种是绝对路径 , 一种是相对路径
public class io_02 {
	public static void main(String[] args) {
		FileInputStream fis = null ;
		// 相对路径是相对于这个项目 
		// D:\workspace\IO\src\io\io_02.java
		try {
			fis = new FileInputStream("./src/io/io_02.java");
			
			// 读取数据
			int i1 = fis.read(); // 读取一个字节(8位) 返回下一个字节的值 , 因为开始时光标在顶端 , 如果到了文件末尾 , 就返回-1
			int i2 = fis.read(); 
			int i3= fis.read(); 
			// package io;  先输出p , 再输出a
			System.out.println((char)i1);
			System.out.println((char)i2);
			// /			/			å    在文件前加了//啊
			System.out.println((char)i3);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if (fis!=null) {
					fis.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

使用read循环读取

public class io_03 {
	public static void main(String[] args) {
		
		// 相对路径是相对于这个项目 
		// D:\workspace\IO\src\io\io_02.java
		// 自动关闭资源
		try(FileInputStream fis = new FileInputStream("./src/io/io_02.java"); ) {
			
			while(true){
				int temp = fis.read();
				if (temp==-1) { // 文件末尾会返回-1
					break;
				}else {
					// 汉字是乱码是对的
					System.out.print((char)temp);
				}
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}

read方法重载

 * read(byte[] b)  读取数组
 * read方法重载 , 可以传入无参的 , 也可以传入一个字节数组 , 数组的这个使用字节数组来存储读取数据 
 * 并且是一次返回 , (要么装满数组 , 要么到达文件末尾)
 * 返回值是本次读取到的字节个数 , 到达文件末尾返回-1
 * @杜智慧
 *
 * @Date 2021126*/
public class io_04 {
public static void main(String[] args) {
		
		// 相对路径是相对于这个项目 
		// D:\workspace\IO\src\io\io_02.java
		// 自动关闭资源
		try(FileInputStream fis = new FileInputStream("./src/io/io_04.java"); ) {
			byte[] bytes = new byte[1000];
			// 返回本次读取的字节个数 , 再次使用该数组的时候 , 不会清空 , 而是用
			int i1= fis.read(bytes);
			System.out.println(i1); // 1000 
			System.out.println(new String(bytes));
			int i2= fis.read(bytes);  
			System.out.println(i2);  // 116 读取的时候会接着上一数组读取到的地方再接着读取
			System.out.println(new String(bytes , 0 , i2) ); // 转换为String
		}catch (Exception e) {
			e.printStackTrace();
		}
    }	
}

常用方法

		// 创建流对象
		FileInputStream fis = new FileInputStream("./src/io/io_04.java");
		// 可获取的字节数
		System.out.println(fis.available()); //1205
		// 读取字节数组
		byte[] bytes = new byte[5];
		fis.read(bytes); // 在这里读取
		System.out.println(new String(bytes)); // packa
		System.out.println(fis.available()); // 1200
		// 跳过不读
		fis.skip(2);
		fis.read(bytes);
		System.out.println(new String(bytes)); // 跳过两个字节 io;
		
		// 关闭资源
		fis.close();

FileOutputStream 原始字节输出流

 *  java.io.OutputStream
 *    java.io.FileOutputStream
 *  把程序中的内容, 写出到硬盘中  , 输入流找不到会报错, 输出流不会
 *  他会自动创建该文件 , 但是不会创建文件夹(不会创建目录)
 *  
 *  构造方法 : 
 *  		FileOutputStream(String) : 把内容输出到指定文件中 , 并且会覆盖原文件内容
 *  		FileOutputStream (String , boolean) : 在原文中追加数据 (如果是true) 如果是false就跟第一个一样了(覆盖)
 *  成员方法 :
 *  	write(int i) : 写出整型 
 *  	write(byte[] b) : 写出字节数组 , 想要输出字符串 , 可以利用字符串中的getBytes()方法 
 *  	flush() : 刷缓存 强制把缓存区写出 , 避免遗漏
public class io_01_FileOutputStream {
	public static void main(String[] args) throws IOException {
//		FileOutputStream fos = new FileOutputStream ("D:/123.txt");
//		fos.write(97);
//		fos.flush(); // 会在D盘创建一个123.txt , 但是要注意的是 , 这不是文件夹(即目录) , 他可以创建具体的文件 , 但是不能创建目录
//		fos.close();
		
		// 追加式写入
		FileOutputStream fos = new FileOutputStream ("D:/123.txt" , true);
		for (int i = 0; i < 26; i++) {
			fos.write(i+97);
		}
		String string = "Hello World";
		byte[] bytes = string.getBytes(); // 字符串转字节  因为write只能接受int或者byte
		fos.write(bytes);
		fos.flush();
		fos.close();
	}
}

FilReader 原始字符输入流

* FilReader 一次读一个字符 , 也就是两字节 , unicode也是两字节 , 所以他是可以容纳汉字的 , 可以解决汉字乱码问题
 * 所以这个字符串输入流一般用于读取纯文本文件
 * 压缩包图片等还是字节流
 * FileReader里的read也有方法重载 与FileInputStream里的是一样的  
 * 唯一的区别在于一个是字节数组一个是字符数组
 * read()  read(char[] c)
 * @杜智慧
 *
 * @Date 2021126*/
public class io_01_FilReader {
	public static void main(String[] args) {
		// 这种写法可以自动回收资源  ./src/io/io_02.java
		try (FileReader fr = new FileReader("./src/io/io_02.java");
				FileWriter fw = new FileWriter("E:/text1.txt");){
			// 字符数组
			char[] c = new char[500];
			int temp = 0;
			while((temp = fr.read(c)) != -1){
				fw.write(c);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

FileWriter 原始字符输出流

/**
 * 与字节输出流(FileOutputStream)基本一致 , 新增字符串写出 .write(char[] c)
 * @杜智慧
 *
 * @Date 2021年1月26日
 */
public class io_01_FileWriter {
	public static void main(String[] args) {
		try(
				// 默认是覆盖写入 其内原有的被直接覆盖掉
				FileWriter fw = new FileWriter("E:/FileWriter.txt");
				) {
			fw.write("大家好\n");
			char[] chars = {'a','b','c','d'};
			fw.write(chars);
			fw.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

缓冲流

* 缓冲流 , 是包装流 , 创建对象的时候 , 传入的参数 , 不再是文件地址 , 而是文件流对象
 * BufferedInputStream , BufferedOutputStream ,BufferedReader, BufferedWriter
 * 作用是把每次读入的数据存入到一个缓存区 , 然后一次性写入
 * 把输出的数据存入一个缓冲区 , 然后一次性写出
 * 
 * 如果缓存流关闭 , 那么传入的对应的文件流对象也会被关闭
 * 
 * 针对字符操作, 提供了两个新方法
 * 		readLine() : 读一行 , 返回值就是这一行的数据 , 如果到了文件的末尾就返回null
 * 		newLine() : 换行 , 就等于 \n

BufferedInputStream 缓冲字节输入流

public class io_01_BufferedInputStream {
	public static void main(String[] args) {
		try (
				FileInputStream fis = new FileInputStream("./src/io/io_02.java");
				// 创建缓存流  将输入流缓存
				BufferedInputStream bis = new BufferedInputStream (fis);
				){
			// 读取下一个字节 , 光标后移一位
			System.out.println((char)bis.read());
			// 读取一个数组 , 返回读取到的长度  , 到达末尾返回-1
			byte[] bytes = new byte[5];
			System.out.println(bis.read(bytes));
			int temp = bis.read(bytes);
			System.out.println(new String(bytes , 0 , temp));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

BufferedOutputStream 缓冲字节输出流

public class io_01_BufferedOutputStream {
	public static void main(String[] args) {
		try (
				// 输出流对象
				FileOutputStream fos = new FileOutputStream("D:/123.txt");
				// 字节输出缓冲流
				BufferedOutputStream bos = new BufferedOutputStream(fos);
				){
			bos.write(97);
			byte[] bytes = "Hello World".getBytes();
			bos.write(bytes);
			bos.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

BufferedReader 字符缓冲输入流

public class io_01_BufferedReader {
	public static void main(String[] args) {
		try (
				FileReader fr = new FileReader("./src/io/io_02.java");
				// 字符缓冲输入流
				BufferedReader br = new BufferedReader(fr);
				){
			String string = br.readLine(); // 读取一行
			System.out.println(string);
			
			// 循环读取 
			String temp = null;
			while((temp = br.readLine())!=null){
				System.out.println(temp);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

BufferedWriter 字符缓冲输出流

public class io_01_BufferedWriter {
	public static void main(String[] args) {
		try (
				FileWriter fw = new FileWriter("E:/BufferedWriter.txt");
				// 字符输出缓冲流
				BufferedWriter bw = new BufferedWriter(fw);
				){
			bw.write("你好\n");
			bw.write("你好a\n");
			bw.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

PrintStream 打印流

// 配套用
PrintStream ps = new PrintStream(fos);
ps.println(new String(bytes,0,tmp));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值