Java菜鸟学习笔记--I/O篇(一):I/O Stream 简介

什么是IO?



在Java API 中,可以从某个地方读入一个字节序列的对象叫做输入流,可以向某个地方写入一个字节序列的对象叫输出流。某个地方指的是來源地址或者目的地,一般都是文件,或者是网络连接,甚至是内存块。




IO流的图结构




Java菜鸟学习笔记--I/O篇(一):I/O Stream 简介_第1张图片




IO流实例


1.在磁盘上创建一个文件,然后写入信息,之后保存退出


/*
	
	1.IO的基本使用
	2.代码目的:创建一个文件,并且写入数据然后保存

*/
package me.io;
import java.io.*;

public class FileWriterDemo{
	
	public static void main(String[] args)  throws IOException {
			
		//1.先创建FileWriter这个类的文件对象,要画画线有纸
		//这一步效果就是在当前路径下创建一个名为Demo.txt的文件
		//可以指定存放目录
		FileWriter fw = new FileWriter("Demo.txt");
		
		//FileWriter dw = new FileWriter("/yg/home/Desktop/DWdemo.txt");
		//这行代码因为输入路径不存在,错误即抛出可异常
		
		
		FileWriter dw = new FileWriter("/home/yg/Desktop/DwDemo.txt");
		//这样制定路径就可以找桌面 下新建了。
		
		//把字符写入文件
		//Writer是抽象类,其中几个方法 close,flush,write一部分是抽象方法,
		
		//往缓冲区写入字符串。
		//写入字母,这个方法由父类Writer继承而来
		fw.write("1.This is a Test.");
		fw.write("2.这是个文件写入测试.");
		
		//光写入缓冲区还是不行,应该还要刷新缓冲区,然后才能流入文件
		//这个方法在Write类中是抽象方法,在子类中实现复写了这个方法。
		fw.flush();
		
		//然后查看是否有更新
		/*当前目录下有个Demo.txt文件,打开文件,其中有:
		This is a Test这是个文件写入测试
		*///说明写入成功,用write方法写每次都写在最后面
		
		fw.write("3.这个close()方法的测试.");
		//close方法测试,这个方法关闭文件流之千做一次更新
		fw.close();
		
		//在使用close之后就不能在进行write()了
		//fw.write("test");
		/*fw.write在colse之后,编译可以通过,但是在JVM运行时候,出现了IOException
		:Exception in thread "main" java.io.IOException: Stream closed
		:说明关闭之后不能在写入文件了
		*/
		
		
		
	}
}


2.处理使用write时候可能出现的IOExcepiton

/*
	代码目的:处理使用write时候可能出现的IOExcepiton
	
	要点:1.try中定义的变脸在括号外无法使用,所以要在括号外定义。里面初始化
		 2.资源不管写入出现问题还是怎么样,一定要close资源。释放资源。所以把close放在finally后面。
		
*/
package me.io;
import java.io.*;

public class FileWriterExceptionDemo{
	
	public static void main(String[] args){
		
		//三个步骤:创建文件,写入文件,关闭文件
		//这个三个文件都需要try catch
		
		//在这里先定义引用变量
		FileWriter fw=null;
		
		try{
		//由于括号没定义变量为局部变量,之后就无法访问,要在外面定义,里面初始化
		fw = new FileWriter("/ExceptionDemo.txt");//这个路径肯定出错,用于调试什么时候用close()
		
		fw.write("IOException Test");
		
		//fw.close();//由于如果前面出错,那就无法执行到关闭这步,关闭又必须执行,所以要放在最后
			
		}catch(IOException ea){
			
			System.out.println("Write  Exception\n"+ea.toString());
			
		}finally{
			
			//把close写在这里为了不管创建或者写入出现问题,一定要关闭资源	
			//close 也会抛出异常,也需要try catch...
			try{
				if(fw != null)
					fw.close();
				/*加入创建文件出错,那么这里关闭就会因为fw=null 所以出现了
				NullPointerException 错误。所以要选择性的调用close
				*/
			}catch(IOException clo){
				
				System.out.println("Close File Excepton\n"+clo.toString());
			}
		}
	}
}


3.对磁盘已有文件的续写

/*
	代码目的:对已有文件续写,如果已经有一个文件就打开他而不是在末尾出续写
	要点:
	
*/
package me.io;
import java.io.*;

public class FileWriterContinueDemo{
	
	public static void main(String[] args){
		
		//创建文件
		FileWriter fw =null;
		
		try{
			//表示要对文件进行续写
			fw = new FileWriter("Demo.txt",true);
			for(int i=0;i<30;i++)
				fw.write("Test\n");
			
		}catch(IOException ea){
			
		}finally{
			try{
				if(fw!=null)
					fw.close();
			}catch(IOException close){
				System.out.println(close.toString());
			}
		}
		
	}
	
}


Java菜鸟学习笔记--I/O篇(一):I/O Stream 简介_第2张图片



4.read()用法一:读取磁盘中已经存在的txt文件,并打印出txt内保存的内容


/*
	代码目标:读取磁盘中已经存在的txt文件,并打印出txt内保存的内容
	

*/
package me.io;
import java.io.*;

public class FileReaderDemo{
	
	public static void main(String[] args) throws Exception{
		
		//创建一个流,把txt文件联系到程序中。
		FileReader fr= new FileReader("./lijiacheng.txt");
		
		int ch=0;
		
		//从文件中读却一个字符,第一次调用读第一个,第二次第二个,依次列推
		ch= fr.read();
		
		//当读取到最后一个字符时候,read()就会返回-1,说明已经到文件末端了
		
		//在循环里读
		int sum=0;
		while((ch = fr.read() ) != -1){
			//转换为字符打印输出
			System.out.print( (char)ch );
		}
		//最后把资源释放
		fr.close();

	}
	
}


Java菜鸟学习笔记--I/O篇(一):I/O Stream 简介_第3张图片



5.read()用法二:读取磁盘中存在的txt小说文件,并且放入数组再打印

/*
	代码目的:通过字符数据进行读取文件
	要点:1.read()可以将文件中数据放入数组中,读取结束时候返回-1
		 2.字符数组可以用静态方法valueOf()转换成字符串在输出

*/
package me.io;
import java.io.*;

public class FileReaderDemo_2{
	
	public static void main(String[] args) throws Exception {
		
		//创建文件对象
		//读取当前目录下的Demo.txt文件
		FileReader fr= new FileReader("./Demo.txt");
		
		//创建字符数组
		char[] book=new char[100];
		/*
			txt文件中有 abcde
		*/
		
		//开始读取
		int words=fr.read(book);
		//转换输出
		System.out.println(words+" words : "+String.valueOf(book));
		//输出: 2 words : ab
		
		//多read几次看看什么情况?
		
		words=fr.read(book);
		System.out.println(words+" words : "+String.valueOf(book));
		//这次输出:2 words : cd
		
		words=fr.read(book);
		System.out.println(words+" words : "+String.valueOf(book));
		//然后到这里输出:2 words : cd

		words=fr.read(book);
		System.out.println(words+" words : "+String.valueOf(book));
		//然后到这里输出: -1 words : e
		fr.close();
		/*
		如上输出原因:
		因为数组大小只有2个字节。所以每次最多只能存两个。就依次,ab,然后覆盖写了
		,变成cd,然后到了e,e和结束符号写入字符串中。
		到了最后依次read(),前面几次已经到了文本末尾,再读就出错了。所以返回-1
		
		*/
	
		//修改以上代码,将它放入循环中。
		
		//在读取一次资源文件
		fr= new FileReader("./lijiacheng.txt");
		//读入李嘉诚传。字数非常多
		
		//当读取到txt最后数据结束时候,返回-1,不构成循环条件
		//重复对book这个数组进行写入。第二次写入覆盖第一次写入的内容。
		while(( words=fr.read(book)) != -1 ){
			
			//String.valueOf(数组名,开始偏移量,读取长度)
			System.out.println(words+" words :"+String.valueOf(book,0,words));	
		
		}

	}
	
}


Java菜鸟学习笔记--I/O篇(一):I/O Stream 简介_第4张图片


/*
	代码目的:读取.java源文件,控制台输出

*/
package me.io;
import java.io.*;
public class FileReaderDemo_3{
	
	
	public static void main(String[] args) throws Exception{
		
		//创建文件输入流对象
		FileReader fr=new FileReader("./FileWriterDemo.java");
	
		//放入的字符数组
		char[] txt=new char[1024*2];
		//记录字数
		int words=0;
		//使用read方法
		while( (words=fr.read(txt) ) != -1){
			
			System.out.println(words+" words\n "+String.valueOf(txt,0,words));
			
		}
		fr.close();

	}
	
}


Java菜鸟学习笔记--I/O篇(一):I/O Stream 简介_第5张图片




6.将一个文件复制到另外一个文件

/*
	代码目的:将一个文件复制到另外一个文件
*/
package me.io;
import java.io.*;

public class FileCopyDemo{
	
	public static void main(String[] args)throws Exception{
		
		FileCopyDemo.FileCopy("./FileCopyDemo.java","text.txt",false);
		FileCopyDemo.FileCopy("./lijiacheng.txt","text2.tx",true);
		
	}

	//把两种cp方法写成静态方法
	//三个参数,第一个为源文件路径,第二个为目标文件路径,第三个为是否使用数组复制的方法
	public static boolean FileCopy(String source_path,String destination_path,boolean flags){
		
		//创建两个引用
		FileWriter writerfile = null;
		FileReader readfile = null;
	
		try{
			//关联文件路径,形参就是文件路径
			writerfile = new FileWriter(destination_path);
			readfile = new FileReader(source_path);
			
			//判断标志,如果为真就使用字符数据的复制方法
			if(flags){
				
				int len;//这个用于输入流放入字符数组时候,记录读取长度
				char[] buf = new char[1024];//用于读取输入流中的字符
				//循环读取到数组
				while( (len = readfile.read(buf)) != -1 ){
					
					writerfile.write(buf,0,len);
					
				}
				writerfile.flush();
			}
			//不为真情况下则使用读取单个字节然后循环写入的方法(这个方法很慢每读一次写入一次)
			else{

				int words = 0; //用作读和写的过渡值
				while( (words = readfile.read() ) != -1){
					
					//写入复制到的文件中	
					writerfile.write(words);
				}
				
			}
			
		}catch(IOException ea){
			System.out.println(ea.toString());
		}
		finally{
				
			try{
				if( (writerfile == null ) || (readfile == null) )
					return false;
				
				//最后要关闭资源
				else if(writerfile != null)
					writerfile.close();
				else if(readfile != null)
					readfile.close();
			}catch(IOException close){
				System.out.println(close.toString());
			}
		}
		
		return true;
	}
}

Java菜鸟学习笔记--I/O篇(一):I/O Stream 简介_第6张图片



作者:YangGan
出处: http://blog.csdn.net/incyanggan
本文基于 署名 2.5 中国大陆 许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名Yanggan (包含链接).

你可能感兴趣的:(Java,菜鸟,io,Java,对象,exception)