android基础学习-java篇day10-step3-第六节:java输入输出流

主要内容

  • File类的使用
  • 字节流
  • 字符流
  • 对象的序列化和反序列化

输出流:

将数据写入到输出设备当中

输入流 :

从输入设备当中读取数据,将数据读取到程序当中

 File类

什么是文件?

文件可认为是相关记录或放在一起的数据的集合

在java中,使用java,io.File类对文件进行操作。

File相关方法:

创建目录、创建文件的简单使用

package com.demo.day10.file;

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

public class FileDemo {

	public static void main(String[] args) {
		// 创建File对象
		//File file=new File("/Users/mac/Documents/java/demo/aa.txt");
		//File file=new File("/Users/mac/Documents/java","demo/aa.txt");
		File file=new File("/Users/mac/Documents/java");
		File file1=new File(file,"demo/aa.txt");
		//判断是文件还是目录
		System.out.println("是否是目录"+file1.isDirectory());
		System.out.println("是否是文件"+file1.isFile());
		//创建目录
		//File file2=new File("/Users/mac/Documents/java","demo2");
		File file2=new File("/Users/mac/Documents/java","demo3/demo3_3");
		if(!file2.exists()) {//判断demo2是否存在
			//file2.mkdir();//创建demo2目录
			file2.mkdirs();//创建多级目录, demo3/demo3_3
		}
		//创建文件
		File file3=new File("/Users/mac/Documents/java","demo2/bb.txt");
		if(!file3.exists()) {
			try {
				file3.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

}

字节流

  • 字节输入流InputStream

  • 字节输出流OutpunStream

 FileInputStream

  • 从系统中的某个文件中获得输入字符

  • 用于读取诸如图像数据之类的原始字节流

常用方法:

方法名 描述
public int read() 从输入流中读取一个数据字节
public int read(byte[] b) 从输入流中将最大b.length个字节的数据读入一个byte数组中
public int read(byte[] b,int off,int len) 从输入流中将最大len个字节的数据读入byte数组中
public void close() 关闭此文件输入流并释放与此流有关的额所以系统资源

如果返回值为-1.则表示已经到达文件的末尾。

常用方法使用案例:

package com.demo.day10.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/*
 * aa.txt
 * 里面的内容是 Hello,World!
 */

public class FileInputStreamDemo {

	public static void main(String[] args) {
		// 创建一个FileInputStream的对象
		try {
			FileInputStream fis=new FileInputStream("/Users/mac/Documents/java/demo/aa.txt");//绝对路径
//			int n=fis.read();//读取aa.txt文件的一个字节的数据
//			System.out.println((char)n);//输出H
			int n;
			//循环读取文件的数据
			while((n=fis.read())!=-1) {//当读取返回值是-1说明是到末尾了
				System.out.print((char)n);//输出H
			}
			fis.close();//关闭输入流
			System.out.println("\n=====下面是read(b,off,len)的使用====");
			FileInputStream fis2=new FileInputStream("/Users/mac/Documents/java/demo/aa.txt");//绝对路径
			byte[] b=new byte[100];
			//fis2.read(b);
			fis2.read(b, 0, 5);//偏移量,从第0个开始读,长度为5
			System.out.println(new String (b));//将字节数组转字符串对象输出
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

输出结果:

Hello,World!
=====下面是read(b,off,len)的使用====
Hello

 FileOutputStream

文件输出流

常用方法:

方法名 描述
public int write() 从输入流中读取一个数据字节
public int write(byte[] b) 从输入流中将最大b.length个字节的数据读入一个byte数组中
public int write(byte[] b,int off,int len) 从输入流中将最大len个字节的数据读入byte数组中
public void close() 关闭此文件输入流并释放与此流有关的额所以系统资源

字符的添加、图片拷贝简单实现:

package com.demo.day10.file;

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

public class FileOutputStreamDemo {

	public static void main(String[] args) {
		//创建一个FileOutputStream对象
		try {
			//文件输出流
			FileOutputStream fos=new FileOutputStream("/Users/mac/Documents/java/demo/aa.txt");
			//文件输入流
			FileInputStream fis=new FileInputStream("/Users/mac/Documents/java/demo/aa.txt");
			//照片拷贝
			//文件输出流
			FileOutputStream fos1=new FileOutputStream("/Users/mac/Documents/java/demo/pigcopy.jpg");
			//文件输入流
			FileInputStream fis1=new FileInputStream("/Users/mac/Documents/java/demo/pig.jpg");
			
			
			try {
				//文字读写
				fos.write(50);
				fos.write('a');
				int n;
				while((n=fis.read())!=-1) {
					System.out.print((char)n);
				}
//				System.out.println(fis.read());
//				System.out.println((char)fis.read());
				fos.close();
				fis.close();
				//图片拷贝 是个读写过程
				byte[] b=new byte[1024];
				int n1;
				while((n1=fis1.read(b))!=-1)//从11.jpg中读取数据放到数组b中
				{
					fos1.write(b,0,n1);
				}
				fos1.close();
				fis1.close();
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

	}

}

字节缓冲流

  • 缓冲输入流BufferedInputStream
  • 缓冲输出流BufferedOuputStream

为什么要用缓冲流

  • 文件读写,从硬盘中读取数据,读写速度较慢
  • 缓冲流是从内存中读取数据 ,可以提供读写速度。
  • 与文件输入输出流进行结合使用
  • 其过程就是:在文件读写的基础上再嫁接一个缓冲流,执行缓冲读写后,数据会放到一个指定大小的缓冲区内。如果缓冲区满了,则自动写到文档里面显示;如果没满,要调用flush()方法:刷新释放缓冲区的资源。
package com.demo.day10.file;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedDemo {

	public static void main(String[] args) {
		try {
			// 创建FilesInputStream的对象 输入流
			FileInputStream fis=new FileInputStream("/Users/mac/Documents/java/demo/aa.txt");
			// 创建FilesOutputStream的对象 输出流
			FileOutputStream fos=new FileOutputStream("/Users/mac/Documents/java/demo/aa.txt");
			// 创建BufferedInputStream的对象 输入流
			BufferedInputStream bis=new BufferedInputStream(fis);
			// 创建BufferedInputStream的对象 输出流
			BufferedOutputStream bos=new BufferedOutputStream(fos);
			
			
		
			try {
				//输出流写操作 //写入数据到目标
				bos.write('a');
				bos.write(50);
				bos.flush();//刷新释放缓冲区资源,如果缓冲器没满则释放
				bos.close();
				long startTime=System.currentTimeMillis();//获取系统时间
				//输入流读操作:从输入设备中读取数据
				System.out.println((char)bis.read());
				System.out.println(bis.read());
				bis.close();
				long endTime=System.currentTimeMillis();
				System.out.println(endTime-startTime);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			

			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

输出:

a
50
1

字符字节转换流

用于处理字节流和字符流直接的转换

  • InputStreamReader
  • OutputStreamReader

字符流缓冲区

  • BufferReader
  • BufferWriter
package com.demo.day10.file;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class InputStreamReaderDemp {

	public static void main(String[] args) {
		// 创建一个FileInputStream的对象
		try {
		    //字节输入流
			FileInputStream fis=new FileInputStream("/Users/mac/Documents/java/demo/abc.txt");
			InputStreamReader isr=new InputStreamReader(fis);
			BufferedReader br=new BufferedReader(isr);//字符读缓冲输入流
			
			FileOutputStream fos=new FileOutputStream("/Users/mac/Documents/java/demo/abc_copy.txt");
			OutputStreamWriter osr=new OutputStreamWriter(fos);
			BufferedWriter bw=new BufferedWriter(osr);//字符读缓冲输出流
			char[] b=new char[10];
			int n=0;
//			while((n=isr.read(b))!=-1) {
//				System.out.print((char)n);
//			}
			//方法二
//			while((n=isr.read(b))!=-1) {
//				String s=new String(b,0,n);
//				System.out.print(s);
//			}
			//写入到新的文件当中
			while((n=isr.read(b))!=-1) {
				osr.write(b,0,n);
				osr.flush();
			}
			fis.close();
			fos.close();
			isr.close();
			osr.close();
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 对象序列化与反序列化

  • 序列化:把java对象转换为字节序列的过程
  • 反序列化:吧字节序列恢复为java对象的过程
  • 对象输入流ObjectInputStream

    对象输出流ObjectOut'putStream

 步骤:

  1. -创建一个类,继承Serializable接口
  2. -创建对象
  3. -将对象写入文件
  4. -从文件读取对象信息 

Goods.java 

package com.demo.day10.file;

import java.io.Serializable;

/*
 * 分析商品信息类
 * 属性:
 * -商品编号:id
 * -商品名称:name
 * -商品价格:price
 * 方法:
 * -构造方法
 * -获取和设置属性值的方法
 * -其他方法
 */
public class Goods implements Serializable{
	private String goodsId;
	private String goodsName;
	private double goodsPrice;
	public Goods(String goodsId,String goodsName,double goodsPrice) {
		this.setGoodsId(goodsId);
		this.setGoodsName(goodsName);
		this.setGoodsPrice(goodsPrice);
		
	}

	

	public String getGoodsId() {
		return goodsId;
	}



	public void setGoodsId(String goodsId) {
		this.goodsId = goodsId;
	}



	public String getGoodsName() {
		return goodsName;
	}



	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName;
	}



	public double getGoodsPrice() {
		return goodsPrice;
	}



	public void setGoodsPrice(double goodsPrice) {
		this.goodsPrice = goodsPrice;
	}

   //toString方法
	public String toString() {
	   String str="商品编号:"+goodsId+" "+"商品名称:"+goodsName+" "+"商品价格:"+goodsPrice;
		
	   return str;
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

GoodTest.java 

package com.demo.day10.file;

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

public class GoodsTest {

	public static void main(String[] args) {
		Goods goods1=new Goods("s001","电脑",3000);
		try {
			//创建一个goods.txt文件
			File file= new File("/Users/mac/Documents/java/demo/goods.txt");
			if(!file.exists()) {//如果goods.txt不存在
				try {
					file.createNewFile();//创建这个文件
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		// 创建一个字符输出流对象写入数据
		FileOutputStream fos=new FileOutputStream(file);
		// 创建一个字符输入流对象读取数据
		FileInputStream fis=new FileInputStream(file);
		try {
			ObjectOutputStream oos=new  ObjectOutputStream(fos);
			ObjectInputStream ois=new  ObjectInputStream(fis);
			oos.writeObject(goods1);
			Goods goods2=(Goods)ois.readObject();
			System.out.println(goods2);
			oos.flush();
			oos.close();
			ois.close();
			fis.close();
			fos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

猜你喜欢

转载自blog.csdn.net/qq_17846019/article/details/82683341