• Java I/O流相关操作


    一、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(); // 关闭文件输入流
    		
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    上面代码使用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();
    			}
    		}
    		
    		
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    上面的方法只能一个一个地读入字符,下面使用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
    				// 方式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();
    			}
    		}
    		
    		
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    二、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();
    			}
    		}
    		
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    三、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();
    				}
    			}
    		}
    		
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    四、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();
    				}
    			}
    		}
    		
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    五、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();
    				}
    			}
    		}
    		
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    六、缓冲流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();
    				}
    			}
    		}
    
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    另外,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
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    七、转换流

    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();
    				}
    			}
    		}
    		
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

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

    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();
    				}
    			}
    		}
    		
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
  • 相关阅读:
    关于论青少年尽早学少儿编程之说
    微信小程序文字上下无缝轮播(滚动效果)
    RK3568笔记三:部署ResNet50模型
    ZYNQ_project:LCD
    Simulink-模块Moudle调用回调函数步骤
    Python爬虫_某宝网案例
    一招教你控制python多线程的线程数量
    [剑指 Offer 62]圆圈中最后剩下的数字(约瑟夫环问题:动态规划)
    cors基础,响应头设置
    物联网AI MicroPython传感器学习 之 RGB三色灯
  • 原文地址:https://blog.csdn.net/qq_57987156/article/details/127754434