一、FileReader读入数据的基本操作

适用于纯文本文件,如TXT文件 使用throws的方式处理异常

package com.java.main;

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

public class TestStream
{
	public static void main(String []args) throws IOException // 使用throws的方式处理异常
	{
		// 1、实例化File类的对象,指明要操作的文件	
		File file = new File("D:\\CODE\\codeeclipse\\Java基础\\bin\\com\\java\\main\\data.txt");
		// 2、提供具体的流
		FileReader fileReader = new FileReader(file);
		// 3、数据的读入
		// read()方法:返回读入的一个字符,用int接受的话是字符对应的ASSIC码,如果返回-1则代表读入到了文件尾
		// 写法一
		/*
		int data=fileReader.read();
		while(data != -1)
		{
			System.out.println((char)data);
			data=fileReader.read(); // 接着读下一个 
		}
		*/
		// 写法二
		int data;
		while((data=fileReader.read())!=-1)
		{
			System.out.print((char)data);
		}
		// 4、流的关闭
		fileReader.close(); // 关闭文件输入流
		
	}
}

上面代码使用throws的方式处理异常,这样是不安全的,因为当中间步骤出现异常时,会终止程序,导致后面关闭流的操作无法完成,从而造成资源的浪费,所以要使用try-catch-finally的方式来处理异常。

package com.java.main;

import java.io.File;

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

public class TestStream
{
	public static void main(String []args)
	{
		FileReader fileReader=null;
		try
		{
			// 1、实例化File类的对象,指明要操作的文件	
			File file = new File("D:\\CODE\\codeeclipse\\Java基础\\bin\\com\\java\\main\\data.txt");
			// 2、提供具体的流
			fileReader = new FileReader(file);
			// 3、数据的读入
			// read()方法:返回读入的一个字符,用int接受的话是字符对应的ASSIC码,如果返回-1则代表读入到了文件尾
			// 写法一
			/*
			int data=fileReader.read();
			while(data != -1)
			{
				System.out.println((char)data);
				data=fileReader.read(); // 接着读下一个 
			}
			*/
			// 写法二
			int data;
			while((data=fileReader.read())!=-1)
			{
				System.out.print((char)data);
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}finally 
		{
			try 
			{
				if(fileReader!=null) // 如果为null,执行不了关闭操作
				{
					// 4、流的关闭
					fileReader.close(); // 关闭文件输入流
				}
			}catch(IOException e) // 流的关闭也可能产生异常
			{
				e.printStackTrace();
			}
		}
		
		
	}
}

上面的方法只能一个一个地读入字符,下面使用read函数的重载函数,实现同时读取多个字符

package com.java.main;

import java.io.File;

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

public class TestStream
{
	public static void main(String []args)
	{
		FileReader fileReader=null;
		try
		{
			// 1、实例化File类的对象,指明要操作的文件	
			File file = new File("D:\\CODE\\codeeclipse\\Java基础\\bin\\com\\java\\main\\data.txt");
			// 2、提供具体的流
			fileReader = new FileReader(file);
			// 3、数据的读入
			/*
			 * read(char[] arr)方法:返回每次读入arr数组中的字符个数,如果到达文件尾,返回的是-1
			 */
			char[] cBuffer = new char[5];
			int len;
			while((len = fileReader.read(cBuffer)) != -1)
			{
				// 方式1 遍历数组,使用len,不能使用length
				/*
				for(int i=0; i<len; i++ )
				{
					System.out.print(cBuffer[i]);
				}
				*/
				// 方式2 放入String
				String string = new String(cBuffer, 0, len); // 使用len个字符
				System.out.print(string);
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}finally 
		{
			try 
			{
				if(fileReader!=null) // 如果为null,执行不了关闭操作
				{
					// 4、流的关闭
					fileReader.close(); // 关闭文件输入流
				}
			}catch(IOException e) // 流的关闭也可能产生异常
			{
				e.printStackTrace();
			}
		}
		
		
	}
}

二、FileWriter写出数据

package com.java.main;

import java.io.File;

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

import javax.annotation.processing.Filer;

public class TestStream
{
	public static void main(String []args)
	{
		// 1、提供要操作的文件
		File file = new File("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt");
		// 2、提供FileWriter的对象,用于数据的写出
		FileWriter fileWriter=null;
		try
		{
			// append:值为true表示在改文件原有内容后面追加,为false表示覆盖原有内容
			fileWriter = new FileWriter(file, true); // 表示在原有内容之上追加
			// writer(要写出的内容)
			fileWriter.write("hello\n");
			fileWriter.write("world");
		}catch(IOException e)
		{
			e.printStackTrace();
		}finally {
			try
			{
				// 流的关闭
				if(fileWriter!=null)
				{
					fileWriter.close();
				}
			}catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
}

三、FileReader和FileWriter实现文件的复制

package com.java.main;

import java.io.File;

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

import javax.annotation.processing.Filer;

public class TestStream
{
	public static void main(String []args)
	{
		FileReader fr=null;
		FileWriter  fw =null;
		try
		{
			fr = new FileReader("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt");
			fw = new FileWriter("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data1.txt");
			
			char[] cBuffer = new char[5];
			int len;
			while((len=fr.read(cBuffer)) != -1)
			{
				fw.write(cBuffer, 0, len);
			}
		} catch (IOException e)
		{
			e.printStackTrace();
		}finally
		{
			if(fr != null)
			{
				try
				{
					fr.close();
				}catch(IOException e)
				{
					e.printStackTrace();
				}
			}
			
			if(fw != null)
			{
				try
				{
					fw.close();
				}catch(IOException e)
				{
					e.printStackTrace();
				}
			}
		}
		
	}
}

四、FileInputStream处理字节流的读入

适用于非文本文件

package com.java.main;

import java.io.FileInputStream;

import java.io.IOException;


public class TestStream
{
	public static void main(String []args)
	{
		FileInputStream fileInputStream = null;
		
		try 
		{
			fileInputStream = new FileInputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt");
			
			// 使用字节数组
			byte[] bBuffer = new byte[5];
			int len;
			while((len = fileInputStream.read(bBuffer)) != -1)
			{
				String string = new String(bBuffer, 0, len);
				System.out.print(string);
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}finally
		{
			if(fileInputStream != null)
			{
				try
				{
					fileInputStream.close();
				}catch(IOException e)
				{
					e.printStackTrace();
				}
			}
		}
		
	}
}

五、FileInputStream和FileOutputStream实现非文本文件(图片)的复制

package com.java.main;

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


public class TestStream
{
	public static void main(String []args)
	{
		FileInputStream fileInputStream = null;
		FileOutputStream fileOutputStream = null;
		try 
		{
			fileInputStream = new FileInputStream("C:\\Users\\zzps\\Pictures\\Saved Pictures\\手写签名照.jpg");
			fileOutputStream = new FileOutputStream("C:\\Users\\zzps\\Pictures\\Saved Pictures\\手写签名照fu.jpg");
			byte[] bBuffer = new byte[5];
			int len;
			while((len = fileInputStream.read(bBuffer)) != -1)
			{
				fileOutputStream.write(bBuffer);
			}
			System.out.println("复制成功");
		}catch(IOException e)
		{
			System.out.println("复制失败");
			e.printStackTrace();
		}finally
		{
			if(fileInputStream != null)
			{
				try
				{
					fileInputStream.close();
				}catch(IOException e)
				{
					e.printStackTrace();
				}
			}
			if(fileOutputStream != null)
			{
				try
				{
					fileOutputStream.close();
				}catch(IOException e)
				{
					e.printStackTrace();
				}
			}
		}
		
	}
}

六、缓冲流BufferedInputStream、BufferedOutputStream

缓冲流的作用是加快普通流的读写,因为其内部提供了缓冲区。 依然以复制图片为例子

package com.java.main;

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

public class TestBufferedStream
{

	public static void main(String[] args)
	{
		FileInputStream fileInputStream = null;
		FileOutputStream fileOutputStream = null;
		
		BufferedInputStream bufferedInputStream = null;
		BufferedOutputStream bufferedOutputStream = null;
		try
		{
			// 准备字节流
			fileInputStream = new FileInputStream("C:\\Users\\zzps\\Pictures\\Saved Pictures\\手写签名照.jpg");
			fileOutputStream = new FileOutputStream("C:\\Users\\zzps\\Pictures\\Saved Pictures\\手写签名照1.jpg");
			// 准备缓冲流,包裹普通流
			bufferedInputStream = new BufferedInputStream(fileInputStream);
			bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
			
			// 复制操作
			byte[] bBuffer = new byte[10];
			int len;
			while((len = bufferedInputStream.read(bBuffer)) != -1)
			{
				bufferedOutputStream.write(bBuffer, 0, len);
			}
			System.out.println("图片复制成功");
		}catch(IOException e)
		{
			System.out.println("图片复制失败");
			e.printStackTrace();
		}finally
		{
			// 在关闭外层的流,即BufferedInputStream  BufferedOutputStream的时候,会自动关闭内层流,所以不需要手动去关闭内层流
			if(bufferedInputStream != null)
			{
				try
				{
					bufferedInputStream.close();
				}catch(IOException e)
				{
					e.printStackTrace();
				}
				
			}
			if(bufferedOutputStream != null)
			{
				try
				{
					bufferedOutputStream.close();
				}catch(IOException e)
				{
					e.printStackTrace();
				}
			}
		}

	}

}

另外,FileReader、FileWriter也可以类似的操作,要使用BufferedReader、BufferedWriter

package com.java.main;

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

public class TestBufferedStream
{

	public static void main(String[] args)
	{
		BufferedReader bufferedReader = null;
		BufferedWriter bufferedWriter = null;
		try
		{
			bufferedReader = new BufferedReader(new FileReader(new File("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt")));
			bufferedWriter = new BufferedWriter(new FileWriter(new File("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data1.txt")));
			// 使用字符数组,复制结果和原来的一样
			/*
			char[] cBuffer = new char[1024];
			int len;
			while((len = bufferedReader.read(cBuffer)) != -1)
			{
				bufferedWriter.write(cBuffer, 0, len);
			}
			*/
			// 使用String ,复制结果不换行
			String s;
			while((s = bufferedReader.readLine()) != null)
			{
				bufferedWriter.write(s); // s+"\n" 实现换行
			}
		} catch (IOException e)
		{
			
			e.printStackTrace();
		}finally 
		{
			try
			{
				if(bufferedReader != null)
				{
					bufferedReader.close();
				}
			}catch(IOException e)
			{
				e.printStackTrace();
			}
			
			try
			{
				if(bufferedWriter != null)
				{
					bufferedWriter.close();
				}
			}catch(IOException e)
			{
				e.printStackTrace();
			}
		}
		
	}

}

七、转换流

  1. 转换流属于字符流
  2. 作用是提供字符流与字节流之间的转换
  3. InputStreamReader:将一个字节的输入流转换为字符的输入流;
  4. OutputstreamWriter:将一个字符的输出流转换为字节的输出流。
package com.java.main;

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

public class TestTrans
{
	public static void main(String []args)
	{
		FileInputStream fileInputStream = null;
		InputStreamReader inputStreamReader = null;
		try
		{
			fileInputStream  = new FileInputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt");
			// 参数2指定字符集,具体要用哪个字符集,要看该文件保存时用的是什么字符集
			inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
			
			char[] cBuffer = new char[10];
			int len;
			while((len = inputStreamReader.read(cBuffer)) != -1)
			{
				String s = new String(cBuffer, 0, len);
				System.out.print(s);
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}finally
		{
			if(inputStreamReader != null)
			{
				try
				{
					inputStreamReader.close();
				}catch(IOException e)
				{
					e.printStackTrace();
				}
			}
		}
		
	}
}

使用转换流实现文件的读入、写出

package com.java.main;

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

public class TestTrans
{
	public static void main(String []args)
	{
		InputStreamReader inputStreamReader = null;
		OutputStreamWriter outputStreamWriter = null; 
		try
		{
			// 参数2指定字符集,具体要用哪个字符集,要看该文件保存时用的是什么字符集
			inputStreamReader = new InputStreamReader(new FileInputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt"), "UTF-8");
			// 参数2指定要按哪种字符集将数据保存到新文件
			outputStreamWriter = new OutputStreamWriter(new FileOutputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data1.txt"), "gbk");
			
			char[] cBuffer = new char[5];
			int len;
			while((len = inputStreamReader.read(cBuffer)) != -1)
			{
				outputStreamWriter.write(cBuffer, 0, len);
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}finally
		{
			if(inputStreamReader != null)
			{
				try
				{
					inputStreamReader.close();
				}catch(IOException e)
				{
					e.printStackTrace();
				}
			}
			
			if(outputStreamWriter != null)
			{
				try
				{
					outputStreamWriter.close();
				}catch(IOException e)
				{
					e.printStackTrace();
				}
			}
		}
		
	}
}