Java 文件流一:字节流(FileInputStream 和 FileOutputStream)
Java文件流操作是一个非常重要的内容。下图列举了关于Java基本的文件流操作,当然目前还有NIO,这个后来会进行讨论,先看基本的文件流操作。我们主要使用的是访问文件的流和缓冲流。
文件的流操作一般包含字符流和字节流,两者区别在于,字符流每次传播16bit数据,字节流一次读取8bit数据。这里先对Java中字节流的使用展开讨论。
必须明确一个概念,流操作包含了输入输出流,其中,输出流指的是文件流输出,也就是将文件流输出到磁盘或者数据库;输入流是从磁盘或者数据库中读取流数据,并打印出来。下面以代码来给大家做个展示。
1 FileInputStream 文件读入
//使用byte[]数组进行读取文件
public void testInput() {
File file=new File("D:\\test.txt");//此处读取的为txt文本,也可以是图片或者其他,但是打印结果会比较尴尬,具体可以试试
FileInputStream fis=null;
try {
fis=new FileInputStream(file);
byte[] b=new byte[5];//读取数据到数组,这里根据读取的问件定大小,图片或者视频可以采用1024以及其倍数
int len;//每次读入byte的字节长度,到末尾为-1
while((len=fis.read(b))!=-1) {
/*这里的i的阈值一定为len 因为len不是固定的 在读到文件末尾时 len
与每次固定读入长度(这里是 5)不一样
*/
for(int i=0;i<len;i++) {
System.out.println((char)b[i]);
}
/*或者这样打印
String str=new String(b,0,len);
System.out.println(str);*/
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(fis!=null)
try {
fis.close();//关文件操作 必须要有!!!
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2 文件输出 FileOutputStream
//文件流输出
public void testOutput() {
//输出目标(其目标可以不存在 可以在程序执行中自行创建,若存在会自动覆盖文件)
File file=new File("D:test1.txt");
//创建一个FileOutputStream对象 将file作为参数传入
FileOutputStream fos=null;
try {
fos=new FileOutputStream(file);
//向文件中写东西(覆盖写法)
fos.write(new String("I love China").getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(fos!=null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3 有了输入和输出的样例,其实我们就可以将文件的输入输出封装为一个工具类,具体操作如下:
//其中 src dst分别为文件的 源地址和目标地址
public void copyFile(String src,String dst) {
//1 提供读入 输出文件(字节流)(可以为txt 或者 图片 视频等)
File file1=new File(src);
File file2=new File(dst);
//提供流对象
FileInputStream fis=null;
FileOutputStream fos=null;
try {
fis=new FileInputStream(file1);
fos=new FileOutputStream(file2);
// 实现文件复制
byte[] b=new byte[10];//读取字节长度,根据所传文件大小来定,图片视频一般为1024及其倍数
int len;//每次读入的长度
while((len=fis.read(b))!=-1) {
//写入文件
fos.write(b, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//先关输出
if(fos!=null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//再关输入
if(fis!=null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
方法调用:
public static void main(String[] args) {
String src="D:\\test.txt";//源地址
String dst="D:\\test1.txt";//目标地址
copyFile(src,dst);//进行copy(注意这个方法在这个类里面要是静态,因为直接被main 方法调用了)
}
就可以看到 D盘里有一个test1.txt.
【注意】这里根据字节流进行操作,读取中文时,是读不出来的,因为汉语为字符。后来会对其进行讨论。