java基础---IO输入输出流

https://www.cnblogs.com/whgk/p/6920018.html 大佬的文章

- 四个基本抽象类的继承关系分

1.InputStream 字节输入流

java基础---IO输入输出流_第1张图片



2.OutputStream 字节输出流

java基础---IO输入输出流_第2张图片



3.Reader 字符输入流

java基础---IO输入输出流_第3张图片



4.Writer 字符输出流

java基础---IO输入输出流_第4张图片






1. FileWriter和FileReader(文件字符流

1. FileWriter输出文件

public static void main(String[] args) throws IOException {
		//创建输出流对象
		//FileWriter fw = new FileWriter("c.txt");
		FileWriter fw = new FileWriter("c.txt",true); //表示追加写入,默认是false
		
		//输出的内容
		for(int x=0; x<10; x++) {
			fw.write("hello"+x);
			fw.write("\r\n");
		}
		
		//释放资源
		fw.close();
	}




2. FileReader读取文件

public static void main(String[] args) throws IOException {
		//创建输入流对象
		FileReader fr  = new FileReader("FileWriterDemo.java");
		//创建输出流对象
		FileWriter fw = new FileWriter("Copy.java");
		
		//读写数据
		char[] chs = new char[1024];
		int len;
		while((len=fr.read(chs))!=-1) {
			fw.write(chs, 0, len);
		}
		
		//释放资源
		fw.close();
		fr.close();
	}




3. 拷贝文件

/*
 * 需求:
 * 		把项目路径下的FileWriterDemo.java中的内容复制到项目路径下的Copy.java中
 * 
 * 数据源:
 * 		FileWriterDemo.java -- 读数据 -- FileReader
 * 目的地:
 * 		Copy.java -- 写数据 -- FileWriter
 */
public static void main(String[] args) throws IOException {
		//创建输入流对象(FileWriterDemo.java是本地文件)
		FileReader fr  = new FileReader("FileWriterDemo.java");
		//创建输出流对象(Copy.java拷贝之后的文件)
		FileWriter fw = new FileWriter("Copy.java");
		
		//读写数据(建议填写1024的整数倍)
		char[] chs = new char[1024];
		int len;
		while((len=fr.read(chs))!=-1) {
			fw.write(chs, 0, len);
		}
		
		//释放资源
		fw.close();
		fr.close();
	}







2. BufferedWriter和BufferedReader(缓冲字符流

1. 读取和输入文件

public static void main(String[] args) throws IOException {
		//创建输出缓冲流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
		bw.write("hello");
		//bw.flush();
		bw.close();
		
		
		//创建输入缓冲流对象
		BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java"));
		//一次读写一个字符数组
		char[] chs = new char[1024];
		int len;
		while((len=br.read(chs))!=-1) {
			System.out.print(new String(chs,0,len));
		}
		
		//释放资源
		br.close();
		
	}




2. 拷贝文件

	//缓冲流一次读写一个字符串
	public static void method5(String srcFileName,String destFileName) throws IOException {
		//创建输入缓冲流对象
		BufferedReader br = new BufferedReader(new FileReader(srcFileName));
		//创建输出缓冲流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName));
		
		//一次读写一个字符串(一次读写一行)
		String line;
		while((line=br.readLine())!=null){
			bw.write(line);//读一行但不包括换行符
			bw.newLine();//换行符
			bw.flush();
		}
		
		//释放资源
		bw.close();
		br.close();
	}




3. File类(操作文件)

  • 作用:只能操作文件和文件夹,不能操作文件内容
  • 对象:它的构造方法相当于对于一个路径(构造方法中写的路径)的引用
  • 大概方法:创建 删除 判断 获取 修改 -->都是对文件和文件夹进行操作的




4.OutputStream和InputStream(字节流)

1. 复制文本文件(字符流方法差不多,省略)

  • 注意:字节流传输的时候传的是字节或字节数据(byte),字符流传的是字符或字符数组(Char)
public static void main(String[] args) throws IOException  {
		//创建字节输入流对象
		FileInputStream fis = new FileInputStream("IODemo.java");
		//创建字节输出流对象
		FileOutputStream fos = new FileOutputStream("d:\\a\\IODemo.java");
		
		//一次读写一个字节
		/*int by;
		while((by = fis.read()) != -1) {
			fos.write(by);
		}*/
		//一次读写一个字节数组
		int len;//存储读到的字节个数
		byte[] bys = new byte[1024];
		while((len = fis.read(bys)) != -1) {
			fos.write(bys,0,len);
		}
		
		
		//释放资源
		fos.close();
		fis.close();
	}




2. 复制图片

  • 注意 :字节流可以操作所有类型的文件,因为所有的文件在计算机中都是以字节形式存储
  •              而字符流只能用来操作纯文本类型的文件,不能操作字节类型的文件
				字节流
public static void main(String[] args) throws IOException  {
		//创建字节输入流对象
		FileInputStream fis = new FileInputStream("传智学院.jpg");
		//创建字节输出流对象
		FileOutputStream fos = new FileOutputStream("d:\\传智学院.jpg");
		
		//一次读写一个字节数组
		int len;//用于存储读到的字节个数
		byte[] bys = new byte[1024];
		while((len = fis.read(bys)) != -1) {
			fos.write(bys,0,len);
		}
		
		//释放资源
		fos.close();
		fis.close();
	}
				字符流
public static void main(String[] args) throws IOException  {
		//创建字符输入流对象
		FileReader fr = new FileReader("传智学院.jpg");
		//创建字符输出流对象
		FileWriter fw = new FileWriter("d:\\传智学院.jpg");
		
		//一次读写一个字符数组
		int len;//用于存储读到的字符个数
		char[] chs = new char[1024];
		while((len = fr.read(chs)) != -1) {
			fw.write(chs,0,len);
			fw.flush();
		}
		
		//释放资源
		fw.close();
		fr.close();
	}




5. OutputStreamWriter和InputStreamReader(转换流)

1. OutputStreamWriter:将字节输出流换为字符输出流

public static void main(String[] args) throws IOException   {
		//method2();
		
		//创建输入流对象
		BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
		//创建输出流对象
		//OutputStream os = System.out;
		//Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象
		//BufferedWriter bw = new BufferedWriter(w);
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		//进行数据的读写
		String line;//用于存储读取到的数据
		while((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
		}
		
		//释放资源
		bw.close();
		br.close();
		
		
	}




2. InputStreamReader:将字节输入流换为字符输入流

	public static void main(String[] args) throws IOException  {
		//创建输入流对象
		InputStream is = System.in;
		Reader r = new InputStreamReader(is);
		//创建输出流对象
		FileWriter fw = new FileWriter("a.txt");
		
		//读写数据
		char[] chs = new char[1024];
		int len;
		while((len = r.read(chs)) != -1) {
			fw.write(chs,0,len);
			fw.flush();
		}
		
		//释放资源
		fw.close();
		is.close();
		
	}




6. 打印流(PrintWriter)

  • 作用 :打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.
  • 使用场景 :response.getWriter().print(responseMessage); --> 这是response里面返回参数的方法
  • 方法 :字符打印流 PrintWriter
    void print(String str): 输出任意类型的数据,
    void println(String str): 输出任意类型的数据,自动写入换行操作
/*
 * 打印流的特有功能:
 * 		自动换行 使用方法println()实现自动换行
 * 		自动刷新  创建PrintWriter对象时启动自动刷新开关,并且使用println等3个方法可以实现自动刷新
 * 
 * 注意:创建FileWriter对象时boolean参数是是否追加,
 * 		而创建打印流对象的boolean类型参数是是否自动刷新
 */
public static void main(String[] args) throws IOException  {
		//创建输入流对象
		BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
		//创建打印流对象
		PrintWriter pw = new PrintWriter(new FileWriter("d:\\SystemInOutDemo.java"),true);
		
		String line;//用于存储读取到的每行数据
		while((line = br.readLine()) != null) {
			pw.println(line);
		}
		
		//释放资源
		pw.close();
		br.close();
	}

7. 对象操作流(也叫序列化流 )

  • 用于从流中读取对象的
    ObjectInputStream 称为 反序列化流,利用输入流从文件中读取对象
    ObjectOutputStream 称为 序列化流,利用输出流向文件中写入对象
  • 特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。
/*
 * 解决对实现序列化接口出现的黄色警告问题
 * Exception in thread "main" java.io.InvalidClassException
 * 当 Serialization 运行时检测到某个类具有以下问题之一时,抛出此异常。 
		该类的序列版本号与从流中读取的类描述符的版本号不匹配 
		该类包含未知数据类型 
		该类没有可访问的无参数构造方法 
 * 
 */

//读取学生对象
	private static void method2() throws IOException, FileNotFoundException, ClassNotFoundException {
		//创建对象输入流的对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c.txt"));
		//读取对象
		Object obj = ois.readObject();
		System.out.println(obj);
		//释放资源
		ois.close();
	}
	
	//写出学生对象
	private static void method() throws IOException, FileNotFoundException {
		//创建对象输出流的对象
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c.txt"));
		//创建的学生对象
		Student s = new Student("qianqi",28);
		//写出学生对象
		oos.writeObject(s);
		//释放资源
		oos.close();
	}

你可能感兴趣的:(java基础---IO输入输出流)