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方法,只是操作的单位不一样。把这两种方式放在一起更容易理解掌握,欢迎提出不同意见,谢谢!!!

  • 相关阅读:
    15. DML, DDL, LOGON 触发器
    5. 跟踪标记 (Trace Flag) 834, 845 对内存页行为的影响
    4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志
    14. 类似正则表达式的字符处理问题
    01. SELECT显示和PRINT打印超长的字符
    3. 跟踪标记 (Trace Flag) 1204, 1222 抓取死锁信息
    2. 跟踪标记 (Trace Flag) 3604, 3605 输出DBCC命令结果
    1. 跟踪标记 (Trace Flag) 1117, 1118 文件增长及空间分配方式
    0. 跟踪标记 (Trace Flag) 简介
    SpringBoot + Redis + Shiro 实现权限管理(转)
  • 原文地址:https://www.cnblogs.com/teach/p/6916431.html
Copyright © 2011-2022 走看看