package com.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.junit.Test;
/**
*
* @author Administrator
*1、流的分类
*(1)按照数据流向的不同,分为输入流和输出流
*(2)按照处理数据单位的不同,分为字节流和字符流
*(3)按照角色的不同,分为节点流(直接作用于文件,所有带File的InputStream OutputStream)、处理流(作用于节点流上面,提高效率)
*2、IO体系
*抽象基类 节点流(即文件流) 缓总流(处理流的一种)
*InputStream FileInputStream BufferedInputStream
*OutputStream FileOutputStream BufferedOutputStream
*Reader FileReader BufferedReader
*Writer FileWriter BufferedWriter
*3、所有的处理流都作用于上面四种节点流,才能进行对文件操作
*/
public class FileInputOurPutStreamTest {
/**
* 每次读一个字节
*/
@Test
public void fileInputStreamTest1(){
FileInputStream fis = null;
//1、先创建file对象
try { //有异常在这里捕获,因为fis使用完后一定要关闭
File file1 = new File("hello1.txt");
//2、创建FileInputStream对象
fis = new FileInputStream(file1);
/**
int b = fis.read();//read方法,一次读取一个字节,读到文件最后返回-1
while(b != -1){
// System.out.println(b);//因为读取的是字节,这里用int接收,所以打印出来是unicode码,要显示字母,加char强制转化
System.out.println((char)b);
b = fis.read();
}**/
//上面代码可以简写成
int b ;
while( (b = fis.read()) != -1 ){
System.out.print((char)b);
}
} catch ( IOException e) {
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 每次读一个数组长度的字节
*/
@Test
public void fileInputStreamTest2(){
File file = new File("hello1.txt");
FileInputStream fis = null;
try{
fis = new FileInputStream(file);
byte[] b = new byte[5];
int len;//len是每次读出放到数组中的字节数,当到文件末尾的时候返回-1,前几个len都返回的是数组的长度,最后一个返回的len<=数组长度
StringBuffer strTmp = new StringBuffer("");
while( (len = fis.read(b)) != -1 ){
System.out.println(len);
String str = new String(b, 0, len);//这里要注意new String的三个参数,第一个是数组,第二个是从数组的第几个下标开始读,最后一个,是最后一个数组的长度
System.out.println(str);
strTmp.append(str);
}
System.out.println("strTmp-===" + strTmp);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void fileOutPutStreamTest(){
File file = new File("hello_out.txt");
FileOutputStream fos = null;
try{
fos = new FileOutputStream(file);
byte[] strTmp = new String("I love china").getBytes();
fos.write(strTmp);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 从一个文件读取内容,写入到另外一个文件
* 即文件的复制
*/
@Test
public void fileInputOutputStreamTest(){
FileInputStream fis = null;
FileOutputStream fos = null;
File fileIn = new File("hello1.txt");
File fileout = new File("hello2.txt");
try{
fis = new FileInputStream(fileIn);
fos = new FileOutputStream(fileout);
int len;
byte [] b = new byte[20];//根据文件大小来设定数组的大小
while((len = fis.read(b)) != -1){
fos.write(b, 0, len);//0是从字节数组b的的第0位开始
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}