首页 > 编程语言 >Java I/O流相关操作

Java I/O流相关操作

时间:2023-08-19 16:31:51浏览次数:30  
标签:java new 相关 Java IOException io import 操作 main

一、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();
				}
			}
		}
		
	}
}

标签:java,new,相关,Java,IOException,io,import,操作,main
From: https://blog.51cto.com/u_16200950/7150619

相关文章

  • JAVA 进制转换
    1.10进制转换16进制Stringhex=Integer.toHexString(numb);2.10进制转换n进制Stringhex=Integer.toString(10,n);3.n进制转换10进制方法1.BigIntegerhex=newBigInteger("字符",n);intnum=hex.intValue();System.out.println(num);方法2.int hex=Integer......
  • Java中BigDecimal怎样取反
    在Java中,正确的类名应该是BigDecimal,而不是bigdemcial。BigDecimal用于高精度的十进制计算。要对BigDecimal对象进行取反操作,可以使用negate()方法。以下是一个示例:importjava.math.BigDecimal;publicclassMain{publicstaticvoidmain(String[]args){BigDe......
  • java实现本地数据与阿里云MySQL数据同步:动态表创建与数据更新
    在开发应用程序时,经常需要将数据从一个数据源(如API、外部数据库等)同步到本地数据库中。这可能涉及到不同的表结构和数据模式。在这种情况下,一个主要的挑战是,如果本地数据库中的表结构与源数据不匹配,应该如何自动适应这些变化并确保数据同步的顺利进行。解决方案:动态表创建与数据......
  • KubeSphere 社区双周报 | Java functions framework 支持 SkyWalking | 2023.8.4-8.17
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.08.04-2023.08.17。贡献者名单新晋KubeSphereCon......
  • Java8编程 轻松驾驭数据流
    StreamAPI是 Java 8中最重要的新特性之一,它是处理集合和数组的一种新方式。它提供了一种简单、灵活和可读的方式来处理集合和数组中的元素,从而使代码更加简洁、高效和易于维护。1.原理介绍StreamAPI的核心是Stream接口,它表示一组元素的序列,可以按需进行计算。......
  • 【Maven】打包补充依赖的操作记录
    题外话每次搞maven环境,总是觉得很痛苦,痛苦的根源源于,无从下手。要说maven有多难,自然也不能这样说,究竟也是因为没有系统地去学习,和没有把踩过的坑积累成经验,以至于每一次都踩差不多的坑,浪费相当的时间,打击相当的信心,于是觉得这是一道铜墙铁壁。每每遇到这些环境问题,首先就觉得,......
  • Java相关
    安装maven参考:https://blog.csdn.net/weixin_45626288/article/details/129729121安装homebrew参考:https://huaweicloud.csdn.net/63a570ebb878a545459474e5.html......
  • 基于JAVA+hadoop网络云盘上传下载系统-计算机毕业设计源码+LW文档
    摘 要随着信息技术的发展,管理系统越来越成熟,各种企事业单位使用各种类型的管理系统来提高工作效率,从而降低手工劳动的弊端。网络云盘能够为广大用户提供安全、免费、方便的存储空间,还能实现资源的共享,但是网络云盘还是存在不足,如何为用户提供更简单明了、便于操作的云盘空间就......
  • 骚操作:使用RxJava实现ImageView的拖动、旋转和缩放
    本文介绍一种使用Rxjava实现图片交互操作的方法。支持单指拖动,双指旋转缩放,效果如下:自定义View首先自定义TrsImageView继承ImageView,设置ScaleType为Matrix,我们使用矩阵计算最终的translate,rotate和scale。publicclassTrsImageViewextendsImageView{publicTrsImageVi......
  • Java智慧工地系统源码(微服务框架+Java+MySQL)
    智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需......