I/O流的学习(一)---字节流

IO流:在设备和设备之间的一种数据传输!
IO流的分类:
按流的方向分:
输入流: 读取文件   (e:\\a.txt):从硬盘上文件读取出来后输出这个文件的内容
输出流: 写文件:将e:\\a.txt 内容读出来--->写到f盘下
按数据的类型划分:
字节流
字节输入流:InputStream :读取字节
字节输出流:OutputStream :写字节
字符流
字符输入流:Reader :读字符
字符输出流:Writer :写字符
需求:在当项目下输出一个文件,fos.txt文件(文本文件)
只要文本文件,优先采用字符流,字符流在字节流之后出现的
使用字节流进行操作
无法创建字节输出流对象:OutputSteam :抽象类,不能实例化
又学习过File类,并且当前是对文件进行操作,子类:FileOutputSteam进行实例化

File+InputStream
File+OutputStream
FileXXX  (FileReader)
FileXXX  (FileWriter)

开发步骤:
1)创建字节输出流对象
2)写数据

3)关闭资源

public class FileOutputStreamDemo {
	
	public static void main(String[] args) throws Exception {
		//1)创建一个字节输出流对象
		//OutputStream out = new FileOutputStream("fos.txt") ; //抽象类多态
		//创建对象做了几件事情
		/**
		 * 1)构造了输出流对象 (系统创建对象)
		 * 2)指向了当前项目下输出fos.txt
		 */
		FileOutputStream fos = new FileOutputStream("fos.txt") ; //FileNotFoundException
		
		//写数据
		// 使用流对象给文件中写入数据
		fos.write("hello".getBytes());
		
		//关闭资源
		/**
		 * 1)将文件和流对象不建立关系了 (fos对象不指向fos.txt)
		 * 2)及时释放掉流对象所占用的内存空间
		 */
		fos.close(); 
		/**
		 * 如果关闭流对象了,那么就不能对流对象进行操作了
		 */
		//fos.write("java".getBytes());//java.io.IOException: Stream Closed :流已经关闭了
		
	}
}

关于字节输出流写数据的方法:

public void write(int b):一次写一个字节
public void write(byte[] b) :一次写一个字节数组

public void write(byte[] b, int off,int len):一次写一部分字节数组

public class FileOutputStreamDemo2 {

	public static void main(String[] args) throws Exception {
		
		//构造一个字节数出流对象
		FileOutputStream fos = new FileOutputStream("fos2.txt") ;
		
		//写数据
		//一次一个字节
		//public void write(int b):
		//fos.write(97);
		//fos.write(127);	
		
		//public void write(byte[] b) :一次写一个字节数组
		byte[] bys = {97,98,99,100,101} ;
		//fos.write(bys);
		
		//public void write(byte[] b, int off,int len):一次写一部分字节数组
		fos.write(bys, 0, 2);
		
		//关闭资源
		fos.close(); 
	}
}
需求:输出文本文件,给文本文件中添加一些数据

问题:
写一些数据,这些数据并没有换行,如何实现换行的效果...
针对不同的操作系统,里面的换行符合不一样的

windows: \r\n
Linx:\n
mac:\r

一些高级记事本针对任意的换行会有换行的效果

问题:如何末尾追加数据呢

public FileOutputStream(File file, boolean append):指定为true,末尾追加数据

public class FileOutputStreamDemo {

	public static void main(String[] args) throws Exception {
		
		//1)创建字节文件输出流对象:FileOutputStream
		//FileOutputStream fos = new FileOutputStream("fos3.txt") ;
		FileOutputStream fos = new FileOutputStream("fos3.txt",true) ;
		
		//2)写数据
		for(int x = 0 ; x < 10 ; x ++) {
			fos.write(("hello"+x).getBytes());
			//写入换行符号
			fos.write(("\r\n").getBytes());
		}
		
		//3)释放资源
		fos.close(); 
	}
}

IO流中加入异常处理(try...catch...)

public class FileOutputStreamDemo2 {

	public static void main(String[] args) {

		// 方式1) 分别进行异常处理
		// 创建字节文件输出流对象
		/*
		 * FileOutputStream fos = null ; 
		 * try { 
		 * 	fos = new FileOutputStream("fos.txt") ; 
		 * }catch (FileNotFoundException e) { 
		 * 	e.printStackTrace(); 
		 * }
		 * 
		 * //写数据 
		 * try { 
		 * 	fos.write("hello".getBytes()); 
		 * } catch (IOException e) {
		 * 	e.printStackTrace(); 
		 * }
		 * 
		 * //释放资源 
		 * try { 
		 * 	fos.close(); 
		 * } catch (IOException e) { 
		 * 	e.printStackTrace(); 
		 * }
		 */

		// 方式2: 一起处理 (针对整个资源没有释放,不好)
		// try {
		// 	FileOutputStream fos = new FileOutputStream("fos2.txt") ;
		// 	fos.write("java".getBytes());
		// 	fos.close();
		// } catch (IOException e) {
		// 	e.printStackTrace();
		// }

		// 方式3:经常这样使用:try...catch...finally...
		// finally中访问这个对象,需要将对象放到try语句外面
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream("fos3.txt");
			fos.write("hello".getBytes());
		} catch (IOException e) {
			e.printStackTrace();
			
		} finally {
			// 释放资源
			// 对象对象进行非空判断 :数据连接池 (由于很多资源:Statment,PreparedStatement)
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}

		}

	}
}

需求:去读取当前项目下的fis.txt这个文件内容,将文件的内容输出在控制台上
InputStream抽象类:字节输入流
FileInputStream
构造方法:
public FileInputStream(String name)
开发步骤:
1)创建字节文件输入流对象
2)读数据
3)释放资源

读数据方式:
public abstract int read():一次读取一个字节

public int read(byte[] b):一次读取一个字节数组 (读取实际的字节数)

public class FileInputStreamDemo {
	
	@Test
	public void demo() throws Exception{
		
		//创建一个字节文件输入流对象
		//方式1:一次读取一个字节
		FileInputStream fis  = new FileInputStream("fis.txt") ;

		//结束条件就是:如果文件读到末尾了,没有字节数了,所以是一个-1
		/*int by = fis.read() ;
		while(by!=-1) {
			System.out.print((char)by);
			//继续获取字节
			by = fis.read() ;
		}*/
		
		//最终版代码:可不可以将 赋值,判断写在一块呢?
		int by = 0 ;
		while((by=fis.read())!=-1) {
			System.out.print((char)by);
		}
		
		//释放资源
		fis.close();

	}
}

public int read(byte[] b):一次读取一个字节数组 (读取实际的字节数)

public class FileInputStreamDemo2 {

	public static void main(String[] args) throws Exception {
		
		//创建一个字节文件输入流对象
		FileInputStream fis = new FileInputStream("fis2.txt") ;

		//public int read(byte[] b):一次读取一个字节数组 (读取实际的字节数)
		//指定字节数组的长度是:1024或者1024的倍数
		byte[] bys = new byte[1024] ;
		int len = 0 ;
		while((len=fis.read(bys))!=-1) { //判断,赋值,循环
			System.out.println(new String(bys, 0, len)); //带上len的用法
		}

	}
}

复制文本文件。
将当前项目下的a.txt文件的内容读取出来,复制到b.txt文件中

源文件: a.txt --->  读取文件的内容---->FileInputStream
目的地文件: b.txt----> 输出文件 --->FileOutputStream

本身读写操作:

读取一个字节,写一个字节,针对不会出现中文乱码的问题..

public class CopyFileDemo{
	
	public static void main(String[] args) throws Exception {
		
		//封装目的地文件和源文件
		FileInputStream fis = new FileInputStream("a.txt") ;
		FileOutputStream fos = new FileOutputStream("b.txt") ;
		
		//进行读写操作
		//一次读取一个字节
		int by = 0 ;
		while((by=fis.read())!=-1) {
			//第一个字节,写个一个字节
			fos.write(by);
		}
		System.out.println("------");
		
		//一次读取一个字节数组
		byte[] bys = new byte[1024];
		int len = 0;
		while((len = fis.read(bys)) != -1) {
			fos.write(bys, 0, len);
		}
		
		//释放资源
		fis.close(); 
		fos.close();
	}
}
复制文件:
源文件:c:\\a.txt
目的地文件:d:\\b.txt

源文件---->FileInputStream 读取操作
目的地文件--->FileOuputStram 写入操作
public class CopyFileDemo2 {
	
	public static void main(String[] args) throws Exception {
		
		//封装目的地文件和源文件
		FileInputStream fis = new FileInputStream("c:\\a.txt") ;
		FileOutputStream fos = new FileOutputStream("d:\\b.txt") ;
		
		//读写操作
		int by = 0 ;
		while((by=fis.read())!=-1) {
			//不断写数据
			fos.write(by); 
		}
		
		//释放资源
		fos.close(); 
		fis.close();
	}
}
源文件: 高圆圆.jpg
目的地文件: mm.jpg

源文件: FileInputStream --->读取

目的地文件: FileOutputStream--->写入

public class CopyImageDemo {

	public static void main(String[] args) throws Exception {
		
		//封装源文件和目的地文件
		FileInputStream fis = new FileInputStream("高圆圆.jpg")	 ;
		FileOutputStream fos = new FileOutputStream("mm.jpg") ;
		
		//读写操作
		//一次读取字节数组
		byte[] bys = new byte[1024] ;
		int len = 0 ;
		while((len=fis.read(bys))!=-1) {
			//写数据
			fos.write(bys, 0, len);
		}
		
		//释放资源
		fis.close(); 
		fos.close();
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值