IO流相关知识总结

File类的使用

  • File类中的方法是针对于本地文件来使用的,该类可以在硬盘中操作:创建文件、删除文件、获取文件的大小、获取文件的路径(包括相对路径和绝对路径)、判断是否为文件或者是目录等等方法。
  • 代码应用如下:
import java.io.File;
import java.io.IOException;
public class FileDemo {
	public static void main(String[] args) {
		File file = new File("abc.txt");
		if (file.exists()) {
//			file.delete();
//			System.out.println("发现文件并删除");
			System.out.println("判断是否为目录:"+file.isDirectory());
			System.out.println("判断是否为文件:"+file.isFile());
			System.out.println("获取当前文件的相对路径:"+file.getPath());
			System.out.println("获取当前文件的绝对路径:"+file.getAbsolutePath());
			System.out.println("获取文件大小:"+file.length());//单位:字节
			
		}else {
			try {
				file.createNewFile();
				System.out.println("没有发现文件,已经创建成功!");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

  • 运行结果如下:
判断是否为目录:false
判断是否为文件:true
获取当前文件的相对路径:abc.txt
获取当前文件的绝对路径:E:\Eclipse\EclipseWorkspace\FileDemo\abc.txt
获取文件大小:18
  • 特别关注:在获取文件的相对路径和绝对路径时,如果你传入的文件路径本身就为绝对路径,例如:File file = new File(“D:abc.txt”);那么二者得出的结果是一样的,会返回绝对路径。只有当传入的路径为相对路径时,例如:File file = new File(“abc.txt”);绝对路径和相对路径的返回才会不同,相对路径返回该文件的相对路径,绝对路径返回文件的绝对路径。

流分类

按照流向分类(以内存为参照)
  • 输入流:文件以流的形式流进内存,定义为输入流。
  • 输出流:文件以流的形式流出内存,定义为输出流。
按照处理单元分类
  • 字节流:以字节的方式流进流出内存,定义为字节流,一个字节=8byte。
  • 字符流:以字符的方式流进流出内存,定义为字符流,一个字符=16Unicode。
  • 缓冲流:利用该方法中自带的一行缓冲区传输数据。
  • 二进制流:利用子类DataInputStream和DataOutputStream以二进制的单元方式进行数据的读写。(可以参考字符流代码处理,其中也要利用装饰模式,将其他类型的对象作为参数,传入二进制对象中。)
字节流-----代码参考
package org.dsl.ioproject;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class IOProject {
	public static void main(String[] args) {
		InputStream in = null;
		OutputStream out = null;
		try {
			//定义读取文件的位置
			 in = new FileInputStream("d:/a.txt");
			//定义写入文件位置
			 out = new FileOutputStream("d:/b.txt");
			//定义字节缓冲数组,定义每次读取数据的大小
			byte [] buf = new byte[10];
		    //定义标识,方便写入文件的大小判断
			int len = -1;
			while((len = in.read(buf)) != -1) {
				//循环写入文件,每次写入从0开始,到每次写入不超过字节数组缓冲区定义的大小的真实长度为止
				out.write(buf,0,len);
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//流使用完成后要关闭,否则不会写进文件中,关闭原则:先写后关,先关出再关入
			if(out!=null)
				try {
					out.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if(in!=null)
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
	}


}

特别注意
  • 在定义文件的输入输出位置时,文件中的分隔符需要注意, 可以写成如下几种格式:

             1. new FileInputStream("d:/a.txt");(Linux中分隔方式)
             2. new FileInputStream("d://a.txt");(Linux中分隔方式)
             3. new FileInputStream("d:\\a.txt");(windows中分隔方式)
             4. 使用方法进行分隔自动匹配系统进行分隔File.pathSeparator(windows中文件的分隔";"),File.separator(windows中目录分隔符“\”)
    
  • .若单独使用输入流或者输出流时,在定义内存中的字符缓冲数组时,可以利用available()方法自动匹配需要操作的文件字节大小,例如:

             1. InputStream in = new FileInputStream("d://a.txt");
             2. byte [] buf = new byte [in.available()];
    
  • 在实际输入输出一起使用时,即将一个文件以流的形式读入内存,再以流的方式写进文件。一般会将字节缓冲数组定义较小,不会利用available()方法自动匹配需要操作的文件字节大小,进行一次性传输,主要避免文件过大,一次性读取会造成资源过载,所以一般定义较为合理,并且小于文件的实习大小的字符缓冲数组,例如:byte [] buf = new byte[10];但是如此处理在写文件时会出现问题,在每一次文件按照缓冲区的大小写入时,下一次会整体覆盖上一次的缓冲区的数据,但是文件最后一次传输时,文件的大小不足以覆盖整个缓冲区,这是会产生最后一次所能够覆盖的范围+倒数第二次缓冲区的剩余数据,作为最后一次整体返回,就会发生数据错乱的问题。解决的方法就是,将每次读进内存的实际大小写进最终文件,而不是将整个缓冲区的数据写进文件。代码示例如下:
    在这里插入图片描述图文理解:
    在这里插入图片描述

字符流------代码参考
package CharIOProject;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

public class CharIODemo {
	public static void main(String[] args) {
		Reader reader = null;
		Writer writer = null;
		try {
			 reader = new FileReader("D://说明.txt");
			 writer = new FileWriter("D://个人说明.txt");
			 int len = -1;
			 char [] buf = new char [4];
			 StringBuffer sb = new StringBuffer();
			 while ((len = reader.read(buf))!=-1) {
				sb.append(buf,0,len);
			}
			 System.out.println(sb);
			String context = sb.toString(); 
			context = context.replace("name", "小花").replace("sex", "男");
			writer.write(context);
			System.out.println(context);

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(writer != null)
				try {
					writer.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if(reader != null)
				try {
					reader.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
	}

}


缓冲流-----代码参考
package org.dsl.BuferedStreamDemo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

public class BuferedStreamDemo {
	public static void main(String[] args) {
		Reader reader = null;
		Writer writer = null;
		BufferedReader bufferedReader = null;
		BufferedWriter bufferedWriter = null;
		
		try {
			 reader = new FileReader("D://说明.txt");
			 writer = new FileWriter("D://个人说明.txt");
			 //利用装饰模式将字符流装换为缓冲流
			 bufferedReader = new BufferedReader(reader);
			 bufferedWriter = new BufferedWriter(writer);
			 String line = null;
			 StringBuffer sb = new StringBuffer();
			 while ((line = bufferedReader.readLine())!=null) {
				sb.append(line);
			}
			 System.out.println(sb);
			String context = sb.toString(); 
			context = context.replace("name", "小花").replace("sex", "男");
			bufferedWriter.write(context);
			System.out.println(context);

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if(bufferedWriter != null)bufferedWriter.close();
				if(bufferedReader != null)bufferedReader.close();
				if(writer != null)writer.close();				
				if(reader != null)reader.close();
			} catch (Exception e2) {
				// TODO: handle exception
			}

		}
	}
}

特别注意

所谓的缓冲流,就是利用装饰模式,将定义好的其他流以参数的形式传入到缓冲流类中,代码后面的入去和写入都是利用缓冲流类生成的新的对象,来进行读写的。

  • 流关闭原则:
    流使用完成后要关闭,否则不会写进文件中,关闭原则:先写后关,先关出再关入,如果有嵌套,先关外层,再关内层。
    为避免写入文件时是空文件,会进行关闭流的操作,即使用close()方法将流关闭,也可以使用flush()方法,将流在缓冲区的数据刷新到要写入的文件中,其中close()方法包含flush()方法,使用close方法不仅可以将数据从缓冲区刷新到文件中,同期会释放资源,所以推荐使用close方法将流关闭处理。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值