java IO 输入输出(八)

八、读文件
    在java程序中读取文件,能够读文本文件(如.txt文件)、二进制文件(如.jpg文件),采用了多种读文件的方式。按字节读取、按字符读取、按行读取和随机读取。
   
    读文件的关键技术点如下:
    1、用FileInputStream打开文件输入流,通过read方法以字节为单位读取文件,是最通用的读文件的方法,能读取任何文件,特别适合读二进制文件,如图片、声音、视频文件。
    2、用InputStreamReader打开文件输入流,通过read方法以字符为单位读取文件,常用于读取文本文件
    3、用BufferedReader打开文件输入流,通过readLine方法以行为单位读取文件,重用于读格式化的文本。
    4、用RandomAccessFile打开文件输入流,通过seek方法将读指针移到文件内容中间,再通过read方法读取指针后文件内容,常用于随机的读取文件。
   
    注意:文件读取结束后,关闭流。
   
实例演示

 

package  book.io;

import  java.io.BufferedReader;
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.FileReader;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.InputStreamReader;
import  java.io.RandomAccessFile;
import  java.io.Reader;

/**
 * 多种方式读取文件内容
 * 按字节读取文件内容、按字符读取文件内容、按行读取文件内容、随机读取文件内容
 * 
@author joe
 *
 
*/


public   class  ReadFromFile  {
    
/**
     * 以字节为单位读取文件。常用于读取二进制文件。如图片,声音,影像等文件
     * 
@param fileName    文件名
     
*/

    
public static void readFileByBytes(String fileName) {
        File file 
= new File(fileName);
        InputStream in 
= null;
        
try {
            System.out.println(
"以字节为单位读取文件内容,一次读一个字节:");
            
//一次读一个字节
            in = new FileInputStream(file);
            
int tempbyte;
            
//不断的读取,直到文件结束
            while((tempbyte = in.read()) != -1{
                System.out.write(tempbyte);
            }

            in.close();
        }
 catch(IOException e) {
            e.printStackTrace();
            
return;
        }

        System.out.println();
        
try {
            System.out.println(
"以字节为单位读取文件内容,一次读多个字节:");
            
//一次读多个字节
            byte[] tempbytes = new byte[100];
            
int byteread = 0;
            in 
= new FileInputStream(file);
            ReadFromFile.showAvailableBytes(in);
            
//读如多个字节到字节数组中,byteread为一次读入的字节数
            while ((byteread = in.read(tempbytes)) != -1{
                System.out.write(tempbytes, 
0, byteread);
            }

        }
 catch (Exception el) {
            el.printStackTrace();
        }
 finally {
            
if (in != null{
                
try{
                    in.close();
                }
 catch(IOException el) {
                    el.printStackTrace();
                }

            }

        }

    }

    
    
/**
     * 以字符为单位读取文件,常用于读文本、数字等类型的文件
     * 
@param fileName    文件名
     
*/

    
public static void readFileByChars(String fileName) {
        File file 
= new File(fileName);
        Reader reader 
= null;
        
try {
            System.out.println(
"以字符为单位读取文件内容,一次读一个字符:");
            
//一次读一个字符
            reader = new InputStreamReader(new FileInputStream(file));
            
int tempchar;
            
while ((tempchar = reader.read()) != -1{
                
//在windows下,这两个字符在一起时,表示一个换行
                
//但如果这两个字符分开显示时,会换两次行
                
//因此,屏蔽掉 ,或者;否则,将会多出很多空行
                if (((char)tempchar) != ' '{
                    System.out.print((
char)tempchar);
                }

            }

            reader.close();
        }
 catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println();
        
try{
            System.out.println(
"以字符为单位读取文件内容,一次读多个字符");
            
//一次读多个字符
            char[] tempchars = new char[30];
            
int charread = 0;
            reader 
= new InputStreamReader(new FileInputStream(file));
            
//读入多个字符到字符数组中,charread为一次读取字符数
            while((charread = reader.read(tempchars)) != -1{
                
//用样屏蔽掉不显示
                if ((charread == tempchars.length) && (tempchars[tempchars.length -1!= ' ')) {
                    System.out.print(tempchars);
                }
 else {
                    
for (int i = 0; i < charread; i++{
                        
if(tempchars[i] == ' '{
                            
continue;
                        }
 else {
                            System.out.print(tempchars[i]);
                        }

                    }

                }

            }

        }
 catch (Exception el) {
            el.printStackTrace();
        }
 finally {
            
if(reader != null{
                
try{
                    reader.close();
                }
 catch (IOException e1) {
                    e1.printStackTrace();
                }

            }

        }

    }

    
    
/**
     * 以行为单位读取文件,常用于读取面向行的格式化文件
     * 
@param fileName    文件名
     
*/

    
public static void readFileByLines(String fileName) {
        File file 
= new File(fileName);
        BufferedReader reader 
= null;
        
try {
            System.out.println(
"以行为单位读取文件内容,一次读取一整行:");
            reader 
= new BufferedReader(new FileReader(file));
            String tempString 
= null;
            
int line = 1;
            
//一次读入一行,知道读入null为文件结束
            while((tempString = reader.readLine()) != null{
                
//显示行号
                System.out.println("line:" + line + "" + tempString);
                line
++;
            }

            reader.close();
        }
 catch (IOException e) {
            e.printStackTrace();
        }
 finally {
            
if (reader != null{
                
try {
                    reader.close();
                }
 catch(IOException e1) {
                    e1.printStackTrace();
                }

            }

        }

    }

    
    
/**
     * 随机读取文件内容
     * 
@param fileName    文件名
     
*/

    
public static void readFileByRandomAccess(String fileName) {
        RandomAccessFile randomFile 
= null;
        
try {
            System.out.println(
"随机读取一段文件内容:");
            
//打开一个随机访问文件流,按只读方式
            randomFile = new RandomAccessFile(fileName, "r");
            
long fileLength = randomFile.length();    //文件长度,字节数
            int beginIndex = (fileLength > 4? 4 : 0;    //读取文件的起始位置
            
//将读文件的开始位置移到beginIndex位置
            randomFile.seek(beginIndex);
            
byte[] bytes = new byte[10];
            
int byteread = 0;
            
//一次读10个字节,如果文件内容不足10个字节,则读剩下的字节
            
//将一次读取的字节数赋给byteread
            while((byteread = randomFile.read(bytes)) != -1{
                System.out.write(bytes, 
0, byteread);
            }

        }
 catch (IOException e) {
            e.printStackTrace();
        }
 finally {
            
if (randomFile != null{
                
try {
                    randomFile.close();
                }
 catch (IOException e1) {
                    e1.printStackTrace();
                }

            }

        }

    }

    
    
/**
     * 显示输入流中还剩的字节数
     
*/

    
private static void showAvailableBytes(InputStream in) {
        
try {
            System.out.println(
"当前字节输入流中的字节数为:" + in.available());
        }
 catch (IOException e) {
            e.printStackTrace();
        }

    }

    
    
public static void main(String[] args) {
        String fileName 
= "d:/work/temp/tempfile.txt";
        ReadFromFile.readFileByBytes(fileName);
        System.out.println();
        ReadFromFile.readFileByChars(fileName);
        System.out.println();
        ReadFromFile.readFileByLines(fileName);
        System.out.println();
        ReadFromFile.readFileByRandomAccess(fileName);
    }

}

 输出结果:
以字节为单位读取文件内容,一次读一个字节:
Java,我喜欢!
I love java!
20071203
以字节为单位读取文件内容,一次读多个字节:
当前字节输入流中的字节数为:37
Java,我喜欢!
I love java!
20071203
以字符为单位读取文件内容,一次读一个字符:
Java,我喜欢!
I love java!
20071203
以字符为单位读取文件内容,一次读多个字符
Java,我喜欢!
I love java!
20071203
以行为单位读取文件内容,一次读取一整行:
line:1: Java,我喜欢!
line:2: I love java!
line:3: 20071203

随机读取一段文件内容:
,我喜欢!
I love java!
20071203

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值