java File,FileReader,BufferedReader,BufferedWriter,FileWriter

28 篇文章 1 订阅
常用API : 点击打开链接
流类关注的是文件内容,而File类关注的是文件在磁盘上的存储。 



1.FileReader : 字符流
BufferedReader : 也是字符流,但是在BufferedReader可以先把数据放到一个缓存区里,然后在进行处理,而且在BufferedReader 里有一个readLine()方法。
所谓缓冲区,就是能够一次性读取一块缓冲区大小的数据,再从缓冲区中去读取数据,而不用一点一点地直接从硬盘中抽取数据。

源码:


public class BufferedReader extends Reader {
private static int defaultCharBufferSize = 8192;


 public BufferedReader(Reader in, int sz) {
        super(in);
        if (sz <= 0)
            throw new IllegalArgumentException("Buffer size <= 0");
        this.in = in;
        cb = new char[sz];
        nextChar = nChars = 0;
    }


public BufferedReader(Reader in) {
        this(in, defaultCharBufferSize);
    }
}



创建一个BufferedReader对象 super(in )也就是调用父类(Reader)的构造方法Reader(Object lock)


public abstract class Reader implements Readable, Closeable {


   
    protected Object lock;


    
    protected Reader() {
        this.lock = this;
    }


    
    protected Reader(Object lock) {
        if (lock == null) {
            throw new NullPointerException();
        }
        this.lock = lock;
    }




由java api 文档可知:


protected  Reader() 
           创建一个新的字符流 reader,其重要部分将同步其自身的 reader。 
protected  Reader(Object lock) 
           创建一个新的字符流 reader,其重要部分将同步给定的对象。 




也就是创建的BufferedReader(new Reader() ) 其中的new Reader()可以是Reader的任何子类都可以
比如FileReader --》
BufferedReader br=new BufferedReader(new FileReader(filepath));




public List getFilepathString(String filepath){
		BufferedReader br=null;
		List<String> list=null;
		try{
			list=new ArrayList<String>();
			br=new BufferedReader(new FileReader(filepath));
			String temp;
			while((temp=br.readLine())!=null){
				list.add(temp);
			}
		}catch(IOException e){
			System.out.println("getRowNum error ");
		}
		finally{
			if(null !=br){
				try{
					br.close();
				}catch(IOException e){
					System.out.println("br close error");
				}
			}
		}
		System.out.println("File's size:"+list.size());
		return list;
	}


2.BufferedWriter FileWriter

/**
	 * 写入文件并换行
	 * @param file
	 * @param list
	 * @return
	 * @throws IOException
	 */
	public  boolean writeToFile2(File file,List list) throws IOException{
		BufferedWriter bw=	new BufferedWriter(new FileWriter(file));
		try{
			for(int i=0;i<list.size();i++){
				String s=list.get(i).toString();
			bw.write(s);
			bw.newLine();
			System.out.println(s);
			//bw.flush();
			//bw.close();
			}
			bw.flush();
		}catch(Exception e){
			return false;
		}
		finally{
			if(bw!=null){
				bw.close();
			}
		}
		return true;
	}
	@Test
	public void test10(){
		List list=new ArrayList();
		String s="1,3,2,4,6";
		String s1="1,3,100,4,6";
		String s2="1,3,101,4,6";
		String File="C:\\Users\\P1311529\\Desktop\\MOM04_GDC3_20171015_01.csv";
		list.add(s);
		list.add(s1);
		list.add(s2);
		System.out.println(list);
		try {
			
			System.out.println(writeToFile2(new File(File),list));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


FileOutputStream fos=new FileOutputStream(file,true);
	    	PrintStream ps=new PrintStream(fos);


public boolean writeToFile(File file,List list) throws IOException{
	    for(int i=0;i<list.size();i++){
	    	String s=list.get(i)+"\r\n";
	    	FileOutputStream fos=new FileOutputStream(file,true);
	    	PrintStream ps=new PrintStream(fos);
	    	System.out.println(s);
	    	
	    	ps.print(s);
	    	ps.close();
	    }
		
		return true;
	}


3.字节流与字符流的区别:




字节流和字符流使用是非常相似的,那么除了操作代码的不同之外,还有哪些不同呢?


字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的


字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容





4.那开发中究竟用字节流好还是用字符流好呢?


在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。

如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。


------------------------------------------------
5. Java.io.File(File用于管理文件或目录; 所属套件:java.io)


1、 构造函数:File(java.lang.string路径,java.lang.string文件名) 说明:建立代表文件或目录的File对象。


2、 canRead方法:(boolean canRead())判断是否可读取


3、 canWrite方法:(boolean canWrite)判断是否可以写入


4、 createNewFile方法:(boolean createNewFile())说明:创建文件,成功返回TRUE,否则返回false


5、 delete方法:(boolean delete())说明:删除文件或目录,成功返回TRUE,否则返回FALSE。


6、 exist方法:(boolean exist()) 说明:检查文件或目录是否存在。


7、 getName方法:(java.lang.string getName()) 说明:取得文件或目录的名称(只有文件的name)。


8、 getPath方法:(java.lang.string getPath()) 说明:取得文件或目录的名称(包括文件的name)。


9、 lastModified方法:(long lastModified()) 取出最后一次修改的时间。


10、 length方法:(int length())说明:取得文件的长度


11、 listfiles方法:(File[] listFiles()) 说明:取出该目录下的所有文件。


12、 isDirectory方法:(boolean isDirectory())说明:判断是否为文件。


13、 isFile方法:(boolean isFile) 说明:判断是否为文件。


14、 isHidden 方法:( Boolean isHidden()) 说明:判断是否为隐藏文件。


15、 mkdir方法:(boolean mkdir)说明:创建目录,成功返回TRUE,否则返回FALSE


四、 java.io.FileReader(FileReader 用于从文件中读取字符 ;所属套件:java.io)


1、 构造函数(FileReader (Java.lang.strig文件路径和名称) 说明:为要读取的文件建立一个FileReader对象)


2、 read方法:(1)(int read())说明:从文件读取一个字符,返回值为一整数,为读取得字符串的字符码,若返回值为-1,则代表已经读到文件的结尾。(2) int read(char[] chararray,int startpos,int length)说明:将从startpos开始,读取length字符,保存到chararray数组中,返回值是读取到的字数,如果返回-1,则代表已经读到文件的结尾。


3、 skip方法:(long skip(int 要略过的字符数) 说明:直接将文件读取指针向后移动数个字符,从而略过字符不读取);


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值