file类-文件的写入与读取(二进制与字符)

1.二进制方式读取文件

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.NoSuchFileException;
import java.nio.charset.Charset;

class InputCompare{
	public boolean compareFiles(Path path1,Path path2)//判断两个文件的字节数和文件是否相同 
		   throws NoSuchFileException {//抛出错误类型
			   if(Files.notExists(path1)) {//判断传入的path1的路径下是否存在该文件,不是则抛出 
                                           //错误
				   throw new NoSuchFileException(path1.toString());//打印错误路径				   
			   }
			   if(Files.notExists(path2)) {//判断传入的path2的路径下是否存在该文件,不是则抛出 
                                           //错误
				   throw new NoSuchFileException(path2.toString());				   
			   }
			   try {
				   if(Files.size(path1) !=Files.size(path2)) {//判断两个文件的字节数目是否 
                                                              //相同
					   return false;
				   }
			   }catch(IOException e){//处理抛出的异常
				   e.printStackTrace();
			   }
			   try (InputStream inputStream1 = Files.newInputStream(
					   		path1,StandardOpenOption.READ);//从path1路径下的文件中读取二进 
                                                           //制数据
					InputStream inputStream2 = Files.newInputStream(
							path2,StandardOpenOption.READ)//从path2路径下的文件中读取二进制 
                                                          //数据   
					){
				   	int i1,i2;
				   	do {//在InputStream中有内部指针每次使用都会使指针指向下一个元素
				   		i1 = inputStream1.read();
				   		i2 = inputStream2.read();
				   		if(i1!=i2) {//将文件的元素之间进行对比 有一个元素不相同就返回false
				   			return false;
				   		}
				   		
				   	}while(i1 !=-1);//所有元素被内部指针全部指完了时返回-1 通过这个退出循环
				   		return true;//两个文件之间所有的元素都相同
			   		}catch (IOException e) {//捕获Files.createDirectory()方法抛出的异常
						return false;//有一定异常直接返回false 为了安全
					}
			   			   								   					 			   
		   }				
	}
	


public class Easy {

	public static void main(String[] args) {				
		Path path1 = Paths.get("D:\\music\\emq\\emm.txt");//使用get方法创建Path的快捷方式
		Path path2 = Paths.get("D:\\music\\emq\\fqn.txt");//使用get方法创建Path的快捷方式
		Path path3 = Paths.get("D:\\music\\emq\\emm.txt");//使用get方法创建Path的快捷方式
		InputCompare list1 = new InputCompare();
		try {
			System.out.println(list1.compareFiles(path1, path2));//false
			System.out.println(list1.compareFiles(path1, path3));//true
			
		} catch (IOException e) {//捕获Files.createDirectory()方法抛出的异常
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	

	}		
}


2.二进制方式写入文件

示例 Copy

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.List;

import org.omg.CORBA.portable.OutputStream;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.NoSuchFileException;
import java.nio.charset.Charset;

class OutputStreamDemo1{
	public void CopyputFiles(Path path1,Path path2)//判断两个文件的字节数和文件是否相同 
		   throws NoSuchFileException {//抛出错误类型
			   
			   if(Files.notExists(path1) || 
					   Files.notExists(path2)) {//判断传入的path1和path2的路径下是否存在该文 
                                                //件,不是则抛出错误
				   throw new NoSuchFileException(path1.toString()+path2.toString()); 
                                                         //打印错误路径				   
			   }
			   byte[] readData = new byte[1024];//存储元素的数组
			   try (InputStream inputStream = Files.newInputStream(
					   		path1,StandardOpenOption.READ);//从path1路径下的文件中读取二进 
                                                           //制数据
					java.io.OutputStream outputStream = Files.newOutputStream(
							path2,StandardOpenOption.CREATE)//在对应路径下的文件写入二进制 
					){
				   	int i=inputStream.read(readData);//将文本的数据存储到数组里	
				   	while(i !=-1)//所有元素被内部指针全部指完了时返回-1 通过这个退出循环
				   	{
				   		outputStream.write(readData,0,i);//在0开始的位置将1024个字节写入数 
                                                         //据流	
				   		i = inputStream.read(readData);
				   	}
				   		
			   		}catch (IOException e) {//捕获Files.createDirectory()方法抛出的异常
			   			e.printStackTrace();
					}
			   			   								   					 			   
		   }				
	}
	


public class Easy {

	public static void main(String[] args) {				
		Path path1 = Paths.get("D:\\music\\emq\\emm.txt");//使用get方法创建Path的快捷方式
		Path path2 = Paths.get("D:\\music\\emq\\fqn.txt");//使用get方法创建Path的快捷方式
		OutputStreamDemo1 list1 = new OutputStreamDemo1();
		try {
			list1.CopyputFiles(path1, path2);//注意该方法在被复制文件的字节数大于源文件的字节 
                                             //数时无法将多于的字节删除

			
		} catch (IOException e) {//捕获Files.createDirectory()方法抛出的异常
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	

	}		
}

(3)写入字符 方法1 FileWriter

public class Easy {

	public static void main(String[] args) {				
		Path path1 = Paths.get("D:\\music\\emq\\emm.txt");//使用get方法创建Path的快捷方式
		String string = "你好";
		Charset charset = Charset.forName("GB2312");//注意写入的格式
		
		try(java.io.OutputStream outputStream = 
				Files.newOutputStream(path1,StandardOpenOption.CREATE);//配置写入二进制数据的 
                                                                       //流				
			OutputStreamWriter writer = new OutputStreamWriter(
				outputStream,charset)) //配置写入的文件路径 和写入的格式
		{
			writer.write(string);//写入你好

			
		}catch (IOException e) {//捕获Files.createDirectory()方法抛出的异常
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	

	}		
}

2.写入 方法2 printWriter 一般使用这个,因为FileWriter必须使用计算机的编码来输出字符,这也就是说有些字符无法被正确的输出

public class Easy {

	

	public static void main(String[] args) {				
		Path path1 = Paths.get("D:\\music\\emq\\emm.txt");//使用get方法创建Path的快捷方式
		String string = "Good,你好";
		String string2 = "Easy,你好";
		Charset charset = Charset.forName("GB2312");//注意写入的格式
		
		try(BufferedWriter bufferedWriter =//配置一个默认大小的数据写入缓冲区
				Files.newBufferedWriter(
				path1, charset, StandardOpenOption.CREATE);//配置文件路径 文件写入格式 写入 
                                                           //模式
			PrintWriter printWriter = 
					new PrintWriter(bufferedWriter))//将配置好的缓冲区,交给pritfWriter对象
		{
			printWriter.println(string);//在缓冲区输入Good,你好
			printWriter.println(string2);
			
		}catch (IOException e) {//捕获Files.createDirectory()方法抛出的异常
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	

	}		
}

(4)读取字符 InputStreamReader

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Easy {

	public static void main(String[] args) {				
		Path path1 = Paths.get("D:\\music\\emq\\emm.txt");//使用get方法创建Path的快捷方式

		Charset charset = Charset.forName("GB2312");//注意写入的格式
		
		try(java.io.InputStream  inputStream = 
				Files.newInputStream(
				path1,StandardOpenOption.READ);//文本输入流中配置文件路径 和输入模式(读取文 
                                               //件)
				
			InputStreamReader read = 
				new InputStreamReader(
				inputStream,charset)//让read对象在输入流中操作 并且配置了写入的格式	
			)
		{
			char[] Char = new char[27];//存储读取的字符
			read.read(Char);//将返回的字符以数组的形式赋给对应的数组
			for(char i : Char) {
				System.out.print(i);//遍历文件字符
				
			}
			
		}catch (IOException e) {//捕获Files.createDirectory()方法抛出的异常
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	

	}		
}

(5)用缓冲区一次读取一行的字符串 BufferedReader

public class Easy {

	public static void main(String[] args) {				
		Path path1 = Paths.get("D:\\music\\emq\\emm.txt");//使用get方法创建Path的快捷方式

		Charset charset = Charset.forName("GB2312");//注意写入的格式
		BufferedReader readline = null;
		try {
			readline = Files.newBufferedReader(path1,charset);//配置缓存区 因为有可能抛出错 
                                                              //误所以用try-catch模块
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} 
		try{
			String string = readline.readLine();//接收文本第一行的字符串
			while(string != null) {//没有文本时退出循环
				System.out.println(string);//遍历字符串
				string=readline.readLine();//我估计应该是有内部指针 这一行指完,二次调用指下一 
                                           //行的字符串
			}		
		}catch (IOException e) {//捕获Files.createDirectory()方法抛出的异常
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	

	}		
}

(6)将控制台显示的信息转到文件 PrintStream

public class Easy {

	public static void main(String[] args) {				
		Path path1 = Paths.get("D:\\music\\emq\\emm.txt");//使用get方法创建Path的快捷方式
		try(java.io.OutputStream outputStream =
				Files.newOutputStream(
				path1, StandardOpenOption.APPEND);//配置输出流 文件路径 打开文件的模式为追加
				
			PrintStream print = 
				new PrintStream(outputStream,true)//使用System.out.println();打印写入文件
			)
		{
			System.setOut(print);//更改System.out.println()方法的输出方式
			System.out.println("World");//向文件写入World
		}catch (IOException e) {//捕获Files.createDirectory()方法抛出的异常
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}		
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值