黑马程序员-----Java基础-----IO流(二)

    ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

                            

IO()

五 IO流全面讲解

1. 基本概述  

A:IO流概述
    IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中

B:IO流分类
a:按照数据流向
 输入流    读入数据
 输出流    写出数据
b:按照数据类型
 字节流          字符流

C 字节流与字符流


a:字节流的抽象基类:
InputStream ,OutputStream。

b:字符流的抽象基类:
 Reader , Writer。
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。

2.FileOutputStream 字节输出流

 

构造方法
  FileOutputStream(File file)
  FileOutputStream(String name)

注意close();

 

IO流操作的步骤:

 a: 创建流对象

 b: 使用流对象的相关方法进行操作

 c: 关闭流对象释放资源

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

public class Test6 {

	public static void main(String[] args) throws IOException {
		
		// 第一个构造方法FileOutputStream(File file)
		// 第二个构造方法FileOutputStream(String name)
		
		//File file = new File("a.txt");
		//FileOutputStream fos = new FileOutputStream(file);
		
		FileOutputStream fos = new FileOutputStream("a.txt");
	}
}

 

3.FileOutputStream的三个write()方法

 

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

 

代码实现

package cn.itcast_day081101;

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

public class Test6 {

	public static void main(String[] args) throws IOException {
		
		//  FileOutputStream(File file)
		// FileOutputStream(String name)
		
		//File file = new File("a.txt");
		//FileOutputStream fos = new FileOutputStream(file);
		
		FileOutputStream fos = new FileOutputStream("a.txt");
	
		byte[] by = "HelloJava".getBytes();
		fos.write(98);   
		fos.write(by);
		fos.write(by, 0, 5);// public  void write(byte[],int off,int len)
	}
}


打印结果:bHelloWorldHello

 

4.FileOutputStream写出数据实现换行和追加写入

Windows换行 \r\n

Linux    \n

Mac      \r

我们使用\r\n第三方工具会兼容

 

代码演示:

 

package cn.itcast_day081201;

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

public class Test2 {

	public static void main(String[] args) throws IOException {
		
		FileOutputStream fos = new FileOutputStream("fos.txt",true);
		
		for(int x = 0 ; x < 10 ;x++){
			
			fos.write(("hello"+x).getBytes());
			fos.write("\r\n".getBytes());
		}
	}
}

5.BufferedOutputStream写出数据

 

A:缓冲思想
 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,
 这是加入了数组这样的缓冲区效果,java本身在设计的时候,
 也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流
 B:BufferedOutputStream的构造方法
  BufferedOutputStream(OutputStream out)

 

  BufferedInputStream读取数据

  BufferedInputStream的构造方法
   BufferedInputStream(InputStream in)

 

6.字节流四种方式复制.jpg图片 并测试效率

  

通过以下四个代码测试效率。
  基本字节流一次读写一个字节
  基本字节流一次读写一个字节数组
  高效字节流一次读写一个字节
  高效字节流一次读写一个字节数组

 

代码实现:

package cn.itcast_day081201;

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

public class Test3 {

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

		long start = System.currentTimeMillis();
		copy();
		long end = System.currentTimeMillis();
		System.out.println(end - start);
	}

	//  基本字节流一次读写一个字节
	public static void copy() throws IOException{
		
		FileInputStream fis = new FileInputStream("D://01区位图.jpg");
		FileOutputStream fos = new FileOutputStream("C://Copy.jpg");
		
		int by = 0;
		
		while((by = fis.read()) != -1){
			
			fos.write(by);
		}
		}
	//基本字节流一次读写一个字节数组
	public static void copy2() throws IOException{
		
		FileInputStream fis = new FileInputStream("D://01区位图.jpg");
		FileOutputStream fos = new FileOutputStream("C://Copy2.jpg");
		
		byte[] bytes = new byte[1024];
		
		int len = 0;
		
		while((len = fis.read(bytes)) != -1){
			
			fos.write(bytes, 0, len);
		}
	}
	//  高效字节流一次读写一个字节
	public static void copy3() throws IOException{
		
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D://01区位图.jpg"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C://Copy3.jpg"));
		
		int by = 0;
		while ((by = bis.read()) != -1){
			
			bos.write(by);
		}
	}
	// 高效字节流一次读写一个字节数组
	public static void copy4() throws IOException {
		
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D://01区位图.jpg"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C://Copy4.jpg"));
			
		byte[] bytes = new byte[1024];
		
		int len = 0;
		
		while((len = bis.read(bytes)) != -1){
			
			bos.write(bytes, 0, len);
		}
		
	}
	}

结果依次为

6610  22  32  7

所以时间耗费最少依次为

高效字节流一次一数组  基本字节流一次一数组  高效字节流一次一字节

基本字节流一次亿字节

 

7.IO流中对异常的处理

 

代码实现:

package cn.itcast_day081201;

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

public class Test1 {

	public static void main(String[] args) {
		
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream("a.txt");
			fos.write("java".getBytes());
		} catch (IOException  e) {
	
			e.printStackTrace();
		}
		finally{	
			if(fos != null){
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}


8.字符流

 

I String类中的编码和解码问题

 

String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组
byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组

编码:把看得懂的变成看不懂的:    String -- byte[]
解码:把看不懂的变成看得懂的:    byte[] -- String

 

II 字符流 写

 

A:OutputStreamWriter的构造方法
  OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流
  OutputStreamWriter(OutputStream out,String charsetName):根据指定编码把字节流数据转换为字符流

 

B: 字符流5种写数据的方法
  public void write(int c)
  public void write(char[] cbuf)
  public void write(char[] cbuf,int off,int len)
  public void write(String str)
  public void write(String str,int off,int len)

 

III 字符流 读

  A:InputStreamReader的构造方法
   InputStreamReader(InputStream is):用默认的编码读取数据
   InputStreamReader(InputStream is,String charsetName):用指定的编码读取数据

    

B. 字符流读数据的2种方法


 

public class PropertiesTest {
	
	public static void main(String[] args) throws IOException {
		
		// 创建一个Properties对象
		Properties prop = new Properties() ;
		
		// 通过load方法加载数据到Properties集合
		prop.load(new FileReader("prop.properties")) ;
		
		// 获取所有键的Set集合
		Set names = prop.stringPropertyNames() ;
		
		// 判断这个集合中是否存在"lisi"这个键
		if(names.contains("lisi")){
			prop.setProperty("lisi", "100") ;
		}
		
		// 调用store方法把数据存储到文件中
		prop.store(new FileWriter("prop.properties"), null) ;
		
	}

}

Ⅳ 字符流复制文本文件

 

代码实现


V FileWriter和FileReader复制文本文件

 

package cn.itcast_day081301;

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

public class Test1 {

	public static void main(String[] args) throws IOException {
		
		InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c.txt"));
		/*
//字符流一次读写一个字符
		int chr = 0;
		
		while ((chr = isr.read()) != -1){
			
			osw.write(chr);
		}
		isr.close();
		osw.close();
		*/
//字符流一次读写一个字符数组
		char[] chrs = new char[1024];
		int len = 0;
		while ((len = isr.read(chrs)) !=-1){
			
			osw.write(chrs, 0, len);
		}
	}
}

 

Ⅵ 字符缓冲流复制文本文件

 

不再做演示(见下面特殊功能)

 

Ⅶ 字符缓冲流的特有功能

 

BufferedWriter: public void newLine():根据系统来决定换行符
BufferedReader: public String readLine():一次读取一行数据 
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

 

Ⅷ 字符缓冲流的特殊功能复制文本文件

 

package cn.itcast_day081303;

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

public class Test4 {

	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new FileReader("text1.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("text1cc"));
		
		//特有的读写方法:一次读写一行
		String line = null;
		
		while((line = br.readLine()) != null){
			
			bw.write(line);
//换行
			bw.newLine();
			//刷新
bw.flush();
		}
		br.close();
		bw.close();
	}
}

 

Ⅸ 把ArrayList集合中的字符串数据存储到文本文件

 

代码实现: 

public class StreamTest2 {
	
	public static void main(String[] args) throws IOException {
		
		// 创建一个高效的字符输入流对象
		BufferedReader br = new BufferedReader(new FileReader("test1.txt")) ;
		
		//创建一个集合ArrayList
		ArrayList al = new ArrayList() ;
		
		// 一次读取一行
		String line = null ;
		
		while((line = br.readLine()) != null){
			
			// 把数据添加到集合中
			al.add(line) ;
		}
		// 释放资源
		br.close() ;
		
		//  遍历集合
		for(String s : al){
			System.out.println(s);
		}
	}
}

 

 

Ⅹ 把文本文件中的数据存储到集合中(从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合)

(不再展示)

 

Ⅺ 随机获取文本文件中的姓名

 

我有一个文本文件,每一行是一个学生的名字,请写一个程序,每次允许随机获取一个学生名称

package cn.itcast_day081302;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

public class Test4 {


	public static void main(String[] args) throws IOException {
//创建一个高效字符输入流对象
		BufferedReader br = new BufferedReader(new FileReader("c:\\names.config"));
//创建一个ArrayList集合
		ArrayList al = new ArrayList ();
依次把文件中读到的元素加到集合中		
		String line = null;
		while((line = br.readLine()) != null){
			
			al.add(line);
		}
//创建一个随机数对象	
		Random random = new Random();
//把随机数作为索引得到随机元素	
		int n = random.nextInt(al.size());                   
		
		System.out.println(al.get(n));
//释放资源		
		br.close();
		
	}

}

 

你可能感兴趣的:(黑马程序员-----Java基础-----IO流(二))