八、读文件 在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