说明:参考代码部分的时候,请忽略异常处理语句。I/O中异常的有效处理办法请看【I/O异常处理】章节
/*
* File类:
* 描述一个文件或是文件夹,通过File的实例对象可读取文件或是文件夹的的属性数据
* 如果需要操作文件的内容,那么就需要使用IO流技术
*
* IO(Input / Output流技术:
* 作用:在不同的设备之间传输数据
* -- 硬盘数据读取到内存
* -- 键盘数据读取到内存中
* -- 将内存数据写到硬盘中
*
* 应用场景:
* -- 报表导入
* -- 上传图片
* -- 数据下载
*
* IO流分类:
* - 按照数据的流向划分(以内存为参照物):
* --- 输入流(从其他设备读数据进入内存):
*
* --- 输出流(将内存数据写入或是现实在其他设备上):
*
* - 按照处理的数据单位划分:
* --- 字节流:读取的数据都是文件中的二进制,不会做任何处理
*
* --- 字符流:读取的是二进制数据,但是会把二进制数据转换成能字面量的形式
*
* --| 输入字节流InputStream 所有输入字节流的基类,是一个抽象类
* -------|FileInputStrem 读取【文件数据】的输入字节流
*
* 读取文件数据的步骤:
* 1.定位目标文件;
* 2.构建数据的输入通道;
* 3.读取文件数据;
* read()从输入流【读取一个字节】并返回,如果没有数据可读,将阻塞;
* 为了提高读取效率,可以结合缓冲数组byte[] 来提升读取效率,缓冲数组的大小一般设置
* 为1024;
* 4。关闭输入通道;
* close();
*
* 说明:
* 1.文件资源一旦使用完毕,必须马上释放,否则该资源无法被别的程序锁操作。
* 2.
*/
package com.michael.iodetail;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo01 {
public static void main(String[] args){
readFileData(); //方式一
readFileDate2(); //方式二:
readFileData3(); //方式三
}
public static void readFileData3(){
//1.定位目标文件
File file = new File("c:\\a.txt");
//2.建立数据输入通道
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//3.使用缓冲数组循环读取文件内容
int length = 0;
byte[] buf = new byte[1024];
try {
while((length=fileInputStream.read(buf))!=-1){
String content = new String(buf,0,buf.length);
System.out.println(content);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//4.关闭文件输入通道
try {
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//读取方式二:使用缓冲数组读物文件你让,缺点:无法一次读取文件全部内容
public static void readFileDate2(){
//1.定位目标文件
File file = new File("c:\\a.txt");
//2.建立数据的输入通道
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//3.读物文件内容
byte[] buf = new byte[1024]; //定义缓冲数组大小
try {
int length = fileInputStream.read(buf);
System.out.println(length);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} //读取的数组已经存入字节数组buf中,每次只能读3个字节,返回值是本次读取的字节数
//使用字节数组构建字符串
String content = new String(buf,0,buf.length);
System.out.println(content);
//4.关闭文件读物通道
try {
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//读取方式一:使用read循环读取文件内容,缺点:每次只能读一个字节,效率较低
public static void readFileData(){
//1.定位目标文件
File file = new File("c:\\a.txt");
//2.构造数据输入通道
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//3.读取文件数据
//read()读取一个字节的数据并返回
int content = 0;
try {
while((content=fileInputStream.read())!=-1){ //循环读物文件数据
System.out.print((char)content);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}