JavaIO流

 

IO流

IO流的分类:

1)按方向划分:

a.输入流:读取数据

b.输出流:写输出数

2)按数据类型分:

a.字节流(图片文件,音频,视频等等....使用字节流)

字节输入流 :InputStream          抽象类:FileInputStream

字节输出流: OutputStream       抽象类:FileOutputStream

b.字符流:(针对是文本文件操作,优先采用字符流)

字符输入流:Reader

字符输出流:Writer

 

文件的字节输入流

   public FileInputStream(String name)
  
 读数据的两种方式:
 
  1)public int read():一次读取一个字节
  2)public int read(byte[] b):一次读取一个字节数组

例:

 

public class FileInputStreamDemo {

	public static void main(String[] args) throws IOException {
		//创建文件输入流对象
		FileInputStream fis = new FileInputStream("fis.txt");
		/*//方式一  public int read():一次读取一个字节
		int by = 0;
		while((by = fis.read()) != -1) {
			System.out.print((char)by);
		}
		//释放资源
		fis.close();*/
		//方式二   public int read(byte[] b):一次读取一个字节数组
		
		byte[] bys = new byte [1024];
		int len = 0;
		while((len = fis.read(bys)) != -1) {
			System.out.println(new String(bys, 0, len));//从0开始,读取实际长度
		}
		//释放资源
		fis.close();
	}
}

(一个代码中只能使用一种方式,不然会出错)
 

 

将一个在D盘下a.txt文件的内容复制到E盘下b.txt文件中

1). 使用FileInputStream:输入流------->读数据(封装数据源)
      FileOutputStream:输出流------>写数据(封装目的地)

 

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

//FileInputStream:输入流------->读数据
//FileOutputStream:输出流------>写数据

public class CopyDemo1 {

	public static void main(String[] args) throws IOException {
		//封装数据源:
		//创建一个文件字节输入流对象
		FileInputStream fis= new FileInputStream("d:\\a.txt");
		//封装目的地
		//创建文件输出流对象
		FileOutputStream fos = new FileOutputStream("e:\\b.txt") ;

//		一次读取一个字节
		int by = 0;
		while ((by = fis.read()) != -1) {
			//写入数据
			fos.write(by);
		}
		//关闭资源
		fis.close();
		fos.close();
	}
}

2).一次读取一个字节数组

 

 

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

public class CopyDemo2 {

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

		// 封装数据源:
		// 创建一个文件字节输入流对象
		FileInputStream fis = new FileInputStream("d:\\a.txt");
		// 封装目的地
		// 创建文件输出流对象
		FileOutputStream fos = new FileOutputStream("e:\\b.txt");
		
		//一次读取一个字节数组
		byte [] buffer = new byte [1024];
		int len = 0;
		while ((len = fis.read(buffer)) != -1) {
			
			fos.write(buffer, 0, len);
		}
		//关闭资源
		fis.close();
		fos.close();
		
	}
}


 引出:

 

  字节缓冲输入流:BufferedInputStream

构造方法:
  public BufferedInputStream(InputStream in) :指定默认缓冲区大小创建字节缓冲输入流对象

 字节缓冲输出流:BufferedOutputStream

构造方式:
public BufferedOutputStream(OutputStream out):默认缓冲区大小

 

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

/**
 *  字节缓冲输入流:BufferedInputStream
 *  构造方法:
 *	public BufferedInputStream(InputStream in) :指定默认缓冲区大小创建字节缓冲输入流对象
 *
 * 字节缓冲输出流:BufferedOutputStream
 * 构造方式:
 *	public BufferedOutputStream(OutputStream out):默认缓冲区大小
 * */
public class CopyDemo3 {

	public static void main(String[] args) throws IOException {
		
		//封装数据源
		BufferedInputStream bis = new BufferedInputStream(
				new FileInputStream("d:\\a.txt"));
		//封装目的地
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream("e:\\b.txt"));
		
		//一次读取一个字节
		/*int by = 0;
		while ((by = bis.read()) != -1) {
			
			bos.write(by);
		}
		//关闭资源
		bis.close();
		bos.close();*/
		//一次读取一个字节数组
		byte [] buffer = new byte[1024];
		int len = 0;
		while ((len = bis.read(buffer)) != -1) {
			
			bos.write(buffer, 0, len);
		}
		//关闭资源
		bis.close();
		bos.close();
	}
}

 

字符转换流:可以将字节输出流转换字符流

字符输入流InputStreamReader:继承自Reader

 

字节输入流+编码格式(默认GBK)----->字符输入流

构造方式:
  public InputStreamReader(InputStream in,charset sc) ;

 

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

public class InputSrteamReaderDemo {

	public static void main(String[] args) throws IOException {
		
		//创建字符输入流对象
		InputStreamReader isr = new InputStreamReader(
				new FileInputStream("isr.txt"),"GBK");
		//读取
		char [] buffer = new char [1024];
		int len = 0;
		while ((len = isr.read(buffer)) != -1) {
			System.out.println(new String (buffer,0,len));
		}
		isr.close();
	}
}


字符输出流OutputStreamWriter:继承自Writer

 

 

 

    字节输出流+编码格式---->字符输出流

构造方式:
public OutputStreamWriter(OutputStream out,Charset cs):创建一字符输出转换流对象,指定编码格式
 

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class OutputStreamWriterDemo {
	
	public static void main(String[] args) throws IOException {
		
		//创建一个字符输出流对象
		//public OutputStreamWriter(OutputStream out,Charset cs)

		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
				"osw.txt"));//默认GBK
		
		
		//写数据
		osw.write("乖女儿,马二蛋...") ;
		
		//释放资源
		osw.close() ;
		
		
	}
}

 

 

便捷类:

由于使用字符转换流进行操作数据的时候书写代码名称非常长,于是Java提供了一种更简单的类:

  字符转换输入流:InputStreamReader----->FileReader
  FileReder(String fileName) 
  字符转换输出流:OutputStreamWriter---->FileWriter
  FileWriter(String fileName) 

 

需求:使用便捷类复制文件

 

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyDemo {

	public static void main(String[] args) throws IOException {
		//封装数据源和目的地
		FileReader fr = new FileReader("D:\\a.txt"); 
		FileWriter fw = new FileWriter("E:\\b.txt");	
		
		//读取
		int by = 0;
		while((by = fr.read()) != -1) {
			fw.write((char)by);
		}
		//释放资源
		fr.close();
		fw.close();
	}
}


 字符缓冲输入流 :BufferedReader

 

 

 

 

public class BufferedReader

extends Reader

 

 

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

 

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {

	public static void main(String[] args) throws IOException {
		
		//创建字符缓冲输入流对象
		BufferedReader br = new BufferedReader(new FileReader("bw.txt")) ;
		
		//一次读取一个字符
		/*int ch = 0 ;
		while((ch=br.read())!=-1){
			System.out.print((char)ch);
		}*/
		
		//一次读取一个字符数组
		char[] chs = new char[1024] ;
		int len = 0 ;
		while((len = br.read(chs))!=-1){
			System.out.println(new String(chs, 0, len));
		}
		
		//关闭资源
		br.close() ;
	}
}


 字符缓冲输出流 :BufferedWriter

 

 

 

 

public class BufferedWriter

extends Writer

 

 

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class BufferedWriterDemo {
	
	public static void main(String[] args) throws IOException {
		
		//创建字符缓冲输出流对象
		//public BufferedWriter(Writer out)
		BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")) ;
		
		//写数据
		bw.write("hello") ;
		bw.write("world") ;
		bw.write("java") ;	
		
		//刷新流
		bw.flush() ;
		
		//关闭资源
		bw.close() ;
	}
}


注意:可以指定缓冲区的大小,或者默认缓冲区的大小,一般情况下,默认的已经足够大了!

 

关于字符缓冲流的特有功能:
  BufferedWriter:
   public void newLine():写入一个换行符号
  BufferReader:
   public String readLine():一次读取一行

 

 

public class BufferedDemo {
	
	public static void main(String[] args) throws IOException {
		
		write();
		
		read();
	}

	private static void read() throws FileNotFoundException, IOException {
		//创建一个字符缓冲输入流对象
		BufferedReader br = new BufferedReader(new FileReader("bw.txt")) ;
		
		//读数据
		//public String readLine():一次读取一行
		
		String line = null ;
		while((line=br.readLine())!=null){
			System.out.println(line);
		}
		//释放资源
		br.close() ;
	}

	private static void write() throws IOException {
	
		//创建一个字符缓冲输出流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")) ;
		
		//写数据
		for(int x = 0 ; x <10 ; x ++){
			bw.write("hello"+x) ;
			//使用特有功能
			bw.newLine() ;
						
			//刷新该流
			bw.flush() ;
		}
		
		//释放资源
		bw.close() ;
	}
}
	bw.write("hello"+x) ;
			//使用特有功能
			bw.newLine() ;
						
			//刷新该流
			bw.flush() ;
		}
		
		//释放资源
		bw.close() ;
	}
}

 

 

 

关于字符流和字节流的使用:

   当我们操作的是一个文本文件,优先采用字符流,如果是视频,音频,动画,图片资源文件这些记事本读不懂,那么使用字节流

关于复制文件:

将D盘下 喵.jpg图片复制到当前项目下copy.jpg

 

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

public class CopyImageDemo {
	
	public static void main(String[] args) throws IOException {
		
		//封装数据源和目的地
		FileInputStream fis = new FileInputStream("D:\\喵.jpg") ;
		FileOutputStream fos = new FileOutputStream("copy.jpg") ;
		
		//一次读取一个字节数组
		byte[] bys = new byte[1024] ;
		int len = 0 ;
		while((len=fis.read(bys))!=-1){
			//写数据的
			fos.write(bys, 0, len) ;
		}
		
		//释放资源
		fis.close() ;
		fos.close() ;
	}
}


复制视频文件同理

 

关于速度问题:

高效字节流比基本字节流快,一次读取一个字节数组比一次读取一个字节快

 

递归:

三个条件:
1)定义一个方法
2)必须有规律
3)要有出口条件

例:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问
第二十个月的兔子对数为多少?

 

public class Test {
	public static void main(String[] args) {
		int i = 20;
		for(i=1;i <=20 ;i++) {
			System.out.println("兔子第"+i+"个月的总数为:"+f(i));
		}
	}
	public static int f(int x) {
		//第一月和第二月都是1对
		if(x == 1 || x == 2) {
			return 1;
		}else {//第三个月开始是之前两个月的数量之和
			return f(x-1)+f(x-2);
		}
		
	}
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章