现在我们需要读取记事本文件中的数据,经过分析需要找到一个输入流来读取文件内容,所以找到了InputStream(字节输入流),但是此类是抽象类,而且读文件的方法(read)是实例方法,
所以我们向下找子类来创建对象并调用方法,InputStream有很多的子类,其中最常用的是文件流FileInputStream了,主要用来操作文件的。
构造方法:
- FileInputStream(File file) 表示从file指向的文件中读取
- FileInputStream(String name) name表示文件的路径名(路径+文件名)
读取的方法:
- int read()
调用一次读到一个数据字节,返回的int值就是读到的数据
如果已到达文件末尾,则返回 -1
2.int read(byte[] b)
调用一次本方法表示可以读取多个数据
读到的内容保存传入的byte数组b中
返回的是本次调用方法读到的数据字节个数
思考? b数组是有长度,干嘛还要单独返回读到的个数呢?
3.int read(byte[] b, int off, int len)
和上面的第二个类似,可以指定从b数组什么位置开始装
使用循环读取整个文件内容:
int read = 0;//准备一个变量 : 将读取的每一个字节的数据,;零时存入到该变量
while( (read = fis.read()) != -1 ){//用read保存的结果:跟-1比较
System.out.println((char)read);//每次保存的结果,强转成字符
}
使用一次读取一个数组的方式:
int len;//读取的字节的个数
byte[] arr = new byte[1024];//五个字节的数据,缓存在该数组的
while( (len = fis.read(arr)) != -1 ){
System.out.println( new String(arr,0,len) );
}
读取中文产生乱码原因分析:
总结(字节输入流读取的流程以及注意事项)
- 搞清楚是需要读文件还是写文件 ---> 选择什么流
- 明确读哪个文件
- 创建一个输入流的对象(目的是为了调用其中的read方法)
- 调用读取方法获得数据
- 关闭流资源 通过流对象来调用close方法(流关闭之后是不能够在操作的-读取)
读取的文本内容:Ab中文 |
FileInputStream fis = new FileInputStream("cc.txt"); int len; byte[] arr = new byte[1];//一次只读取一个字节:但是中文字节数不止一个 while( (len = fis.read(arr)) != -1 ){ System.out.print( new String(arr,0,len) ); } fis.close(); |
ab???? |
注意事项:
中文乱码的问题 ,一个中文是两个数据字节, read() 一次读到的是一个数据字节,期待后面的字符流,定义临时读取的数组的长度问题,适当大小即可,最好不要想一次读完