博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
文件输出流
阅读量:6691 次
发布时间:2019-06-25

本文共 5558 字,大约阅读时间需要 18 分钟。

实现读取文件有多种方式,针对不同的文件类型,有不同的读取方法。读取文件的关键技术点如下:

  1.用FileInputStream打开文件输入流,通过read方法以字节为单位读取文件,是最通用的读取文件的方法,能读取任何文件,特别适合读取二进制文件,如图片、声音、视频文件。

  2.用InputStreamReader打开文件输入流,通过read方法以字符为单位读取文件,常用于读取文本文件。

  3.用BufferedReader打开文件输入流,通过readLine方法以行为单位读取文件,常用于读取格式化文本。

  4.用RandomAccessFile打开文件输入流,通过seek方法将读指针移到文件内容中间,再通过read方法读取指针后的文件内容,常用于随机读取文件。

  通过以上各种文件输入流读取文件后,都需要调用close方法关闭文件输入流。

实例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

package book.io;

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.RandomAccessFile;

import java.io.Reader;

 

/**

 *多种方式读取文件

 *按字节读取文件内容、按字符读取文件内容、按行读取文件内容、随机读取文件内容

 */

public class ReadFromFile {

    //以字节为单位读取文件,常用于读取二进制文件,如图片、声音、视频等文件

    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 (Exception e) {

            e.printStackTrace();

            return;

        }

        try {

            System.out.println("以字节为单位读取文件内容,一次读多个字节:");

            //一次读多个字节

            byte[] tempbytes = new byte[100];

            int byteread = 0;

            in new FileInputStream(fileName);

            ReadFromFile.showAvailableBytes(in);

            //将多个字节读入到字节数组中,byteread为一次读入的字节数

            while((byteread = in.read(tempbytes)) != -1){

                System.out.write(tempbytes,0,byteread);

            }

        catch (Exception e) {

            e.printStackTrace();

        }finally{

            if(in != null){

                try {

                    in.close();

                catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

    }

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

    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){

                if(((char)tempchar)!='\r'){

                    System.out.println((char)tempchar);

                }

            }

        catch (Exception e) {

            e.printStackTrace();

        }

        try {

            System.out.println("以字符为单位读取文件内容,一次读多个字符:");

            char[] tempchars = new char[30];

            int charread = 0;

            reader = new InputStreamReader(new FileInputStream(fileName));

            //将多个字符读取到字符数组中,charread为一次读取的字符数

            while((charread = reader.read(tempchars)) != -1){

                if((charread == tempchars.length)&&(tempchars[tempchars.length-1] !='\r')){

                    System.out.println(tempchars);

                }else{

                    for(int i=0;i<charread;i++){

                        if(tempchars[i] == '\r'){

                            continue;

                        }else{

                            System.out.println(tempchars[i]);

                        }

                    }

                }

            }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

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

    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 (Exception e) {

            e.printStackTrace();

        }finally{

            if(reader != null){

                try {

                    reader.close();

                catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

    }

    //随机读取文件

    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个字节,则读剩下的字节

            while((byteread = randomFile.read(bytes)) != -1){

                System.out.write(bytes, 0, byteread);

            }

        catch (Exception e) {

            e.printStackTrace();

        }finally{

            if(randomFile != null){

                try {

                    randomFile.close();

                catch (IOException e) {

                    e.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 = "C:/Users/Admin/Desktop/CAI/20160718/newTemp.txt";

        ReadFromFile.readFileByBytes(fileName);

        ReadFromFile.readFileByChars(fileName);

        ReadFromFile.readFileByLines(fileName);

        ReadFromFile.readFileByRandomAccess(fileName);

         

    }

}

 

  分析:readFileByBytes以字节为单位读取文件内容。使用了文件输入流类FileInputStream,调用read方法可以一次从文件输入流中读取一个字节,也可以将多个字节读取到字节数组中,当读取到字节数为-1时,到达文件尾,读取文件结束。

  readFileByChars以字符为单位读取文件内容。使用了InputStreamReader类,将FileInputStream字节输入流包装成字符流,然后调用InputStreamReader的read方法可以一次从文件输入流中读取一个字符,也可以将多个字符读取到字符数组中,但读取的字符数为-1时,到达文件尾,读取文件结束。

  readFileByLines以行为单位读取文件内容。通过File对象构造FileReader对象,再通过FileReader对象构造BufferedReader对象,它的readLine方法可以一次从文件中读取一行内容并保存到字符串中,如果返回的字符串为null,则到达文件尾,读取文件结束。

  上面3种方法都是从头到尾读取文件内容。readFileByRandomAccess方法则可以随机读取文件内容,使用RandomAccessFile类构造RandomAccessFile对象时,可以指定访问模式,有“只读”、“只写”和“读写”模式。通过seek方法移动读指针的起始位置,再通过read方法读取指针后面的内容。

转载于:https://my.oschina.net/wf1994/blog/715333

你可能感兴趣的文章
使用Micrisoft.net设计方案 第三章Web表示模式 Web模式集群详细介绍 Page Cache(页面缓存)...
查看>>
能否将带有中文的apk包install到android虚拟机中?
查看>>
【原创】利用MySQL触发器高性能造数据
查看>>
aaa认证
查看>>
韩寒的经典格言有哪些?
查看>>
Mongodb笔记,半截的
查看>>
我的友情链接
查看>>
Bash内置变量
查看>>
json模块
查看>>
layer 弹出层 不居中
查看>>
通过创建一个简单的骰子游戏来探究 Python
查看>>
MySQL 各种主流 SQLServer 迁移到 MySQL 工具对比
查看>>
Linux的Samba共享
查看>>
C#开发COM组件
查看>>
一个自定义线程池的小Demo
查看>>
Ubuntu 14.04 server ssh 远程服务遇到的一点事儿
查看>>
JavaScript获得字符个数【原创】
查看>>
Help Presto go open-source,帮助Opera 的Presto引擎开源。。。。希望大家支持一下。
查看>>
jqgride实现多选
查看>>
MySQL修改最大连接数,没有my.ini文件,只有my-default,这怎么改呀?
查看>>