java-IO框架

1. File类

File类 此类提供了针对文件或者文件夹操作的相关方法

package com.qfedu.test1;

import java.io.File;
import java.io.IOException;

/**
 * 	File类  此类提供了针对文件或者文件夹操作的相关方法
 * @author WHD
 *
 */
public class TestFile {
	public static void main(String[] args) throws IOException {
		File file1 = new File("A.txt");
		if(!file1.exists()) {
			System.out.println("文件是否创建成功:" + file1.createNewFile());
		}
		System.out.println("创建完成,文件是否存在:" + file1.exists());
		System.out.println("文件的名称为:" + file1.getName());
		System.out.println("文件的大小是:" + file1.length());
		System.out.println("文件是相对路径是:" + file1.getPath());
		System.out.println("文件的绝对路径是:" + file1.getAbsolutePath());
		System.out.println("是否为文件:" + file1.isFile());
		System.out.println("是否为文件夹:" + file1.isDirectory());
		System.out.println("删除文件:" + file1.delete());
		
		System.out.println("文件是否存在:" + file1.exists());
		
		
	}
}

2. 字节流

2.1 读取InputStream
2.1 FileInputStream读取一个字节

read() 每次读取一个字节 返回值为读取的字节的ASCII码 如果读取不到内容返回为-1

package com.qfedu.test2;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 	InputStream 字节读取流父类 抽象类
 * 	FileInputStream 字节读取流
 * 
 * 	read()  每次读取一个字节 返回值为读取的字节的ASCII码 如果读取不到内容返回为-1
 * 	
 * @author WHD
 *
 */
public class TestFileInputStream1 {
	public static void main(String[] args) throws IOException {
		FileInputStream fis = null;
		try {
			
			// 50
			fis = new FileInputStream("A.txt");
			
			int readData = -1;
			
			while((readData = fis.read()) != -1) {
				System.out.println((char)readData);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if(fis != null) {
					fis.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

2.2 FileInputStream读取一个字节数组

read(byte [] data) 每次读取一个byte数组 返回值为读取的个数

读取的内容在数组中 如果读取不到内容返回为-1

package com.qfedu.test3;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * 	read(byte [] data) 每次读取一个byte数组 返回值为读取的个数 
 * 	读取的内容在数组中 如果读取不到内容返回为-1
 * @author WHD
 *
 */
public class TestFileInputStream2 {
	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("A.txt");
		
		byte [] data = new byte[2];
		
		int readCount  = -1;
		
		while((readCount = fis.read(data)) != -1) {
			System.out.println(new String(data, 0, readCount));
		}
		// 关闭资源
		fis.close();
		
	}
}

read(byte [] data) 读取中文,如果定义长度为2的数组,可以读取中文,但是如果中文汉字

是在奇数位,那么将出现乱码,解决方案:

1.定义一个比较长的数组

2.使用字节流的available()方法来定义数组长度(推荐使用)

package com.qfedu.test3;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

/**
 * 	read(byte [] data) 读取中文,如果定义长度为2的数组,可以读取中文,但是如果中文汉字
 * 	是在奇数位,那么将出现乱码,解决方案:
 * 	1.定义一个比较长的数组
 * 	2.使用字节流的available()方法来定义数组长度(推荐使用)
 * @author WHD
 *
 */
public class TestFileInputStream3 {
	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("A.txt");
		
		System.out.println(fis.available());
		
		byte [] data = new byte[fis.available()];
		
		int readCount  = -1;
		
		while((readCount = fis.read(data)) != -1) {
			System.out.println(new String(data, 0, readCount));
		}
		
		// 关闭资源
		fis.close();
		
	}
}

2.2 写入OutputStream
2.2.1 FileOutputStream写入字节

OutputStream

FileOutputStream 字节写入流

write(int data) 每次写入一个字节

package com.qfedu.test4;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 	OutputStream
 * 	FileOutputStream  字节写入流
 * 	write(int data) 每次写入一个字节
 * @author WHD
 *
 */
public class TestFileOutputStream1 {
	public static void main(String[] args) {
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream("B.txt",true);
			fos.write(66);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			// 关闭资源
			if(fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
				
	}
}

2.2.2 FileOutputStream写入字节数组

OutputStream

FileOutputStream 字节写入流

write(byte [] data) 每次写入一个字节数组

我们在创建FileOutputStream对象 可以指定是否追加内容 如果不指定 或者 写为false 表示覆盖之前的内容

写为true表示追加

package com.qfedu.test4;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 	OutputStream
 * 	FileOutputStream  字节写入流
 * 	write(byte [] data) 每次写入一个字节数组
 * 
 * 	我们在创建FileOutputStream对象 可以指定是否追加内容 如果不指定 或者 写为false  表示覆盖之前的内容
 * 	写为true表示追加
 * @author WHD
 *
 */
public class TestFileOutputStream2 {
	public static void main(String[] args) throws IOException {
		FileOutputStream fos = new FileOutputStream("C.txt",true);
		
		byte [] data = {70,71,72,73,74};
		
		fos.write(data);
		
		fos.close();
	}
}

OutputStream

FileOutputStream 字节写入流

write(byte [] data) 每次写入一个字节数组

我们可以直接调用String类的 getBytes()方法 将字符串转换为byte数组

package com.qfedu.test4;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 	OutputStream
 * 	FileOutputStream  字节写入流
 * 	write(byte [] data) 每次写入一个字节数组
 * 	
 * 	我们可以直接调用String类的 getBytes()方法 将字符串转换为byte数组
 * @author WHD
 *
 */
public class TestFileOutputStream3 {
	public static void main(String[] args) throws IOException {
		FileOutputStream fos = new FileOutputStream("C.txt",true);
		
		String str = "hello world 世界你好999";
		
		byte [] data = str.getBytes();
		
		fos.write(str.getBytes());
		
		fos.close();
	}
}

3. 字符流

3.1 读取Reader
3.1.1 InputStreamReader

Reader 字符读取流父类 抽象类

InputStreamReader 子类

read() 每次读取一个字符

package com.qfedu.test5;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 	Reader 字符读取流父类 抽象类
 * 	InputStreamReader 子类
 * 	read()  每次读取一个字符
 * @author WHD
 *
 */
public class TestInputStreamReader1 {
	public static void main(String[] args) {
		// 局部变量必须先赋值 才能使用
		FileInputStream fis = null;
		InputStreamReader reader = null;
		try {
			fis = new FileInputStream("A.txt");
			reader = new InputStreamReader(fis);
			
			int readData = -1;
			
			while((readData = reader.read()) != -1) {
				System.out.println((char)readData);
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			// 关闭资源  先用后关
			try {
				if(reader != null) {
					reader.close();
				}
				if(fis != null) {
					fis.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Reader 字符读取流父类 抽象类

InputStreamReader 子类

read(char [] data) 每次读取一个字符数组

package com.qfedu.test5;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 	
 * 	Reader 字符读取流父类 抽象类
 * 	InputStreamReader 子类
 * 	read(char [] data)  每次读取一个字符数组
 * @author WHD
 *
 */
public class TestInputStreamReader2 {
	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("A.txt");
		
		InputStreamReader reader = new InputStreamReader(fis);
		
		char [] data = new char[5];
		
		int readCount = -1;
		
		while((readCount = reader.read(data)) != -1) {
			System.out.println(new String(data,0,readCount));
		}
		
	}
}

读取位于桌面的hello.txt文件

读取文件如果编码格式不一致会导致乱码

解决方案:将编码格式统一

1.使用两个参数的InputStreamReader构造方法 第二个参数指定编码格式

2.将源文件编码格式改为和JDK编码格式一直 ANSI—GBK

package com.qfedu.test5;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 	读取位于桌面的hello.txt文件
 * 	读取文件如果编码格式不一致会导致乱码
 * 	解决方案:将编码格式统一
 * 	1.使用两个参数的InputStreamReader构造方法 第二个参数指定编码格式
 * 	2.将源文件编码格式改为和JDK编码格式一直   ANSI---GBK
 * @author WHD
 *
 */
public class TestInputStreamReader3 {
	public static void main(String[] args) throws IOException {
		System.getProperties().list(System.out);
		
		
		FileInputStream fis = new FileInputStream("C:/Users/WHD/Desktop/hello.txt");
		
		InputStreamReader reader = new InputStreamReader(fis);
		
		char [] data = new char[6];
		
		int readCount = -1;
		
		while(( readCount = reader.read(data)) != -1){
			System.out.println(new String(data,0,readCount));
		}
		reader.close();
		fis.close();
		
	}
}

3.1.2 FileReader

Reader

InputStreamReader

FileReader 只能按照本地平台默认的编码格式来读取文件

package com.qfedu.test6;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * 	Reader
 * 	InputStreamReader
 * 	FileReader 只能按照本地平台默认的编码格式来读取文件
 * @author WHD
 *
 */
public class TestFileReader {
	public static void main(String[] args) throws IOException {
		FileReader reader = new FileReader("A.txt");
		
		char [] data = new char[100];
		
		reader.read(data);
		
		System.out.println(new String(data,0,data.length));
		
		reader.close();
	}
}

3.1.3 BufferedReader

Reader

BufferedReader InputStreamReader

BufferedReader 带有缓冲区的字符读取流 可以提高字符读取的效率

独有 readLine()方法 每次读取一行

package com.qfedu.test6;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 	Reader
 * 	BufferedReader  InputStreamReader
 * 
 * 	BufferedReader 带有缓冲区的字符读取流 可以提高字符读取的效率
 * 	独有 readLine()方法 每次读取一行
 * @author WHD
 *
 */
public class TestBufferedReader {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("A.txt")));

		String line = null;

		while((line = br.readLine() ) != null) {
			System.out.println(line);
		}

		br.close();

	}
}

3.2 写入Writer
3.2.1 OutputStreamWriter

Writer

OutputStreamWriter 可以指定写入文件的编码格式 如果不指定 将按照本地平台默认的编码格式写入 GBK

write()

package com.qfedu.test7;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/**
 * 	Writer
 * 	OutputStreamWriter 可以指定写入文件的编码格式 如果不指定 将按照本地平台默认的编码格式写入 GBK
 * 	
 * 	write()
 * @author WHD
 *
 */
public class TestOutputStreamWriter {
	public static void main(String[] args) {
		try {
			OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D.txt",true),"utf-8");
		
			osw.write("hello world世界你好6666");
		
			osw.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

3.2.2 FileWriter

Writer

OutputStreamWriter

FileWriter 只能按照本地平台默认的编码格式写入文件

package com.qfedu.test7;

import java.io.FileWriter;
import java.io.IOException;

/**
 * 	Writer
 * 	OutputStreamWriter
 * 	FileWriter  只能按照本地平台默认的编码格式写入文件
 * @author WHD
 *
 */
public class TestFileWriter {
	public static void main(String[] args) {
		FileWriter fw = null;
		try {
			fw = new FileWriter("E.txt");
			
			fw.write("hello world 世界好2356.0");
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if(fw != null) {
					fw.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

3.2.3 BufferedWriter

Writer

BufferedWriter 带有缓冲区的字符写入流 可以提高写入的效率

package com.qfedu.test7;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/**
 * 	Writer
 * 	BufferedWriter 带有缓冲区的字符写入流 可以提高写入的效率 
 * @author WHD
 *
 */
public class TestBufferedWriter {
	public static void main(String[] args) throws IOException {
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("F.txt")));
		
		bw.write("abc\ndefg");
		
		bw.newLine();
		
		bw.write("世界\n你好");
		
		bw.close();
		
	}
}

4.数据流(字节流)

DataInputStream负责读取二进制文件 read()

DataOutputStream负责写入二进制文件 write()

以上两个类均属于字节流

package com.qfedu.test1;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 	DataInputStream负责读取二进制文件  read()
 * 	DataOutputStream负责写入二进制文件  write()
 * 
 * 	
 * @author WHD
 *
 */
public class TestDataStream {
	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("D:\\beautyGirls\\GOGO全球高清大胆美女花苑制服诱惑丝袜美腿丝袜亚洲综合\\3ad2b7e86f.jpg");
		
		DataInputStream dis = new DataInputStream(fis);
		
		byte [] data = new byte[ fis.available()];
		
		dis.read(data); // 读取完毕 然后写入
		
//		System.out.println(new String(data,0,data.length));
		
		DataOutputStream dos = new DataOutputStream(new FileOutputStream("C:\\Users\\WHD\\Desktop\\hello.jpg"));	
		
		dos.write(data);
		
		// 关闭资源  先用后关 
		
		dos.close();
		dis.close();
		fis.close();
	}
}

5.对象流(字节流)

序列化:将对象以流的形式保存在二进制文件中,称之为序列化

反序列化:将保存有对象的二进制文件读取为对象,称之为反序列化

ObjectInputStream负责读取对象 readObject()

ObjectOutputStream负责写入对象 writeObject()

需要序列化的类必须实现Serializable接口

package com.qfedu.test2;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 	序列化:将对象以流的形式保存在二进制文件中,称之为序列化
 * 	反序列化:将保存有对象的二进制文件读取为对象,称之为反序列化
 * 	
 * 	ObjectInputStream负责读取对象  readObject() 
 * 	ObjectOutputStream负责写入对象 writeObject() 
 * 	
 * 	需要序列化的类必须实现Serializable接口
 * @author WHD
 *
 */
public class TestObjectStream {
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		Student stu1 = new Student("赵四", 20, "象牙山");
		Student stu2 = new Student("大拿", 21, "象牙山");
		Student stu3 = new Student("广坤", 22, "象牙山");
		
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("stu.txt"));
		
		oos.writeObject(stu1);
		oos.writeObject(stu2);
		oos.writeObject(stu3);
		
		// 以上代码实现对象写入 接下来继续读取对象
		FileInputStream fis = new FileInputStream("stu.txt");
		
		ObjectInputStream ois = new ObjectInputStream(fis);
		
//		Object obj1 = ois.readObject();
//		
//		if(obj1 instanceof Student) {
//			Student s1 = (Student) obj1;
//			System.out.println(s1);
//		}
//		
//		Object obj2 = ois.readObject();
//		
//		if(obj2 instanceof Student) {
//			Student s1 = (Student) obj2;
//			System.out.println(s1);
//		}
//		
//		Object obj3 = ois.readObject();
//		
//		if(obj3 instanceof Student) {
//			Student s1 = (Student) obj3;
//			System.out.println(s1);
//		}
		
		while(fis.available() > 0) { // 判断流中的可读字节数 可读字节数会随着读取 指针的移动  不断减少
			Object obj = ois.readObject();
			if(obj instanceof Student) {
				Student s = (Student) obj;
				System.out.println(s);
			}
		}

	}
}
package com.qfedu.test2;

import java.io.Serializable;

public class Student implements Serializable{
	private String name;
	private int age;
	private transient String address;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Student() {
	}
	public Student(String name, int age, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值