IO流(二)之字节流,字符流,对象流

一、字节流

1.通过字节流对文件进行读取

package com.wenhua.project.bytestream;

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


public class FileInDemo1 {
	public static void main(String[] args) throws IOException {

        // 封装文件,确保该文件存在
		FileInputStream fileInputStream = new FileInputStream("demo2.txt");

		int by = 0;
		// 读取 赋值 判断
		while ((by = fileInputStream.read()) != -1) {
			// 注意当为汉字时会出现乱码
			System.out.print((char) by);
		}

		fileInputStream.close();
	}
}

2.通过字节流对字符进行输出

package com.wenhua.project.bytestream;

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


public class FileOutDemo1 {
	public static void main(String[] args) throws IOException {
		
		/* 1.调用系统功能创建文件  
			2.创建fileOutputStream对象  
			3.把fileOutputStream对象指向这个文件*/
		FileOutputStream fileOutputStream = new FileOutputStream("wenhua.txt");
		/* 源码:
		public FileOutputStream(String name) throws FileNotFoundException {
		        this(name != null ? new File(name) : null, false);
		    }*/
		
		// 字节流写数据
		String string = "hello,io!";
		byte[] bs = string.getBytes();
		fileOutputStream.write(bs);
		
		// 高级记事本的换行是"\n"而window自带的换行是"\r\n"
		fileOutputStream.write("\n".getBytes());
	
		// 写int型数据
		fileOutputStream.write(97);// 97相应存储的是a

		fileOutputStream.write("\n".getBytes());
		// 输出97
		fileOutputStream.write(57);
		fileOutputStream.write(55);
		
		/* 关闭流对象释放资源
		 1.让流对象成为垃圾,及时回收,释放内存
		 2.通知系统去释放跟该文件相关的资源
		 3.避免其他流继续写数据*/
		fileOutputStream.close();
	}
}

3.单个字节流和数组进行复制效率

package com.wenhua.project.bytestream;

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

public class FileArrayDemo1 {
	public static void main(String[] args) throws IOException {

		// 需要读取的文件对象(封装文件)
		FileInputStream fileInputStream = new FileInputStream("demo1.txt");

		// 需要存储数据的文件对象(封装文件)
        // 注意此处如果没有true,存入的内容会覆盖以前的内容
		FileOutputStream fileOutputStream = new FileOutputStream("demo2.txt", true);

		long m = System.currentTimeMillis();
		// 读写字节流
		byte[] bs = new byte[8192];// 最好是1024的倍数
		int length = 0;// 用来记录数组中的实际装入的字节长度
		while ((length = fileInputStream.read(bs)) != -1) {
			System.out.println(length);
			fileOutputStream.write(bs, 0, length);
		}
		System.out.println("通过数组复制总用时:" + (System.currentTimeMillis() - m));

		long mm = System.currentTimeMillis();
		int i = 0;
		while ((i = fileInputStream.read()) != -1) {
			fileOutputStream.write(i);
		}
		// 单个字节流复制用时长
		System.out.println("单个字节流复制总用时:" + (System.currentTimeMillis() - mm));

		// 关闭流对象
		fileInputStream.close();
		fileOutputStream.close();
	}
}

二、字符流

1、FileReader

read() 读取文件的字符的int值,没有了就返回-1

为保证流的关闭,异常处理必须使用try-catch-finally

本节编写的代码暂时不处理异常,只是描述具体操作的步骤

1、使用read()读取数据
//指明要操作的文件
File file = new File("hello.txt");
//创建具体流,将文件传入构造器
FileReader fr = new FileReader(file);
//读取操作
int date;
while((date = fr.eead()) != -1{
    System.out.println((char) date);
}
//关闭流
fr.close();
2、使用read(char[] cbuf)读取数据(效率高)
//使用read(char[] cbuf)来读取文件
File file = new File("hello.txt");
FileReader fr = new FileReader(file);

char[] cbuf = new char[5];	//提前声明一个char[] 每次往数组里面读取5个字符
int len;	//记录每次读入到cbuf中字符的个数
while ((len = fr.read(cbuf)) 1= -1){
    
    //用for循环读取
    for(int i = 0;i < len;i++){
        System.out.println(char[i]);
    }
    //将数组传入string的构造器中,输出string
    String str = new String(cbuf,0,len);
	System.out.println(str);
}

2、FileWriter

从内存写入内存到文件

说明:

​ 要写入的文件可以不存在,不存在的话会自己创建

​ 如果已经存在,分为两种情况(写入时到底是覆盖,还是追加)

  FileWriter的构造器
  FileWriter(File file)   默认是覆盖
  FileWriter(File file, boolean append)   声明为true追加、声明为false是覆盖
//一、声明要写入的文件
File file = new File("dream.txt");
//二、创建相关流
FileWriter fr = new FileWriter(file);
//三、写入操作
fr.write("i have a dream");
//四、关闭资源
fr.close();

3、字符文件的复制

//指明要操作的文件
File srcFile = new File("hello1.txt");		
File destFile = new File("hello2.txt");		//写入的文件可以不存在,不存在会自动创建

//创建相关流
FileReader fr = new FileReader(srcFile);
FileWriter fw = new FileWriter(destFile);

//读写操作
char[] cbuf = new char[1024];	//将字符先读取到这个数组
int len;	//记录每次读入字符数组的个数
while ((len = fr.read(cbuf)) != -1){	//当读取字符个数不是-1时,进入循环
    fw.write(cbuf,0,len);	//将字符数组的内容写入文件,从0开始,到len结束
}

//资源的关闭
fw.close();
fr.close();

4、转换流

转换流是处理流的一种,有两个分别是

InputStreamReader 将一个字节的输入流转化为字符的输入流

OutputStreamWriter 将一个字符的输出流转化为字节的输出流

/*
将输入的字节流转化为输入的字符流
*/
class Demo{
    
    //创建流
    FileInputStream fis = new FileInputStream("hello.txt");
    InputStreamReader isr = new InputStreamReader(fis);
    //读入操作
    int len;
    char[] buffer = new char[1024];
    while((len = isr.read(buffer)) != -1){
        String str = new String(buffer,0,len);
        System.ot.println(str);
    }
    //流的关闭
    fis.close();
    isr.close();
}

三、对象流

1.简历

涉及到的两个流 ObjectInputStreamObjectOutputStream

这是用于存储和读取基本数据类型和对象的处理流,它的强大之处在于可以把Java中的对象写入到数据源,也能把对象从数据源还原回来

  • 序列化:用 ObjectOutputStream 类保存基本数据类型或对象的机制
  • 反序列化:用 ObjectInputStream 类读取基本数据类型和对象的机制

2.对象的序列化

对象的序列化机制允许将Java对象转化为与平台无关的二进制流,从而允许把这个二进制流永久性的存在磁盘上,或者通过网络讲这个二进制流传输到另一个网络节点,当其他程序获得了这个二进制流,就可以恢复对象

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值