文件的储存与读取

    数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。 

在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。比如电脑上的硬盘,磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的。外存的存储量最大,其次是内存,最后是缓存,但是外存的数据的读取最慢,其次是内存,缓存最快。

java中将输入输出象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流(Input Stream),将数据从内存写入外存中的称为输出流(Output Stream)显然,从上述描述可知,Input Stream不关心数据源来自何种设备;而Output Stream不关心数据的目的是何种设备

       流序列中的数据既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。因此Java中的流分为两种:
 1)  字节流:数据流中最小的数据单元是字节
 2)  字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。

 

    在Java中,对于文件的储存于读写有与之对应的类, FileInputStream类是以文件作为数据输入源的数据流或者说是打开文件,从文件读数据到内存的类。该类可以使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色。FileOutputStream类用来处理以文件作为数据输出目的数据流或者说是从内存区读数据入文件。包装类DataOutputStreamDataInputStream为我们提供了多种对文件的写入和读取方法,writeBoolean(),writeUTF()writeCharwriteByte()writeDouble()等和对应的read方法,

这些方法极大的方便了我们的写入和读取操作。

    另外,我们需要注意的是:1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读/写操作结束时,应调用close方法关闭流。

 

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileIO {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args){	
//		//创建文件
//		try {
//			file.createNewFile();
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
//		
//		file = new File("F:/a/a/test"); //创建目录
////		file.mkdir(); //只能创建一个目录
//		file.mkdirs(); //创建多个目录
		
		//实例化对象
		FileIO f = new FileIO();		
		try {
			//读取文件
//			f.readFile("F:\\test.txt");
			//一次性读取
			f.readFile2("F:\\test.txt");
			//分段读取
//			f.readFile3("F:\\test.txt");
			
			//写入文件
//			f.writeFile("F:\\test.txt");
			//写入中文(带字符集)文件
//			f.writeFile2("F:\\test.txt","呵呵呵呵呵呵呵呵!");
			
			//复制文件
//			f.copyFile("F:\\test.txt", "F:\\test_copy.txt");
			
			//
//			f.writeFile3();
//			f.readFile4();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	public void printFile(String fileName){
		File file = new File(fileName);
		//列出子目录和文件
		File[] files = file.listFiles();
			
	}
	
	public void readFile(String filename) throws IOException{
		//创建文件输入流:读取
		try {
			FileInputStream fis = new FileInputStream(filename);
			/*byte存在负数:-128 ---> +127
			 * */
			//读取文件
			//读取一个字节
			int n = fis.read();
			
			while(n != -1){
				System.out.println((char)n);
				
				//读取下一个字节
				n = fis.read();
			}
			//用完要关闭输入流
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//一次全部读取
	public void readFile2(String filename) throws IOException{
		//创建文件输入流:读取
		try {
			FileInputStream fis = new FileInputStream(filename);
			//输入流后面可读取的字节数
			int length = fis.available();		
			//一次全部读取
			byte[] bytes = new byte[length];
			
			//readNum真实读取的数量
			int readNum = fis.read(bytes);
			
			//还原成字符串
//			String content = new String(bytes);
			String content = new String(bytes,"GB2312");//指定字符集
			System.out.println(content);
			
			//用完要关闭输入流
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//分段读取
	public void readFile3(String filename) throws IOException{
		//创建文件输入流:读取
		try {
			FileInputStream fis = new FileInputStream(filename);
			//建立一个字节队列
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			//首先按一个字节读取
			int n = fis.read();
			while(n != -1){
				//把字节存入队列
				bos.write(n);
				
				
				if(n == '\n'){
					//把队列中的数据读取出来
					byte[] bytes = bos.toByteArray();
					//还原字符串
					String str = new String(bytes,"GB2312");
					System.out.print(str);
					//清空队列
					bos.reset();
				}				
				//读取下一个字节
				n = fis.read();
			}			
			//用完要关闭输入流
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//写入文件
	public void writeFile(String filename) throws IOException{
		try {
			//每次写入均从最开始位置写入,覆盖
//			FileOutputStream fos = new FileOutputStream(filename);
			//每次写入从最后位置写入,不覆盖
			FileOutputStream fos = new FileOutputStream(filename, true);
			
			//写数据
			//写入一个字节
			fos.write(1111);
//			fos.write("A");
			
			//关闭
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//写入文件
	public void writeFile2(String filename, String content) throws IOException{
		try {
			FileOutputStream fos = new FileOutputStream(filename, true);
			//将字符串转化成byte
			byte[] bytes = content.getBytes("GB2312");			
			//写入数据
			fos.write(bytes);			
			//关闭
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//复制文件
	public void copyFile(String fromFile, String toFile) throws IOException{
		try {
			//创建输出流
			FileInputStream fis = new FileInputStream(fromFile);
			//创建写入流
			FileOutputStream fos = new FileOutputStream(toFile, true);
			//读取一个字节
			int n = fis.read();
			while(n != -1){
//				n = n+1;//简单加密
//				n = n-1;//解密
				
				//写入数据
				fos.write(n);
				//读取下一个字节
				n = fis.read();
			}			
			//用完要关闭输入流
			fis.close();			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
	}
	
	//对于int数据而言,按一个字节读取或写入会存在丢失
	public void readFile4() throws IOException{
		try {
			//如果文件不存在会自动创建
			FileInputStream fis = new FileInputStream("F:/save.dat");
			
			//创建数据输入流,对文件输入流进行封装
			DataInputStream dis = new DataInputStream(fis);			
			//向输入流写入一个int
			int score = dis.readInt();
			System.out.println(score);
			//关闭
			dis.close();
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public void writeFile3() throws IOException{
		try {
			//如果文件不存在会自动创建
			FileOutputStream fos = new FileOutputStream("F:/save.dat");
			
			//创建数据输出流,对文件输出流进行封装
			DataOutputStream dos = new DataOutputStream(fos);
			int score = 12345;
			int score1 = 12222;
			//向输出流写入一个int
			dos.writeInt(score);
			dos.writeInt(score1);
			//关闭
			dos.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

 

 

 

<!--EndFragment--><!--EndFragment-->

猜你喜欢

转载自dewing.iteye.com/blog/2124772