Java学习日记 | IO流

1. IO流

        1.1 概述

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

        I : input 输入

        O : output 输出

         1.2 分类

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

        按数据流向的不同,分为输入流和输出流。(入和出是相对于内存来讲的) 

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

                节点流:直接操作数据源

                处理流:对其他流进行处理

        1.3 四大抽象类 

        InputStream

        OutputStream

        Reader

        Writer

2. 文件流

        2.1 FileInputStream

        2.1.1 概述

        用来打开文件并读取文件中的数据

        想要读取一个文件,就必须要找到它

        1 绝对位置

                以系统根目录为准,比如D:/xxx\\xxx\xx\a.txt

        2 相对位置

                ./ 表示当前目录 

                ../ 表示上级目录

                ../../ 上上级目录

         2.1.2 常用方法

         2.1.3 Read使用

        read : 读取一个字节,并返回对应的ASCII码值,返回为int类型,如果到达文件末尾(读完了) 则返回-1

public static void main(String[] args) throws IOException {
		// 打开输入流链接,需要传入文件路径
		// D:/xx/xx/xxx 绝对路径
		// ./定位到当前路径 ./xx/xx/xxx 相对路径
		FileInputStream fis = new FileInputStream("./src/Day21/FileInputStream_01.java");
		// 读数据时,读取下一个字节并返回对应的ASCII值,如果到达文件末尾,则返回-1
		int temp = fis.read();
		System.out.println(temp);
		System.out.println((char)temp);
		System.out.println(fis.read());
		// 关闭流
		fis.close();
	}
         2.1.4 Read重载使用

        read方法重载:可以传递一个数组,一次读取会把该数组读满/读完,然后一次性返回

        返回int类型,为当前读取的个数,如果达到文件未尾 返回-1
        数组就相当于是一个缓冲区,效率会有所提升

public static void main(String[] args) throws IOException {
		// 创建文件,需要传入文件路径
		File file = new File("./src/Day21/FileInputStream_01.java");
		// 打开输入流链接
		FileInputStream fis = new FileInputStream(file);
		// 创建一个字节数组
		byte[] bytes = new byte[1024];
		// 传入字节数组,返回读取的字节个数,如果到达文件末尾,返回-1;
		int temp = fis.read(bytes);
		// 把字节数组转成字符串输出
		System.out.print(new String(bytes,0,temp));
		// 关闭资源
		fis.close();
	}

        2.2 FileReader

        2.2.1 概述

        FileReader: 一次读取一个字符,也就是两个字节,主要用于读取纯文本文件,解决乱码问题        

        read() : 一次读取一个字符,返回对应的ASCII码,达到文件末尾返回-1

        read(char[ ]):一次读取一个字符数组,提高读取效率,返回本地读取的字符个数,到达文件未尾返回-1

          2.2.2 使用方法
public static void main(String[] args) throws IOException {
		// 创建文件
		File file = new File("./src/Day21/FileReader_01.java");
		// 创建字符输入
		FileReader fr = new FileReader(file);
		char[] chars = new char[1024];
		// 读取
		int temp= fr.read(chars);
		System.out.println(new String(chars,0,temp));
		// 关闭
		fr.close();
	}

        2.3 FileOutputStream

        2.3.1 概述

        FileOutputStream是字节输出流,用于把数据写出到指定文件中
        如果指定文件不存在,会自动创建该文件,但是 不会创建目录(不会创建文件夹)

         2.3.2 常用方法

        2.3.3 构造方法 

        输出时,可以指定是覆盖还是插入

        构造方法 : 1 只传递一个文件路径 2 传递一个文件路径,和布尔型

        如果 我们调用的构造方法,只需要传入一个路径,则第二个布尔型默认为false

        如果布尔型为false,则为覆盖写出 , 为true 则为 追加写出

        如果是覆盖写出的话,在创建输出流对象时,就会把文件内容清空

 

        2.3.4 使用方法
public static void main(String[] args) throws IOException {
		// 创建字节输出流
		FileOutputStream fos = new FileOutputStream("./src/Day21/FileOutputStream/test.txt");
		// 写出int类型的ASCII码
		fos.write(97);
		// 写出一个数组
		byte[] bytes = {97,98,99,100,101,102};
		fos.write(bytes);
		// 写出字节数组,从第0个开始,写出三个
		fos.write(bytes,0,3);
		// 没有提供写出字符串的方法,想要写出字符串需要先转换为字节数组
		bytes = "你好吗?".getBytes();
		fos.write(bytes);
		// 刷缓存
		fos.flush();
		// 关闭资源
		fos.close();
	}

        2.4 FileWriter

        2.4.1 概述

        字符输出

         2.4.2 使用方法
public static void main(String[] args) throws IOException {
		// 创建字符输出流
		FileWriter fw = new FileWriter("./src/Day21/FileOutputStream/test.txt");
		// 写出int,ASCII码
		fw.write(97);
		// 写出char数组
		char[] chars = {'a','b','c','d','e'};
		fw.write(chars);
		// 写出字符数组中,从第0位开始,写出两个
		fw.write(chars,0,2);
		// 写出字符串
		fw.write("abcde");
		// 写出字符串,从第0位开始,写出2个
		fw.write("abcde",0,2);
		// 写出字符
		fw.write('a');
		// 刷缓存
		fw.flush();
		// 关闭资源
		fw.close();
	}

3. 缓存流

        3.1 概述

        【特点】

                主要是为了提高效率而存在的,减少物理读取次数

                提供readLine()、newLine()这样的便捷的方法(针对缓冲字符流)

                在读取和写入时,会有缓存部分,调用flush为刷新缓存,将内存数据写入到磁盘

         3.2 BufferReader

public static void main(String[] args) throws IOException {
		// 字节输入流
		FileInputStream fis = new FileInputStream("./src/Day21/BufferedReader_01.java");
		// 字节输入缓冲流,需要把字节输入流对象传入
		BufferedInputStream bis = new BufferedInputStream(fis);
		// 使用方式 参考 字节输入流即可,方法作用一样
		// 先开启的后关闭,关闭缓冲流的时候,会自动把节点流也关闭
		bis.close();
		// fis.close();
		// System.out.println(fis.read());
		// 字符输入流
		FileReader fr = new FileReader("./src/Day21/BufferedReader_01.java");
		// 字符输入缓冲流
		BufferedReader br = new BufferedReader(fr);
		// 新增读取一行的方法,其他方法参考字符输入流
		// 返回值为字符串类型,返回此次读到的数据,如果到达文件末尾,返回null
		// 不读取换行符
		// br.readLine();
		String temp = null;
		while ((temp = br.readLine()) != null) {
			System.out.println(temp);
		}
		br.close();
	}

        3.3 BufferedWriter

public static void main(String[] args) throws IOException{
		// 字节输出流对象
		FileOutputStream fos = new FileOutputStream("./src/test.txt");
		// 字节输出缓冲流对象
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		// 使用方式同字节输出流一致
		bos.close();
		// 字符输出流
		FileWriter fw = new FileWriter("./src/test.txt");
		// 字符输出缓冲流
		BufferedWriter bw = new BufferedWriter(fw);
		//新增一个写出换行的方法,其他方法参考字符输出流,使用方式一样
		bw.newLine();
	}

4. 转换流

public static void main(String[] args) throws Exception {
		//创建字节输入流
		FileInputStream fis = new FileInputStream("./src/test.txt");
		// System.out.println((char)fis.read0);
		//InputStreamReader isr = new InputStreamReader(fis):
		// 如果我们编码环境不一致,会出现乱码问题,此时可以再构造方法中传入对应编码解决乱码问题
		// 通过记事本,另存为,保存为 ANSI编码(GBK),由于我们软件环境为UTF-8格式
		// 所以直接读取会出现码问题,要么把eclipse的编码设置为GBK可以解决,要么就创建对象时指定文件编码解决
		InputStreamReader isr = new InputStreamReader(fis,"GBK");
		int temp = 0;
		while ((temp = isr.read()) != -1) 
			System.out.println((char) temp);
	}

 5. 打印流

        5.1 概述

        [特点]
        打印流是输出最方便的类
        包含字节打印流 PrintStream.字符打印流 PrintWriter

        PrintStream是 OutputStream,的子类,把一个输出流的实例传递到打印流之后,可以更加方便地输出内容,相当于把输出流重新包装一下

        PrintStream 类的 print0方法被重载很多次 print(int i)、print(boolean b)、print(charc)
        使用StringReader 读取字符串,然后使用打印流打印到控制台
        [标准输入/输出]

        Java 的标准输入/输出分别通过 System.in 和 System.out 来代表,在默认的情况下分别代表键盘和显示器,当程序通过 System.in 来获得输入时,实际上是通过键盘获得输入。当程序通过 System.out 执行输出时,程序总是输出到屏幕
        在 System 类中提供了三个重定向标准输入/输出的方法
                static void setErr(PrintStream err) 重定向“标准”错误输出流
                static void setln(lnputStream in) 重定向“标准”输入流
                static void setQutPrintStream out)重定向“标准”输出流

         5.2 使用方式

public static void main(String[] args) throws IOException {
		// 字节输出流
		FileOutputStream fos = new FileOutputStream("./src/test.txt");
		//包装输出流,时输出操作更便捷
		// 字节打印流
		PrintStream ps = new PrintStream(fos);
		ps.println(false);
		ps.println(123);
		ps.println("你好吗");
		// 字符输出流
		FileWriter fw = new FileWriter("./src/test.txt");
		// 字符打印流
		PrintWriter pw = new PrintWriter(fw);
		pw.println("你在哪?");
		pw.println(321);
		pw.flush();
		// System中 默认的out 是打印在控制台,但是可以修改打印路径
		System.out.println("开始执行");
		System.setOut(ps);
	}

6. 数据流

        6.1 概述

        数据流 是为了不同平台之间数据读取的统一性 Linux,Windows等操作系统对数据进行存储的时候方式是不同的

        为了解决之间的差异性java提供了两个轻量级的方法,只要每个平台有java环境,就能保证数据的一致性

        比如 在进行网络协议传输的时候,是非常适用的

         6.2 使用

public static void main(String[] args) throws IOException {
		FileOutputStream fos = new FileOutputStream("./src/test.txt");
		DataOutputStream dos = new DataOutputStream(fos);
		// 以特定类型写出
		dos.writeInt(123);
		dos.writeLong(321);
		dos.writeUTF("你好吗");
		dos.flush();
		dos.close();
		FileInputStream fis = new FileInputStream("./src/test.txt");
		DataInputStream dis = new DataInputStream(fis);
		// 必须要按照写出的先后顺序及类型,去读取
		System.out.println(dis.readInt());
		System.out.println(dis.readLong());
		System.out.println(dis.readUTF());
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值