zoukankan      html  css  js  c++  java
  • java中文件操作《一》

    在日常的开发中我们经常会碰到对文件的操作,在java中对文件的操作都在java.io包下,这个包下的类有File、inputStream、outputStream、FileInputStream、FileOutputStream、reader、writer、FileReader、FileWriter等等,其中对文件的操作又分为两大类,一类是字符流,一类是字节流。所谓的字符流是以字节(8b)为单位进行读/写,字符流即使用字符为单位读/写,java使用unicode编码,一个字符两个字节,下面分别对字节流和字符流做如下阐述,

    一、字节流


    字节流即以字节为单位进行读/写,使用于操作二进制文件,比如,图像、视频、音频等文件。

    在字节流中又分为读和写,这里的读和写是针对于程序而言。读,即从磁盘读取文件到程序;写,即写入内容到磁盘。

    在字节流中inputStream和outputStream作为读和写的抽象类,仅仅定义了一部分基本的方法,具体的操作由其子类完成。其子类如下图所示,

    这里重点对FileInputStream和FileOutputStream进行说明。

    FileInputStream是以字节方式读取的文件操作类,

    其构造方法如下图,

    有三个构造方法,主要对第一个和第三个进行说明,第一个的参数为File对象,第三个为一个文件路径,如果此文件路径表示的文件不存在,则会抛出文件不存在的异常。

    使用FileInputStream进行读取文件时主要用到的方法有:read()、read(byte[] b),

    read()   一次读取一个字节,返回值是此字节int类型数值

    read(byte[] b)  一次读取b.length个字节,返回值是读取的字节数

    使用方法如下,

    package cn.com.test;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class ReadFileByBytes {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
        
    		FileInputStream fis=null;
    		try {
    			 fis=new FileInputStream("e:\11.txt");
    			
    			//1、使用read()方法读取
    			int b;
    			while((b=fis.read())!=-1){//如果返回值为-1,则代表文件已经读完
    				//do something
    			}
    			//2、使用read(byte[] b)方式读取
    			int bs;//存储每次读取的字节数
    			byte[] bytes=new byte[1024];//定义一个1024个字节的数组,作为缓冲池
    			while((bs=fis.read(bytes))!=-1){//返回值为-1,代表文件读取完毕
    				//文件已经读取到了bytes数组中
    				String str=new String(bytes);//使用每次的字节数组生成字符串
    				
    			}
    			
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			if(fis!=null){
    				try {
    					fis.close();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    		
    	}
    
    }
    

    以上代码中分别使用两种方式对文件进行了读取,其返回值都是-1,-1代表的意思是读到了文件末尾,文件已经读取完毕,且最后需要关闭输入流。

    字节方式的写文件和读文件相似,方法为write(int b)、write(byte[] b),即一次写一个字节,一次写一个字节数组。

    二、字符流


    字符流,即每次是以字符为单位读/写文件,在字符流中有Reader和Writer,其中reader的介绍如下,

    reader也是一个抽象类,其子类主要有BufferedReader、FilterReader、InputStreamReader。在使用字节流的时候,使用了FileInputStream,在字符流中也有FileReader,只不过是作为InputStreamReader的子类,InputStreamReader和BufferedReader是两个很有意思的类,放在下次再说。

    其构造方法和FileInputStream是一样的,同样我们常用的是以下两个

    下面看具体的读取方式,既然在FileInputStream中是按照字节读取,那么在FileReader中即是按照字符读取,read()和read(char[] c),第一个方法读到的字符,以int类型返回,第二个方法返回读取到的字符数。

    package cn.com.test;
    
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class ReadFileByChars {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
        
    		FileReader fr=null;
    		try {
    			 fr=new FileReader("e:\11.txt");
    			
    			//1、使用read()方法读取
    			int b;
    			while((b=fr.read())!=-1){//如果返回值为-1,则代表文件已经读完
    				//do something
    			}
    			//2、使用read(char c)方式读取
    			int bs;//存储每次读取的字符数
    			char[] chars=new char[1024];//定义一个1024个字符的数组,作为缓冲池
    			while((bs=fr.read(chars))!=-1){//返回值为-1,代表文件读取完毕
    				//文件已经读取到了bytes数组中
    				String str=new String(chars);//使用每次的字符数组生成字符串
    				
    			}
    			
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			if(fr!=null){
    				try {
    					fr.close();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    		
    	}
    
    }
    

     上面使用了read和read(char[] c)两种方法读取文件

    使用字符的方式写文件是一样的,使用FileWriter类的writer(char c)和writer(char[] c)方法,分别写入一个字符和字符数据组。

    通过上面的说明我们发现,字节和字符两种方式操作文件的方式是大同小异的,使用的方法都是read和write方法,只是操作的单位不一样。把这两种方式放在一起更容易理解掌握,欢迎提出不同意见,谢谢!!!

  • 相关阅读:
    Go语言十六进制转十进制
    Go语言中底层数组和切片的关系以及数组扩容规则
    Golang超时机制--2秒内某个函数没被调用就认为超时
    约瑟夫环问题(猴子选大王)
    冒泡排序优化
    斐波那契数列
    Linux下使用acme.sh (Let's Encrypt) 配置https 免费证书
    git 本地分支指定对应的远程分支
    Git分支开发 -- 利用git pull命令将远程指定仓库的分支拉取到本地
    phpStorm 之 本地开发,Linux上跑项目(连接远端服务器开发)
  • 原文地址:https://www.cnblogs.com/teach/p/6916431.html
Copyright © 2011-2022 走看看