JAVA基础_io流

1.文件(File)流

  • 文件流的数据读写都是基于文件的操作
//导包
import java.io.File;

//创建目录
File f = new File("D:\\test");
f.mkdir();//创建单层目录

File f = new File("D:\\test\\aa\\bb");
f.mkdirs();//创建多层目录

//新建文件几种方式
/*
 * createNewFile() 方法,根据抽象路径创建一个新的空文件,当抽象路径下的文件存在时,创建失败
 * 如果E:/test 目录下没有 1.txt文件,则创建该文件;如果1.txt已经存在,那么文件创建失败
 * 如果没有test目录,则直接抛出异常;
*/

File f = new File("D:\\test\\aa\\tt.txt");//方式1
f.createNewFile();

File f1 = new File("D:/test/aa/tt.txt");//方式2
f1.createNewFile();

File f2 = new File("D:" + File.separator + "test\\aa\\tt.txt");//方式3
f2.createNewFile();

File f3 = new File("D:\\test","aa\\tt.txt");//方式4
f3.createNewFile();
	

文件输入流读取案例:

import java.io.FileInputStream;
/**
* 文件字节输入流FileInputStream
* 
*  在读取文件时,必须保证该文件已存在,否则出异常
*/

public class fileStream {
	public static void main(String[] args) {
		try {
			int len = 0;
			FileInputStream inputStream = new FileInputStream("F:/test/tt.txt");
			byte[] by = new byte[1000]; //设置一个byte数组接收读取的文件的内容
			len =inputStream.read(by); //读取文件字节长度
			if (len != 0) {
                //new String(b,0,len),参数1是缓冲数据的数组,参数2是从数组的那个位置开始转化字符串,参数3是总共转化几个字节
				System.out.println(new String(by,0,len));
			}
			by.clone();//流在使用完毕之后要关闭
			
		} catch (Exception e) {
			e.printStackTrace();
		}
				

	}

}

文件输出流案例:

//实现复制一个文件到指定文件夹下

public class fileStream {
	public static void main(String[] args) {	
		try {
			fileStream.testFileOutputStream("F:/test/test01.txt","F:/test/tt.txt");
            fileStream.testFileOutputStream("F:/test/test01.png","F:/test/tt.png");
		} catch (IOException e1) {
			e1.printStackTrace();
		}
    }

	/**
	 * 文件字节输出流FileOutputStream
	 * @throws IOException 
	 */
	public static void testFileOutputStream(String intPath, String outPath) throws IOException {
		try {
			
			FileOutputStream outputStream = new FileOutputStream(intPath);
			
			//从文件中读取
			FileInputStream inputStream = new FileInputStream(outPath);
			byte[] byte1= new byte[1000];
			int len = inputStream.read(byte1);

			outputStream.write(byte1,0,len); //把数据写入内存
			outputStream.flush();//把内存中的数据刷写到硬盘
			outputStream.close();
            inputStream.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
  • 注意:文件字节流非常通用,可以用来操作字符的文档,还可以操作任何的其他类型文件(图片,压缩包等等),因为字节流直接使用二进制

  • 文件字符流与文件字节流区别在于创建的临时存放数组,一个是字节数组,一个是字符数组

  • 文件字符流创建文件使用的是FileReader和FileWriter,而文件字节流创建使用的是FileInputStream和FileOutputStream

2.缓冲(Buffer)流

  • 缓冲流的数据读写都是基于内存的操作
  • 缓冲字节流使用的是BufferedInputStream和BufferedOutputStream
  • 缓冲字符流使用的是BufferedReader和BufferedWriter
  • 缓冲流是先把数据缓冲到内存,然后再内存中做io操作

缓冲流读取输出案例:

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

public class Test {
	public static void main(String[] args) throws Exception {
		Test.testBufferedInputStream();
		Test.testBufferedOutputStream();
	}
	
	/**
	 * 缓冲字节输入流 BufferedInputStream
	 * @throws Exception 
	 */
	public static void testBufferedInputStream() throws Exception {
		FileInputStream inputStream =new FileInputStream("F:/test/tt.txt");//先从磁盘读取文件到字节流中
		BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
		byte[] b = new byte[1024];
		int len = 0;
		while ((len = bufferedInputStream.read(b)) != -1) {
			System.out.println(new String(b,0,len));
		}
		bufferedInputStream.close();
		inputStream.close();
	}
	
	/**
	 * 缓冲字节输出流 BufferedOutputStream
	 * @throws Exception 
	 */
	public static void testBufferedOutputStream() throws Exception {
		FileOutputStream fileOutputStream = new FileOutputStream("F:/test/tt02.txt");
		BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
		
		String str = "aaaaabbbbbcccc";
		bufferedOutputStream.write(str.getBytes());
		bufferedOutputStream.close();
		fileOutputStream.close();
	}
}

3.转换流

  • 转换输入流InputStreamReader和转换输出流OutputStreamWiter

4.对象(Object)流

  • 把一个对象转化为一个数据进行读写
  • ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
  • 对象流存在原因:因为需要保存对象到硬盘(对象的持久化)和对象的网络传输
  • 序列化(Serialize)是将对象转换为二进制流,反序列化(Deserialize)是将二进制流转换为对象

对象序列化案例:

  • 先创建可被序列化的对象Person类,被序列化的对象有一个标实版本的静态变量 serialVersionUID
import java.io.Serializable;

/**
 * 创建一个可以序列化与反序列化的对象
 */
public class Person implements Serializable{

	/**
	 * 一个表示序列化版本标识符的静态变量
	 * 用来表明类的不同版本间的兼容性
	 */
	private static final long serialVersionUID = 1L;
	
	public String name;
	public int age;

}
  • 再进行对Person类的序列化与反序列化

首先是序列化,如下:

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class serializeTest {

	/**
	 * 序列化与反序列化
	 * 注意:对象的序列化与反序列化使用的类要严格一致,包名,类名,类机构等等所有都要一致
	 */
	public static void main(String[] args) {
		try {
			serializeTest.testSerialize();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//对象的序列化
	public static void testSerialize() throws Exception{
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("F:/test/test02.txt"));
		Person person = new Person();
		person.name = "WhiteCat";
		person.age = 2;
		
		objectOutputStream.writeObject(person);
		objectOutputStream.flush();
		objectOutputStream.close();
		
	}

}

然后是反序列化,如下

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

public class serializeTest {

	/**
	 * 序列化与反序列化
	 * 注意:对象的序列化与反序列化使用的类要严格一致,包名,类名,类机构等等所有都要一致
	 */
	public static void main(String[] args) {
		try {
			//serializeTest.testSerialize();
			serializeTest.testDeserialize();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//对象的序列化
	public static void testSerialize() throws Exception{
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("F:/test/test02.txt"));
		Person person = new Person();
		person.name = "WhiteCat";
		person.age = 2;
		
		objectOutputStream.writeObject(person);
		objectOutputStream.flush();
		objectOutputStream.close();
		
	}
	//对象的反序列化
	public static void testDeserialize() throws Exception{
		ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("F:/test/test02.txt"));
		Person person =(Person)(objectInputStream.readObject());
		System.out.println(person.age);
		System.out.println(person.name);
		
		
		
	}

}

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪自强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值