欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

思维导图-------java-IO流知识结构梳理

程序员文章站 2024-03-11 22:07:31
...

基类文件流 的使用

开始   2018年8月10日16:37:41

结束   2018年8月10日18:24:19

思维导图-------java-IO流知识结构梳理

package 面向对象;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.CharBuffer;

public class readfile {
	public static void main(String[] args) throws IOException {
		
//	注释中的是用字节流FileInputStream读取文件
//		FileInputStream fis=null;
//		
//			//创建字节输出流
//			fis=new FileInputStream("E:/Workspaces/MyEclipse 10/yidong/src/面向对象/a.txt");
//		
//			byte[] b=new byte[1024];
//			int hasread=0;
//			while((hasread=fis.read(b))!=-1)
//			{
//				System.out.println(new String(b,0,hasread));
//			
//			
//		}
//	}
//
//		下面是用FileReader读取文件
		FileReader fis=null;
		fis=new FileReader("E:/Workspaces/MyEclipse 10/yidong/src/面向对象/a.txt");
		int length=0;
		
		char[] b=new char[3];
//		read方法返回的是数组长度
//		FileInputStream和FileReader进行文件的读写并没有什么区别,只是操作单元不同而且。FileInputStream和FileReader进行文件的读写并没有什么区别,只是操作单元不同
//		特别注意不能用int数组接收字符流所以二者的数组类型不一样
		while((length=fis.read(b))!=-1)
		{
			System.out.println(length);
//			System.out.println(new String(b,0,length));
		}
		fis.close();
	}
	

}

思维导图

这是文件的读取  FileInputStream和FileReader用法基本相同

同理                    FileOuputStrewam和FileWriter也基本相同 (接收数组不同 字节流与字符流的区别) 如下例

package 面向对象;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.nio.CharBuffer;

public class readfile {
	public static void main(String[] args) throws IOException {
     FileInputStream fis=null;
     FileOutputStream fos=null;
//     创建字节输入流和输出流 文件不存在会自定创建
     fis=new FileInputStream("E:/Workspaces/MyEclipse 10/yidong/src/面向对象/a.txt");
     fos=new FileOutputStream("E:/Workspaces/MyEclipse 10/yidong/src/面向对象/c.txt");
     byte[] b=new byte[1024];
     int length=0;
//     循环读取数据
     while((length=fis.read(b))!=-1)
     {
//    	 把读取到的数据写入文件输出流
    	 fos.write(b);
     }
     fis.close();
     fos.close();
		
	}

}

缓冲流

public static void main(String[] args) throws Exception {
        FileReader fr = new FileReader("C:/Users/Mrzhang/javaEE/基础课/javaSE-30/a.txt");
        BufferedReader bufr = new BufferedReader(fr);
        String line = null;

        while((line = bufr.readLine()) != null) {
            System.out.println(line);
        }

        fr.close();
        bufr.close();
    }

字符缓冲流:
  1: BufferedReader: 带有缓冲区的字符输入流。 
   特点: 
   (1)自带缓冲区  就是提高了效率。
   (2)readLine() 一次读取一行。 
   
   构造器: 
    new BufferedReader(Reader reader);//使用该缓冲流,需要先准备一个reader类的实现类对象。 
    
 API方法: 
    readLine(); 一次读取一行的方法。 
    
  2: BufferedWriter: 带有缓冲区的字符输出流 
  特点: 
   (1)带有缓冲区, 就是提高了效率。
   (2)newLine()  ; 提供了换行符 新方法。  \r\n
   
  BufferedReader : readLine方法, 一次读取一行数据。 
 
  readLine:原理: 
    一次读取一行数据,本质上,调用了FileReader类 read();方法 一次读取一个字符。 
    当读取单换行符号的时候,将整行的数据返回到内存。 
 
 //自定义一个带有缓冲区的类,提供一个方法, 一次读取一行。  模拟: BufferedReader类。
 
  对某个类的某个方法进行功能性的增强。可以使用装饰设计模式。 带有缓冲区的字节读取流:
     带有缓冲区的字节输入流:    BufferedInputStream
     特点: 
        (1)提供了一个缓冲区, 提高了字节的读的效率。  
     
  
    带有缓冲区的字节输出流。   BufferedOutputStream
      (1)提供了一个缓冲区,提高了字节的写的效率。 
   
   
 总结: 实现一个文件的copy  到底使用什么流? 
  (1)分析: 操作的对象,是字符还是字节。 
                        明确使用的流对象。
                        
  (2)明确来源:  文件, 键盘录入。 
            明确目的:  文件, 控制台。 
            
 (3)是否需要提高效率, 使用带有缓冲区的流对其进行包装。

public class MediaCopy {
	public static void main(String[] args) {
		long start= System.currentTimeMillis(); 
		
		BufferedInputStream bis= null; 
		BufferedOutputStream bos=null; 
		
		//初始化: 
		try {
			bis= new BufferedInputStream(new FileInputStream("C:/Users/Mrzhang/javaEE/HTML-06/CSS-01/(一)css样式表.wmv"));
	        bos= new BufferedOutputStream(new FileOutputStream("C:/Users/Mrzhang/javaEE/javaSE-07/javaSE-32/copy.wmv"));
	        
	        int num=0; 
	        while((num=bis.read())!=-1){
	        	bos.write(num); 
	        }
	        
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			if(bis!=null){
				try {
					bis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(bos!=null){
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		long end= System.currentTimeMillis(); 
		System.out.println("消耗的时间:"+(end-start));// 86,612,0 82.5
		
		
		
	}
}

视频都等多媒体文件 的读取用字节流


转换流的使用

 

nputStreamReader  

       作用: 可以将一个字节流转换成一个字符流。 
       构造器: 
        new InputStreamReader(InputStream in ); 将一个字节流转换成一个字符流。 
        new InputStreamReader(InputStream in, String charsetName) 流进行转换的时候,可以指定字符集。。
    
   OutputStreamWriter: 
           作用: 将一个字节输出流转换成一个字符输出流
        new OutputStreamWriter(OutputStream out ); 将一个字节流转换成一个字符流。 
        new OutputStreamWriter(OutputStream in, String charsetName) 流进行转换的时候,可以指定字符集。

import java.io.IOException;
import java.io.InputStream;

/*
 * 演示System.in
 * 模拟了键盘录入: 
 *   每次可以读取一行的数据。  
 *   当读取到换行符号的时候, 这一行返回。 
 *   定义一个结束标志。  当录入over的时候,键盘录入结束。 
 *   
 *   一次读取一个字节。 
 *  -------
 *   一次读取一行数据。   BufferedReader 类: (1)带有缓冲区。 (2)提供了一个新的方法: readLine(); 一次读取一行数据。  
 *   
 */
public class ReadIn {
	public static void main(String[] args) throws IOException {
		InputStream in= System.in; 
		
		// 调用方法: 
		//int num= in.read(); //一次读取一个字节。-1
		
	    //定义一个容器: 
		StringBuilder sb= new StringBuilder(); 
		while(true){
			int ch= in.read();
			if(ch==13){
				continue; 
			}
			if(ch==10){
				String s= sb.toString(); //sb当中的内容转换成字符串。 
				
				//定义一个结束标志: 
				if("over".equals(s)){
					break; 
				}
				
				System.out.println(s.toUpperCase());//读取完成一行,将一行的数据 转换成大写。 
				
//				sb= new StringBuilder(); //创建很多对象。 
				sb.delete(0, sb.length()); 
				
			}else
			   sb.append((char)ch); 
		}
		
		
		
		/*int num1= in.read();
		int num2= in.read();
		int num3= in.read();
		int num4= in.read();
		
		
		System.out.println((char)num);
		System.out.println((char)num1);
		System.out.println(num2);// 13 /r
		System.out.println(num3);// 10 /n 
*/	
	}
}	


           最下面的部分是一般低效的方法

上面代码是默认的来源目的(键盘和显示屏)

下面示例 用system方法改变来源和目的

public class ReadIn02 {
	public static void main(String[] args) throws IOException {
//		method_01(); 
		
		//键盘录入的方式二: 
		BufferedReader bufr= new BufferedReader(new InputStreamReader(System.in));
		String str= bufr.readLine();
		
		
		// System.out.println(str.toUpperCase());
		
//		模拟了键盘输出。 
		OutputStream out = System.out; // PrintStream ----》OutputStream 
//		out.writer(); 写的字节  向控制台输出的内容都是字符。 
		
		//将字节流-0--->字符流输出。 
		/*OutputStreamWriter  osw= new OutputStreamWriter(out); //将一个字节输出流转换成一个字符输出流。  
		
		osw.write(str); 
		osw.flush(); 
		osw.close(); */
		
		
		PrintStream ps= System.out; //打印流。 
		ps.println(str); //换行。
		
	}

	public static void method_01() throws IOException {
		// 一次读取一行数据。   BufferedReader 类: (1)带有缓冲区。 (2)提供了一个新的方法: readLine(); 一次读取一行数据。  
		  
		InputStream in = System.in; // 一个字节流。 
		
		//能否将一个字节流 ---->字符流?  
		// 转换流: 桥接流: 
		InputStreamReader isr= new InputStreamReader(in); 
		
		
		BufferedReader  bufr= new  BufferedReader(isr); 
		
		//bufr对象存在。 readLine方法。 
		String line= null; 
		while((line=bufr.readLine())!=null){
			if("886".equals(line)){
				break; 
			}
			System.out.println(line.toUpperCase());
			
		}
		
		bufr.close();
	}
	
	
}

一:System类当中的方法: 
    System.in;  标准的输入流: 默认是键盘录入
    System.out; 标准的输出流: 默认是输出到控制台。 
  
    System.setIn(InputStream in); 改变来源。 
    System.setOut(PrintStream ps);  改变目的
    
    补充: 打印流:           
   PrintStream  构造器: 
   new PrintStream(String fileName);
   new PrintStream(OutputStream out); 
   
  PrintStream: 打印流(补充)

  特点: 
   (1)能够打印基本数据类型的值。 
   (2)PrintStream 永远不会抛出 IOException;
   (3)写入 byte 数组之后自动调用 flush 方法。自动刷新。
   (4)println(); 提供了换行的方法。 
  构造器: 
    PrintStream(File file) 
          创建具有指定文件且不带自动行刷新的新打印流。 
    PrintStream(File file, String csn)  
  
   PrintStream(OutputStream out) ; 
   PrintStream(OutputStream out, boolean autoFlush) ;自动刷新。 
   PrintStream(String fileName) 
   
 //使用PrintStream类,将异常信息打印在外部文件当中。 

2018年7月22日18:01:56 于易动

博客写太长的话一定要记得保存
不然今天下午写了一下午的博客  哎  又重写了一遍

远远没有第一遍写一边运行一遍写的流畅 +  注释详细

吸取教训~~!!!!!!!

 

 

相关标签: javaio流