JAVA SE 高级知识学习笔记( IO流)

 IO流

IO流用来处理设备之间的数据传输
    * Java对数据的操作是通过流的方式
    * Java用于操作流的类都在IO包中
    * 流按流向分为两种:输入流,输出流。
    * 流按操作类型分为两种:
         * 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
         * 字符流 : 字符流只能操作纯字符数据,比较方便。

1、FileInputStream 输入流

package com.szj.FileInputStream;
/*
 * 读 必须要有需要读的文件
 */
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStream_01 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FileInputStream fis = new FileInputStream("aaa.txt");
		int b;
		while(( b = fis.read())!=-1) {
			System.out.println(b);
		}
		//demo01();
	}
	public static void demo01() throws IOException {
		FileInputStream fis = new FileInputStream("aaa.txt");	//创建一个流对象,并关联aaa.txt文件	
		int x = fis.read();	//读取aaa.txt中的信息 每读取一次向后移动一次
		System.out.println(x);
		int y = fis.read();
		System.out.println(y);
		int z = fis.read();
		System.out.println(z);//当文件读完后返回-1
		fis.close();	//关流
	}

}

read()方法读取的是一个字节,为什么返回是int,而不是byte

因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111
那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果是11111111会在其前面补上 24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型

 

2、FileOutputStream 输出流

package com.szj.FileOutputStream;

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

/*
 * 写  不需要有文件 可直接创建文件 在写入
 */
public class FileOutputStream_01 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		/*
		 * FileOutputStream fos = new FileOutputStream("bbb.txt");
		 * 如果没有bbb.txt会创建一个新的bbb.txt
		 *如果有bbb.txt会将bbb.txt清空 
		 *
		 *FileOutputStream fos = new FileOutputStream("bbb.txt",true);
		 *不会将bbb.txt清空,如果再次写入文件会续写	
		 */
		FileOutputStream fos = new FileOutputStream("bbb.txt");
		fos.write(97);	//虽然写的是int数,但是实际是Byte类型 
		fos.write(98);
		fos.close();
	}

}

3、通过输入流和输出流进行文件拷贝

逐个字节拷贝图片

package com.szj.Copy;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
 * 拷贝图片 逐个字节
 */
public class CopyImg {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FileInputStream fis = new FileInputStream("a.jpg");	//创建输入流对象 关联a.jpg
		FileOutputStream fos = new FileOutputStream("b.jpg");	//创建一个输出流对象
		
		int b;
		while((b = fis.read())!=-1) {	
			//依次读取a.jpg的字节信息 并且写入b.jpg文件中
			fos.write(b);	
		}
		
		fis.close();
		fos.close();
		
	}

}

 一次性所有字节拷贝 拷贝视频

package com.szj.Copy;

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

/*
 * 拷贝视频   一次性所有字节拷贝
 */
public class CopyAvi {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FileInputStream fis = new FileInputStream("io.avi");
		FileOutputStream fos = new FileOutputStream("copy.avi");
		
		byte [] arr = new byte[fis.available()]; 	//根据io.avi文件大小声明一个数组
		fis.read(arr);		//将文件中的所有字节读入到数组中
		fos.write(arr);    //将数组中的字节一次性写入copy.avi中
		
		fis.close();
		fos.close();
	}

}

4、通过带缓冲区的输入流和输出流进行文件拷贝

BufferedInputStream          是对    FileInputStream        功能的增强

BufferedOutputStream        是对     FileOutputStream        功能的增强

public class CopyAvi_Bufferd {
	public static void main(String []args) throws IOException {
		FileInputStream fis = new FileInputStream("io.avi");
		BufferedInputStream bis = new BufferedInputStream(fis);	//对输入流进行装饰,使之更强大
		FileOutputStream fos = new FileOutputStream("copy.avi");
		BufferedOutputStream bos = new BufferedOutputStream(fos);	//对输出流进行装饰,使之更强大
		
		int b;
		//不再是逐个字节拷贝
		while((b = bis.read()) != -1) {
			/*
			 * 如果文件足够大,read()方法执行一次,就会将文件上的字节数据一次性读取并且
			 * 储存在BufferedInputStream的缓冲区中、从缓冲区中一个字节一个字节的返回b
			 * 
			 * 如果write()一次,先将缓冲区装满,然后一股脑的写到文件上去
			 * 这么做减少了到硬盘上读和写的操作
			 * 
			 */
			
			bos.write(b);
			//bos.flush(); //需要随时刷新缓冲区的内容时用 Flush
		}
		
		bis.close();	//只关闭装饰后的对象即可 
		bos.close();
		
	}
}

5、IO流Demo

流的标准处理异常代码


public class Demo01 {
	/*
	 * IO流的标准异常处理代码
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FileInputStream fis = null;	//使用前需要赋初始值,防止没有读取的文件
		FileOutputStream fos = null;//使用前需要赋初始值
		try {
			fis = new FileInputStream("aaa.txt");
			fos = new FileOutputStream("bbb.txt");
			int b;
			while( (b = fis.read()) != -1 ) {
				fos.write(b);
			}
		}finally {
			if(fis != null)
				fis.close();
			if(fos != null)
				fos.close();
		}
		
	}

}

IO流实现图片加密

public class Demo02 {
	/*
	 * IO流实现图片加密
	 */
	public static void main(String[] args) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.jpg"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.jpg"));
		
		int b;
		while( (b = bis.read()) != -1 ) {
			bos.write(b ^ 333); //随便异或一个数字即可完成加密
		}
		bis.close();
		bos.close();
		
	}
}

在键盘录入文件路径,将该文件拷贝到当前项目下


public class Demo03 {
	/*
	 *  在键盘录入文件路径,将该文件拷贝到当前项目下
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		System.out.println("请输入一个要拷贝的文件的路径");
		String line = in.nextLine();
		File fli = new File(line);	//将路径封装成一个File对象
		FileInputStream fis = new FileInputStream(fli);
		FileOutputStream fos = new FileOutputStream(fli.getName());
		
		int len;
		byte [] arr =  new byte[8192];
		while( (len = fis.read(arr)) != -1 ) {
			fos.write(arr,0,len);
		}
		
		fis.close();
		fos.close();
	}

}

将键盘录入的数据拷贝到当前项目下的test.txt文件中

	/*
	 * 将键盘录入的数据拷贝到当前项目下的test.txt文件中
	 */
	public static void main(String[] args) throws IOException {
		Scanner in = new Scanner(System.in);
		System.out.println("请输入要拷贝到test.txt文件下的数据");
		String s = in.nextLine();
		
		FileOutputStream fos = new FileOutputStream("test.txt");
		fos.write(s.getBytes());	//将一个字符串转化为一个字节数组byte[]的方法
		fos.close();
	}
	

 

6、IO字符流

每一次是按照一个字符大小去读,解决读取中文字符问题

FileReader()

6.1  字符流读取 

/*
 * 字符流 
 * 每一次是按照一个字符大小去读,解决读取中文字符问题
 */

public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FileReader fr = new FileReader("a.txt");
		int x;
		while((x = fr.read()) != -1) {
			// read()方法通过编码表按照字符的大小读取
			System.out.print( (char)x );
		}
		fr.close();
	}

6.2  字符流写入

public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FileWriter fw = new FileWriter("b.txt");
		//FileWriter 内置1024个字节(2k)的小缓冲区
		fw.write(97);	//自动转换为字符
		fw.write("可以直接写字符串");	
		fw.close();	
	}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值