Java——FileInputStream文件字节输入流、FileOutputStream文件字节输出流、FileReader文件字符输入流、FileWriter文件字符输出流

总结

(一)关于文件的复制粘贴:
1、创建与文件路径有关的输入流、输出流,输入流可能抛出FileNotFoundException,输出流可能会抛出IOException异常,需要进行异常处理 输出流加true表追加
2、流要首先在try外声明,以便finally可操作
3、创建byte[]数组,避免频繁访问硬盘对硬盘造成伤害,同时提高效率
4、以循环的方式读,当读到文件末尾停止
5、读read() 写write() 都可能抛出IOException异常,都可以byte[]为参数 读会返回读入的个数,写要判断写入的个数
int read():返回读取的单个字符或字节的int值(0-255),若是文件末尾则返回-1
int read(byte[] bytes/char[] ch):读取多个字节或字符到数组中,返回读取的个数,若是文件末尾则返回-1
void write(byte[] bytes/char[] ch/String s,int off,int len):写一定要加偏置和长度
6、在循环体外要加flush()
7、关闭流,close()可能会抛出IOException异常

class Test {
    public static void main(String[] args) {
    	FileInputStream fileInputStream=null;
    	FileOutputStream fileOutputStream=null;
    	try{
    		fileInputStream=new FileInputStream("F:\\workspace\\HelloWorld\\src\\Hello.java");
    		fileOutputStream=new FileOutputStream("F:\\Hello.java",true);
    		byte[] bytes=new byte[1024];
    		while(true)
    		{
    			int num=fileInputStream.read(bytes);
    			if(num==-1)
    				break;
    			fileOutputStream.write(bytes,0,num);
    		}
    		fileOutputStream.flush();
    	}catch(FileNotFoundException e)
    	{
    		e.printStackTrace();
    	}catch(IOException e)
    	{
    		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();
    			}
    		}
    	}
    }
}

(二)关于纯文本文件的复制粘贴:

class Test {
    public static void main(String[] args) {
    	FileReader fileReader=null;
    	FileWriter fileWriter=null;
    	try{
    		fileReader=new FileReader("F:\\hh.txt");
    		fileWriter=new FileWriter("F:\\hhh.txt",true);
    		char[] ch=new char[512];
    		while(true)
    		{
    			int num=fileReader.read(ch);
    			if(num==-1)
    				break;
    			fileWriter.write(ch,0,num);
    		}
    		fileWriter.write("喔喔喔");
    		fileWriter.write("hello world",0,5);
    		fileWriter.flush();
    	}catch(FileNotFoundException e)
    	{
    		e.printStackTrace();
    	}catch(IOException e)
    	{
    		e.printStackTrace();
    	}finally{
    		if(fileReader!=null)
    		{
    			try{
    				fileReader.close();
    			}catch(IOException e)
    			{
    				e.printStackTrace();
    			}
    		}
    		if(fileWriter!=null)
    		{
    			try{
    				fileWriter.close();
    			}catch(IOException e)
    			{
    				e.printStackTrace();
    			}
    		}
    	}
    }
}

(三)java读取磁盘文件内容中的中文时会出现乱码,这是由于java使用的编码与被读取文件使用的编码不一致造成的:
解决方法一:通过System.out.println(System.getProperty(“file.encoding”));可查看JVM运行时所使用的编码,.txt文件默认使用ANSI编码,通过文件设置使两者编码一致
解决方法二:FileReader无法指定编码但InputStreamReader可以指定编码,通过new InputStreamReader(new FileInputStream(路径),对应于文件编码方式的java编码方式)

class Test {
    public static void main(String[] args) {
    	FileInputStream fileReader=null;
    	InputStreamReader fInputStreamReader=null;
    	FileWriter fileWriter=null;
    	try{
    		fileReader=new FileInputStream("F:\\123.txt");
    		fInputStreamReader=new InputStreamReader(fileReader,"gb2312");//"gb2312"对应.txt中的ANSI
    		fileWriter=new FileWriter("F:\\hhh.txt",true);
    		char[] ch=new char[512];
    		while(true)
    		{
    			int num=fInputStreamReader.read(ch);
    			if(num==-1)
    				break;
    			fileWriter.write(ch,0,num);
    		}
    		fileWriter.write("喔喔喔");
    		fileWriter.write("hello world",0,5);
    		fileWriter.flush();
    	}catch(FileNotFoundException e)
    	{
    		e.printStackTrace();
    	}catch(IOException e)
    	{
    		e.printStackTrace();
    	}finally{
    		if(fInputStreamReader!=null)
    		{
    			try{
    				fInputStreamReader.close();//关闭最外层即可
    			}catch(IOException e)
    			{
    				e.printStackTrace();
    			}
    		}
    		if(fileWriter!=null)
    		{
    			try{
    				fileWriter.close();
    			}catch(IOException e)
    			{
    				e.printStackTrace();
    			}
    		}
    	}
    }
}

解决方法三:使用FileInputStream读取字节后将字节转换为字符时添加编码方式
中文可以用Stream读取,但不能用Stream写

class Test {
    public static void main(String[] args) {
    	FileInputStream fileInputStream=null;
    	try{
    		fileInputStream=new FileInputStream("F:\\123.txt");
    		byte[] bytes=new byte[1024];
    		while(true)
    		{
    			int num=fileInputStream.read(bytes);
    			if(num==-1)
    				break;
    			System.out.print(new String(bytes,0,num,"gb2312"));
    		}
    	}catch(FileNotFoundException e)
    	{
    		e.printStackTrace();
    	}catch(IOException e)
    	{
    		e.printStackTrace();
    	}finally{
    		if(fileInputStream!=null)
    		{
    			try{
    				fileInputStream.close();
    			}catch(IOException e)
    			{
    				e.printStackTrace();
    			}
    		}
    	}
    }
}

(四)
在这里插入图片描述
(五)BufferedWriter要加newLine()方法
(六)BufferedReader可以一行一行的读,FileReader不能一行一行的读

FileInputStream文件字节输入流

1、
F:\哈哈.txt:
在这里插入图片描述

public class Hello {

	public static void main(String[] args) {
		//1、创建流
		FileInputStream fis=null;//因为要在finally里用到,所以必须在外面声明
		try{
			//FileInputStream fis=new FileInputStream("F:\\哈哈.txt");
			fis=new FileInputStream("F:\\哈哈.txt");//抛出FileNotFoundException
			//2、开始读
			int a=fis.read();//抛出IOException
			int b=fis.read();
			int c=fis.read();
			int d=fis.read();
			int e=fis.read();
			int f=fis.read();
			int g=fis.read();
			int h=fis.read();
			System.out.println(a);
			System.out.println(b);
			System.out.println(c);
			System.out.println(d);
			System.out.println(e);
			System.out.println(f);
			System.out.println(g);
			System.out.println(h);
		}catch(FileNotFoundException e){
				e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			//3、关闭流
			if(fis!=null)
			{
				try{
					fis.close();//抛出IOException
				}catch(IOException e){
					e.printStackTrace();
				}
			}
		}
	}	
}

控制台输出:
在这里插入图片描述
2、

public class Hello {
	public static void main(String[] args) {
		//1、创建流
		FileInputStream fis=null;//因为要在finally里用到,所以必须在外面声明
		try{
			//FileInputStream fis=new FileInputStream("F:\\哈哈.txt");
			fis=new FileInputStream("F:\\哈哈.txt");//抛出FileNotFoundException
			//2、开始读
			while(true)
			{
				int a=fis.read();
				if(a==-1)
					break;
				System.out.println(a);
			}
		}catch(FileNotFoundException e){
				e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			//3、关闭流
			if(fis!=null)
			{
				try{
					fis.close();//抛出IOException
				}catch(IOException e){
					e.printStackTrace();
				}
			}	
		}	
	}	
}

控制台输出:
在这里插入图片描述
缺点:频繁地访问硬盘,对硬盘有伤害且效率低下
3、读取之前在内存中准备一个byte类型的数组(相当于缓存),其长度为允许每次读取的最多字节数,每次读取多个字节存放到byte数组中,效率高
在这里插入图片描述

public class Hello {
	public static void main(String[] args) throws Exception{
		//1、创建流
		FileInputStream fileInputStream=new FileInputStream("F:\\哈哈.txt");
		//2、准备byte数组,开始读
		byte[] bytes= new byte[3];//允许最多读取三个字节    注意是最多
		
		int a=fileInputStream.read(bytes);
		System.out.println(new String(bytes));//bytes内存储的只是一个内存地址,要想输出内容,新建一个字符串对象
		System.out.println("a:"+a);
		
		int b=fileInputStream.read(bytes);
		System.out.println(new String(bytes));
		System.out.println("b:"+b);
		
		int c=fileInputStream.read(bytes);
		System.out.println(new String(bytes));
		System.out.println(new String(bytes,0,c));//输出有效字节
		System.out.println("c:"+c);
		
		int d=fileInputStream.read(bytes);
		System.out.println(new String(bytes));
		System.out.println("d:"+d);
		
		//3、关闭流
		fileInputStream.close();
	}	
}

控制台输出:
在这里插入图片描述
4、用循环读取文件

public class Hello {
	public static void main(String[] args) throws Exception{
		FileInputStream fileInputStream=new FileInputStream("F:\\workspace\\hello\\src\\hello\\Hello.java");
		byte[] bytes=new byte[1024];//一次读取1KB
		while(true){
			System.out.println("hh");
			int temp=fileInputStream.read(bytes);
			if(temp==-1)
				break;
			//将byte数组中的有效的数据转换为字符串   注意是有效的
			System.out.print(new String(bytes,0,temp));//注意不要额外加换行	
		}
		fileInputStream.close();
	}	
}

在这里插入图片描述
会进行两次循环
控制台输出:
在这里插入图片描述
在这里插入图片描述

FileOutputStream文件字节输出流

1、

public class Hello {
	public static void main(String[] args) throws Exception{
		FileOutputStream fileOutputStream=new FileOutputStream("haha",true);//追加写入
		String string=new String("Hello World!");
		byte[] bytes=string.getBytes();
		fileOutputStream.write(bytes);
		fileOutputStream.write(bytes,2,3);//写入byte数组的一部分
		fileOutputStream.flush();
		if(fileOutputStream!=null)
			fileOutputStream.close();
	}	
}

运行结果:
在这里插入图片描述
2、

public class Hello {
	public static void main(String[] args) {
		FileOutputStream fileOutputStream=null;
		try{
			fileOutputStream=new FileOutputStream("haha",true);
			String string=new String("Hello World!");
			byte[] bytes=string.getBytes();
			fileOutputStream.write(bytes);
			fileOutputStream.write(bytes,2,3);
			fileOutputStream.flush();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			try{
				if(fileOutputStream!=null)
					fileOutputStream.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
			
	}	
}

文件的复制粘贴

利用FileInputStream、FileOutputStream实现文件的复制粘贴

public class Hello {
	public static void main(String[] args) throws Exception{
		FileInputStream fileInputStream =new FileInputStream("haha.txt");
		FileOutputStream fileOutputStream=new FileOutputStream("G:\\haha.txt");
		
		byte[] bytes=new byte[1024];
		int temp=-1;
		//一边读一边写
		while((temp=fileInputStream.read(bytes))!=-1)
		{
			fileOutputStream.write(bytes,0,temp);//要写入有效部分
		}
		fileOutputStream.flush();
		
		if(fileInputStream!=null)
			fileInputStream.close();
		if(fileOutputStream!=null)
			fileOutputStream.close();
	}
}

FileReader文件字符输入流

public class Hello {
	public static void main(String[] args) throws Exception{
		FileReader fileReader =new FileReader("F:\\workspace\\hello\\src\\hello\\Example.java");
		char[] ch=new char[512];//一次最多读入1KB
		int temp=-1;
		while((temp=fileReader.read(ch))!=-1)
		{
			System.out.print(new String(ch,0,temp));
		}
		if(fileReader !=null)
			fileReader.close();
	}
}

FileWriter文件字符输出流

public class Hello {
	public static void main(String[] args) throws Exception{
		FileWriter fileWriter =new FileWriter("G:\\hh.txt",true);
		fileWriter .write("我是中国人");
		char[] ch={'h','e','l','l','o','w','o','r','l','d'};
		fileWriter .write(ch,0,5);
		if(fileWriter !=null)
			fileWriter.close();
	}
}

在这里插入图片描述

纯文本 文件的复制粘贴

public class Hello {
	public static void main(String[] args) throws Exception{
		FileReader fileReader =new FileReader("F:\\workspace\\hello\\src\\hello\\Example.java");
		FileWriter fileWriter =new FileWriter("G:\\Example.java",true);
		
		char[] ch=new char[512];
		int temp=-1;
		while((temp=fileReader.read(ch))!=-1)
		{
			fileWriter.write(ch,0,temp);
		}
		fileWriter.write("Hello world");
		fileWriter.flush();
		
		if(fileReader!=null)
			fileReader.close();
		if(fileWriter!=null)
			fileWriter.close();
	}
}

不同点:

1、字节流一次读入中文字符的一半,字符流一次读入一个中文字符
2、字节流读到byte数组中,数组长度1024表示每次最多读入1KB;字符流读到char数组中,数组长度512表示每次最多读入1KB
3、字节流都可以读,字符流只能读纯文本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值