Java IO包

本文深入讲解Java IO流的原理及应用,包括节点类、包装类、装饰类等概念,以及如何通过不同类实现文本和二进制文件的读写操作。介绍了BufferedWriter、DataOutputStream等类的使用方法,以及try-with-resources语句优化资源管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java IO包

  • Java读写文件,只能以(数据)流的形式进行读写(Java和文件是两套平行的系统。由于文件可能很大,Java不能一口气将文件都加载进内存,只能以流的方式分批读取)
  • java.io包中
    –节点类:直接对文件进行读写
    –包装类
    • 转化类:字节/字符/数据类型的转化类 (eg:一个int—>4个字节 —>int)
    • 装饰类:装饰节点类 Bufferd
  • 文件系统
    在这里入图片描述

  • 字节:byte,8bit,最基础的存储单位
  • 字符:a,10000(5个字符),我(一个字符)
  • 数据类型:3,3.35,abd (数据类型在文件中也是以字节形式保存)
  • 文件是以字节保存,因此程序将变量保存到文件需要转化

Stream 字节 er 字符 Stream&er 转化

节点类:直接操作文件类

  • InputStream,OutputStream(字节)
    子类:FileInputStream,FileOutputStream
  • Reader,Writer(字符)
    子类:FileReader,FileWriter

转换类:字符到字节之间的转化
– InputStreamReader:文件读取时字节,转化为Java能理解的字符
– OutputStreamWriter:Java将字符转化为字节输入到文件中
– DataInputStream,DataOutPutStream:封装数据流(可直接输出Int,double,自动转换为字节) (数据类型–字节)

装饰类:装饰节点类

– BufferedInputStream, BufferOutputStream:缓存字节流(开一个缓存区,读写速度得到提升)【内存读写速度远快于硬盘,当程序需要保存数据到文件时,通常会在内存中开辟一个缓存区,CPU先指挥快速将数据写入内存缓存区,然后内存缓存区再缓慢转移到硬盘上,解放CPU,提高CPU使用率】
– BufferedRead,BufferWriter:缓存字符

在这里插入图片描述

文本文件读写在这里插入图片描述

FileOutputstream:(节点类)OutputStream的子类,往文件中写字节
OutputStreamWriter:(转换类)字节和字符转化
BufferWriter:写缓冲区类,加速写操作(write写方法,newLine换行方法)

三者关系:BufferWriter(OutputStreamWriter(FileOutputstream))

读文件:

public class TxtFileWriterTest {

	public static void main(String[] args) {
		writerFile1();
		System.out.println("=============");
	}
	
	public static void writerFile1() {
		FileOutputStream fos = null;   // 节点类 负责写字节
		OutputStreamWriter osw = null; //Java将字符转化为字节输入到文件中
		BufferedWriter bw = null;      // 装饰类 缓存字符流
		
		try {
			fos = new FileOutputStream("G:\\abc.txt"); // 节点类
			osw = new OutputStreamWriter(fos, "UTF-8"); // 转化类
			bw = new BufferedWriter(osw);  // 装饰类
			bw.write("we are");
			bw.newLine();
			bw.write("Echuers");
			bw.newLine();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				bw.close(); // 关闭最后一个类,会将所有的底层流都关闭
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}  
		}
		
	}
}

在这里插入图片描述
在这里插入图片描述
写入写出都有两种方式(推荐第二种 try-resource,但是只有JDK7以上有)

try-with-resources语句是一种声明了一种或多种资源的try语句。资源是指在程序用完了之后必须要关闭的对象。try-with-resources语句保证了每个声明了的资源在语句结束的时候都会被关闭。
(如下面的例子第二种方式不用在finally中关闭资源)

public class TxtFileReader {

	public static void main(String[] args) {
		readFile1();
		System.out.println("============");
		readFile2();   // JDK7 以上才能使用
	}

	public static void readFile1() {
		FileInputStream fis = null;
		InputStreamReader isr = null;
		BufferedReader br = null;
		try {
			fis = new FileInputStream("G:\\abc.txt");
			isr = new InputStreamReader(fis, "UTF-8"); 
			// 写时按UTF8写,读时也必须按照UTF8读,注意写时不写这个,默认为OS编码方式
			br = new BufferedReader(isr);
			String line;
			while( (line = br.readLine()) != null) // 每次读取一行
			{
				System.out.println(line);
			} 
		}catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static void readFile2() {
		String line;
//		try-resource语句,自动关闭资源
		try (BufferedReader in = new BufferedReader
				(new InputStreamReader
						(new FileInputStream("G:\\\\abc.txt")))){
			while( (line = in.readLine()) != null) {
				System.out.println(line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

在这里插入图片描述

二进制文件读写
  • 二进制文件
    – 狭义:采用字节编码,非字符编码的文件
    – 广义:一切文件都是二进制文件
    –用记事本等无法打开/阅读
  • 二进制文件读写
    –输出数据到文件中
    –从文件中读取数据
    在这里插入图片描述
    FileOutputstream:(节点类)负责写字节
    BufferedOutputStream:(装饰类)负责写字节数据到缓冲区
    DataOutputStream:(转化类)负责数据类型到字节转化

三者关系:DataOutputStream(BufferedOutputStream(FileOutputstream))


对比:下面是之前的文本文件
在这里插入图片描述

public class BinFileWriter {

	public static void main(String[] args) {
		writeFile();
		System.out.println("done");
	}

	public static void writeFile() {
		FileOutputStream fos = null;
		DataOutputStream dos = null;
		BufferedOutputStream bos = null;
		
		try {
			fos = new FileOutputStream("G://cyf.dat"); //节点类
			bos = new BufferedOutputStream(fos);    // 装饰类
			dos = new DataOutputStream(bos);        // 装饰类
			
			dos.writeUTF("A");
			dos.writeInt(20);
			dos.writeInt(180);
			dos.writeUTF("b");
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			try {
				dos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}


详细代码不在详述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值