java IO流

发布时间 2023-12-08 20:44:52作者: 拾墨、
  • I :input , 输入流 , 从磁盘文件读数据到内存
  • O : Output , 输出流 , 从内存写数据到磁盘文件

1. IO流分类

  • 字节流:最小读取单位为字节,更适合读音视频文件
  • 字符流:最小读取单位为字符,更适合读文本内容

2. 文件字节输入流

(1).每次读取一个字节

缺点:效率低每次只能读一个字节且不能读中文。中文在jbk下是两个字节,utf-8下是三个字节,其读取中文会乱码

(2).每次读取一个字节数组


(3).一次性读完全部字节

3. 文件字节输出流

public static void main(String[] args) throws Exception
	{
		//创建一个文件字节输出流
		//会自动创建文件
		OutputStream os = new FileOutputStream(new File("C:\\files\\poems\\李白诗3.txt"));
		
		//写数据出去
		os.write('a'); //写一个字节
		
		byte[]buffer = {'a',97,98,99}; //写一个数组进去
		os.write(buffer);
		
		byte[]buffe2 = "我和我的祖国".getBytes(); //写中文
		os.write(buffe2);
		
		//写数据必须刷新
		os.flush();
		
		//关闭流
		os.close();
		
	}

4. 文件拷贝

public static void main(String[] args) throws Exception
	{
		//将poem文件拷贝到李白诗集文件
		InputStream is = new FileInputStream("C:\\java作业\\2022013281王英和\\src\\poem.txt");
		OutputStream os = new FileOutputStream("C:\\java作业\\2022013281王英和\\src\\李白诗集.txt");
		
		//输入流将文件输入到内存(数组)中
		byte[] buffer = is.readAllBytes();
		//输出流将内存(数组)数据输出到文件中
		os.write(buffer);
	} 

5. 文件字符输入流

文件字符输入流 : Reder

(1). 每次读取一个字符

FileReader fr = new FileReader("C:\\java作业\\2022013281王英和\\src\\poem.txt");
		
		int len;
		while((len = fr.read())!= -1)
		{
			System.out.print((char)len);
		}

(2). 每次读取一个字符数组

FileReader fr = new FileReader("C:\\java作业\\2022013281王英和\\src\\poem.txt");
		
		char []buffer = new char[1024];
		int len;
		while((len = fr.read(buffer))!= -1)
		{
			String rs = new String (buffer,0,len);
			System.out.print(buffer);
		}

6. 文件字符输出流

文件字符输出流:FileWriter

Writer fw = new FileWriter("C:\\java作业\\2022013281王英和\\src\\李白诗集.txt");
		
		char[] buffer = "我爱你中国".toCharArray();
		//输出流将内存(数组)数据输出到文件中
		fw.write(buffer);
		
		fw.flush();
		fw.close();

7. 缓冲流

(1). 字节缓冲流

public static void main(String[] args) throws Exception
	{
		InputStream is = new FileInputStream("C:\\java作业\\2022013281王英和\\src\\poem.txt");
		InputStream bis = new BufferedInputStream(is);
		
		OutputStream os = new FileOutputStream("C:\\java作业\\2022013281王英和\\src\\李白诗集.txt");
		OutputStream bos = new BufferedOutputStream(os);
		
		byte[] buffer = is.readAllBytes();
		os.write(buffer);
	} 

(2). 字符缓冲流

public static void main(String[] args) throws Exception
	{
		Reader is = new FileReader("C:\\java作业\\2022013281王英和\\src\\poem.txt");
		Reader bis = new BufferedReader(is);
		
		Writer os = new FileWriter("C:\\java作业\\2022013281王英和\\src\\李白诗集.txt");
		Writer bos = new BufferedWriter(os);
		
	    char[] buffer = new char[10];
	    int len;
	    while((len = bis.read(buffer))!=-1)
	    {
	    	bos.write(buffer,0,len);
	    }
	    
	    bos.flush();
	    bos.close();
	} 

8. 对象序列化和反序列化

(1). 对象序列化

对象序列化: 以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化
使用对象字节输出流:objectOutputStream

//想序列化必须实现这个接口
public class Student implements Serializable 
{
	int stuID;
	String name;
	String address;
	
	public Student(int stuID,String name,String address)
	{
		this.stuID = stuID;this.name = name;
		this.address = address;
	}
};
public class serialize  {
	
	public static void main(String[]args) throws Exception
	{
		Student s = new Student(1,"abc","xxxx");
	
		ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("C:\\java作业\\2022013281王英和\\dest\\1.txt"));
		
		os.writeObject(s);
	}
}

(2). 对象反序列化

public static void main(String[]args) throws Exception
{
	//反序列化
	ObjectInputStream is = new ObjectInputStream(new FileInputStream("C:\\java作业\\2022013281王英和\\dest\\1.txt"));
	Student s1 = (Student)is.readObject();
		
	System.out.println(s1);
}