您的位置:首页 > 编程语言 > Java开发

Java IO流->节点流->字节流:FileInputStream与FileOutputStream

2015-08-25 10:31 519 查看
示例代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

/**
* 1.流的分类:
* 按照数据流向的不同:输入流	输出流
* 按照处理数据的单位不同:字节流 (不能处理中文,一个中文由两个字节组成)	字符流(处理文本文件)
* 按照角色的不同:节点流(直接作用于文件)	处理流
* 2.IO体系:
* 抽象基类			节点流
* InputStream		FileInputStream
* OutputStream		FileOutputStream
* Reader			FileReader
* Writer			FileWriter
*
*/
public class TestFileIOStream {
/**
* FileInputStream类
* 说明:1.test1()和test2()是一个字节一个字节的读取文件内容,test3()是一次性多个字节读入
* 		2.test2()比test1()更加合理
*/
//从硬盘存在的一个文件中,读取其内容到程序中。使用FileInputStream
//读取的文件一定要存在,否则抛FileNotFoundException
@Test
public void test1() throws FileNotFoundException , IOException {//直接抛异常的方式较不合理
//1.创建一个File类的对象
File file = new File("hello.txt");
//2.创建一个FileInputStream类的对象
FileInputStream fis = new FileInputStream(file);
//3.调用FileInputStream的方法,实现file文件的读取
/*
* read():读取文件的下一个字节,当执行到文件结尾时,返回-1
*/
//方法一:
/*int b = fis.read();
while(b != -1) {
System.out.print((char)b);
b = fis.read();
}*/
//方法二:
int b;
while((b = fis.read()) != -1) {
System.out.print((char) b);
}
/*
* hello.txt文本内容:hello everybody.中国
* 输出结果:hello everybody.???ú
* 分析:字节流不能处理中文,一个中文由两个字节组成,字节流将中文拆成两半
*/
//4.关闭相应的流
if(fis != null) {
fis.close();
}
}

@Test
public void test2() {//使用try-catch方式处理如下异常更合理,不管有没有出异常都要关流,所以用finally最合适
//2.创建一个FileInputStream类的对象
FileInputStream fis = null;
try {//选中要try-catch的内容,然后:右击鼠标->Surround With->Try/Catch Block
//1.创建一个File类的对象
File file = new File("hello.txt");
fis = new FileInputStream(file);
//3.调用FileInputStream的方法,实现file文件的读取
/*
* read():读取文件的下一个字节,当执行到文件结尾时,返回-1
*/
//方法二:
int b;
while((b = fis.read()) != -1) {
System.out.print((char) b);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭相应的流
if(fis != null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

@Test
public void test3() {
FileInputStream fis = null;
try {
File file = new File("hello.txt");
fis = new FileInputStream(file);
byte[] b = new byte[5];//读取到的数据要写入的数组
int len;//每次读入到byte[]中字节的个数
while((len = fis.read(b)) != -1) {
//方法一:
/*for (int i = 0; i < len; i++) {
System.out.print((char) b[i]);
}*/
//方法二:
String str = new String(b, 0, len);//如果中文没有刚好被拆开就可以显示,如果被拆了就会乱码
System.out.println("$:"+str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

/**
* FileOutputStream类
*/
@Test
public void test4() {
//1.创建File对象
//输出的物理文件可以不存在,当执行过程中,若不存在,会自动创建,若存在,会覆盖。
File file = new File("test4_hello.txt");
//2.创建FileOutputStream对象
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
//3.写入操作
fos.write(new String("I love you forever.").getBytes());//String类型->byte[]类型
} catch(Exception e) {
e.printStackTrace();
} finally {
//4.关闭输出流
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

/**
* 从硬盘读取一个文件,并写入另一位置。(相当于文件的复制)
*/
@Test
public void test5() {
//1.提供读出、写入的文件
File file1 = new File("hello.txt");//可以是其他格式的(.jpg)等等
File file2 = new File("world.txt");
//2.提供相应的流
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
//3.实现文件的复制
byte[] b = new byte[20];
int len;
while((len = fis.read(b)) != -1) {
//fos.write(b);//错误的写法,相当于错误写法:fos.write(b,0,b.length)
fos.write(b, 0, len);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

@Test
public void test6() {
String src = "hello.txt";
String dest = "new2.txt";
copyFile(src, dest);
}

public static void copyFile(String src , String dest) {
//1.提供读出、写入的文件
File file1 = new File(src);//可以是其他格式的(.jpg)等等
File file2 = new File(dest);
//2.提供相应的流
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
//3.实现文件的复制
byte[] b = new byte[20];//当遇到大文件时,应该适当提高byte[]的长度
int len;
while((len = fis.read(b)) != -1) {
//fos.write(b);//错误的写法,相当于错误写法:fos.write(b,0,b.length)
fos.write(b, 0, len);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: