Java IO包

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中关闭资源)

扫描二维码关注公众号,回复: 12569540 查看本文章
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();
			}
		}
	}
}


详细代码不在详述

猜你喜欢

转载自blog.csdn.net/weixin_44227389/article/details/107338478