Java笔记(IO流)

一、IO

1.概述

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作

  • input:输入
  • ouput:输出

2.分类

  1. 按数据处理类型的不同,分为字节流和字符流

  2. 按数据流向的不同,分为输入流和输出流。(入和出是相对于内存来讲的)在这里插入图片描述

  3. 按功能不同,分为节点流和处理流

    • 节点流:直接操作数据源
    • 处理流:对其他流进行处理

3.四大抽象类

Java笔记(IO流)_第1张图片

3.1.InputStream

Java笔记(IO流)_第2张图片

3.2.OutputStream

Java笔记(IO流)_第3张图片

3.3.Reader

Java笔记(IO流)_第4张图片

3.4.Writer

Java笔记(IO流)_第5张图片

4.文件流

4.1.FileInputStream

4.1.1.概述
  • 以字节的方式进行文件中内容读取操作
  • 需要先通过 相对路径 或 绝对路径 找到这个文件
  • 概念神级别:只要有路径,不管是压缩包还是文件、文件夹都可以读,与之对应的是FileOutputStream
  • 相对路径:相对于当前文件路径去找其他资源
    • ./ 当前目录,…/ 上级目录 …/…/ 上上级目录
    • 在eclipse中 ./定位到当前项目
    • ./src/input.txt
  • 绝对路径:就是以当前系统更根路径去找其他资源
  • E:/eclipse/tlfile/Test01/src/Day20/Test_01.java
4.1.2.常用方法

在这里插入图片描述

4.1.3.Read使用
public class IO_01_FileInputStream_01 {
	public static void main(String[] args) {
		FileInputStream fis = null;
		try {
			//打开对应文件数据
			fis=new FileInputStream("./src/Day19/Test_01.java");
			//read:读取文件中一个字节,返回下一个字节对应的ASCLL码值
			//到达文件末尾(读完了,没有可读数据)返回-1
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
		} catch (Exception e) {
			
			e.printStackTrace();
		}finally{
			try {
				//一定要记得关闭资源
				fis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
public class IO_02_FileInputStream_02 {
	public static void main(String[] args) {
		// java7 后可自动关闭资源
		try (FileInputStream fis=new FileInputStream("./src/Day19/Test_01.java")){
			int temp=0;
			//只要 read() 不返回-1就一直循环,返回-1说明已读完
			while((temp=fis.read())!=-1){
				//如果不用char进行强转,输出的就是ASCLL码值
				System.out.println((char)temp);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
4.1.4.Read 重载使用
public class IO_03_FileInputStream_03 {
	public static void main(String[] args) {
		// java7 后可自动关闭资源
		try (FileInputStream fis=new FileInputStream("./src/Day19/Test_01.java")){
			//read方法重载,可以传入byte数组,用来提高读取效率,一次读取一个数组
			//available():获取可读取的个数
			System.out.println("可读取个数:"+fis.available());
			//byte[] bytes=new byte[fis.available()];这样就是一次读取全部字节
			byte[] bytes=new byte[1024];
			int temp=0;
			//只要 read() 不返回-1就一直循环,返回-1说明已读完
			while((temp=fis.read(bytes))!=-1){
				//0就是开始位置,temp就是读取长度,为了防止多读,
				//因为数组并没有重新创建,只是新数据覆盖了旧数据
				System.out.println(new String(bytes,0,temp));
				//new String(bytes)作用:根据已有的字节(字符)数组bytes进行创建String对象
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

4.2.FileReader

4.2.1.概述
  • 字符输入流,一般适用于纯文本文件,用来解决读取汉字乱码问题
  • 例如压缩包,图片,视频等等,都要使用字节流
  • Read():一次读取一个字符,返回赌赢的ASCLL码 到达文件末尾,返回-1
  • Read(char[]):一次读取一个char数组,返回本次读取到的个数
4.2.2.使用方式
public class IO_04_FileReader {
	public static void main(String[] args) {
		// FileReader:字符流,一次读取一个字符
		try (FileReader fr=new FileReader("./src/Day19/Test_01.java")){
			char[] chars=new char[1024];
			int temp=0;
			//只要 read() 不返回-1就一直循环,返回-1说明已读完
			while((temp=fr.read(chars))!=-1){
				System.out.println(new String(chars,0,temp));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

4.3.FileOutputStream

4.3.1.概述
  • 字节输出流用于将内存中数据写出在硬盘中
  • 如果文件不存在,则会自动创建,但是不会创建目录(文件夹),如果目录不存在,就会报错
  • 构造方法 可以传入两个参数 , ( 文件路径 ,写出方式 ) 写出方式:true 表示追加写出 false 表示覆盖写出, 不写则默认是false
  • 覆盖写出会在创建输出流对象的时候,会把文件中的内容清空
4.3.2.常用方法

Java笔记(IO流)_第6张图片

4.3.3.构造方法
//可以传入两个参数 , ( 文件路径 ,写出方式 ) 写出方式:true 表示追加写出 false 表示覆盖写出
				FileOutputStream fos=new FileOutputStream("./src/test.txt",false);
				//如果只写文件路径则 默认写出方式 为 false
4.3.4.使用方式
public class IO_05_FileOutputStream {
	public static void main(String[] args) {
		try (
				//可以传入两个参数 , ( 文件路径 ,写出方式 ) 写出方式:true 表示追加写出 false 表示覆盖写出
				FileOutputStream fos=new FileOutputStream("./src/test.txt",false);
				//如果只写文件路径则 默认写出方式 为 false
				){
				byte[] bytes={99,66,55,33,22,11};
				//写出自己数组中所有内容
				fos.write(bytes);
				//写出数组中特定范围内元素
				fos.write(bytes, 0, 2);
				//写出int类型
				fos.write(97);
				//不能直接写出字符串,需要转换为字节数组
				bytes="你好".getBytes();//String中的方法,很重要
				fos.write(bytes);
				//刷缓存
				fos.flush();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

4.4.FileWriter

public class IO_06_FileWriter {
	public static void main(String[] args) {
		try (	//字符输出
					FileWriter fw=new FileWriter("./src/test.txt");
				){
			//写出int型
			fw.write(97);
			char[] chars={'a','b','和'};
			fw.write(chars);
			fw.write(chars, 0, 2);
			//写出字符串
			fw.write("嗨嘿哈");
			//写出字符串中特定个数
			fw.write("嗨嘿哈", 0, 2);
			//刷缓存
			fw.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

5.缓冲流

在这里插入图片描述

特点:

  1. 主要是为了提高效率而存在的,减少物理读取次数
  2. 提供readLine()、newLine()这样便捷的方法(针对缓冲字符流)
  3. 在读取和写入时,会有缓存部分,调用flush为刷新缓存,将内存数据写入到磁盘

5.1.BufferedReader

public class IO_07_BufferedReader {
	public static void main(String[] args) {
		//节点流的构造方法是传入文件路径
		//所有的处理流的构造方法传入的都是节点流对象
		//只要处理流关闭,节点流也会关闭
		try(
				//字节输入,,,,概念神,只要有路径,什么都能输入,和FileOutputStream相对,只要有路径,什么都能输出
				FileInputStream fis =new FileInputStream("./src/test.txt");
				//字节输入缓冲
				BufferedInputStream bis=new BufferedInputStream(fis);
				//字符输入
				FileReader fr=new FileReader("./src/test.txt");
				//字符输入缓冲
				BufferedReader br=new BufferedReader(fr);
				) {
			//读取一行数据 ,返回读到的字符串,到达文件末尾返回null
			//readLine()
			String temp=null;
			while ((temp=br.readLine()) != null) {
				System.out.println(temp);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

5.2.BufferedWriter

public class IO_08_BufferedWriter {
	public static void main(String[] args) {
		try (
				//字节输出
				FileOutputStream fos=new  FileOutputStream("./src/test.txt",true);
				//字节输出缓冲流
				BufferedOutputStream bos=new BufferedOutputStream(fos);
				//字符输出
				FileWriter fw =new FileWriter("./src/test.txt",true);
				//字符输出缓冲流
				BufferedWriter bw=new BufferedWriter(fw);
				){
			bw.write("你好");
			//新的 换行方法
			bw.newLine();
			bw.write("你也好");
			//刷缓存
			bw.flush();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}

6.转换流

Java笔记(IO流)_第7张图片

public class IO_09_InputStreamReader {
	public static void main(String[] args) {
		try (
				//字节输入流
				FileInputStream fis =new FileInputStream("./src/test.txt");
				//转换为字符流
				InputStreamReader isr=new InputStreamReader(fis);
				//字符输入缓冲流
				BufferedReader br =new BufferedReader(isr);
				){
			System.out.println(br.readLine());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
public class IO_10_InputStreamReader {
	public static void main(String[] args) {
		try (
				FileInputStream fis=new FileInputStream("./src/a.txt");
				//如果编码不一致会出现乱码问题,此时可以通过构造方法解决
				//通过记事本保存的时候,选择另存为,设置编码为ANSI(GBK)格式
				//由于我们的开发环境是UTF-8,所以读到的是乱码
				//要么把eclipse的开发环境修改为GBK,要么把文件的编码改为UTF-8,要么就是创建流对象的之前指定编码
				InputStreamReader isr =new InputStreamReader(fis,"GBK");
				BufferedReader br=new BufferedReader(isr);
				){
			System.out.println(br.readLine());
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}

7.打印流

7.1.概述

Java笔记(IO流)_第8张图片

7.2.使用方式

public class IO_11_PrintStream {
	public static void main(String[] args) {
		try (
				//打印流中提供了很多println方法,可以更加方便的打印各种类型
				FileOutputStream fos=new FileOutputStream("./src/test.txt");
				PrintStream ps=new PrintStream(fos);
				){
			ps.println("hahha");
			ps.println(true);
			ps.println(66.6);
			//平常用的打印语句就是这个打印流,只不过System中有三个标准流
			//in 是标准输入(控制台)out 是标准输出(控制台) err是错误打印
			System.out.println(666);
			//可以指定System中的打印流对象,可以让后面的输出语句将内容输出到指定文件而不是控制台
			System.setOut(ps);
			System.out.println("666666");
			System.out.println("哈哈哈");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

你可能感兴趣的:(java,笔记)