要利用I/O流读取文件内容,首先要掌握InputStream的体系结构。
这个体系中FileInputStream和BufferedInputStream是一定要掌握的,因为使用的频率比较高。
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* I/O流的概念:数据流向某个对象的数据序列,并且到达这个对象的过程。
* 输入流:数据源数据流向计算机内存的过程
* 输出流:把数据从程序流向目标数据源的过程
* @author Administrator
*
*/
public class Ch01 {
/**
* 读取文件内容
* @param args
*/
public static void main(String[] args) {
//InputStream:是一个抽象类
// \:是一个 转移符
//表示磁盘路径的两种表示方式:1、\\ 2、/
try {
//从文件地址中读取内容到程序中
//1、建立连接
InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
//2、开始读取信息
/*
//方法1:一次只读一个
System.out.println(is.read());//读取的是字节型的:49
System.out.println((byte)is.read());//50
*/
//方法2:定义数组,循环读取
//先定义一个字节数组存放数据
byte[] b = new byte[5];//把所有的数据读取到这个字节当中
//声明一个int存储每次读取到的数据
int i = 0;
//定义一个记录索引的变量
int index = 0;
//循环读取每个数据
while((i=is.read())!=-1){//把读取的数据放到i中
b[index]=(byte) i;
index++;
}
//把字节数组转成字符串
System.out.println(new String(b));
//关闭流
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
//系统强制解决的问题:文件没有找到
e.printStackTrace();
} catch (IOException e) {
//文件读写异常
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
/**
* I/O流的概念:数据流向某个对象的数据序列,并且到达这个对象的过程。
* 输入流:数据源数据流向计算机内存的过程
* 输出流:把数据从程序流向目标数据源的过程
* @author Administrator
*
*/
public class Ch02 {
/**
* 读取文件内容
* @param args
*/
public static void main(String[] args) {
//InputStream:是一个抽象类
// \:是一个 转移符
//表示磁盘路径的两种表示方式:1、\\ 2、/
try {
//从文件地址中读取内容到程序中
//1、建立连接
InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
//2、开始读取信息
//先定义一个字节数组存放数据
byte[] b = new byte[5];//把所有的数据读取到这个字节当中
//完整的读取一个文件
is.read(b);
//read:返回的是读取的文件大小
//最大不超过b.length,返回实际读取的字节个数
System.out.println(Arrays.toString(b));//读取的是字节数组
//把字节数组转成字符串
System.out.println(new String(b));
//关闭流
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
//系统强制解决的问题:文件没有找到
e.printStackTrace();
} catch (IOException e) {
//文件读写异常
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
/**
* I/O流的概念:数据流向某个对象的数据序列,并且到达这个对象的过程。
* 输入流:数据源数据流向计算机内存的过程
* 输出流:把数据从程序流向目标数据源的过程
* @author Administrator
*
*/
public class Ch03 {
/**
* 读取文件内容
* @param args
*/
public static void main(String[] args) {
//InputStream:是一个抽象类
// \:是一个 转移符
//表示磁盘路径的两种表示方式:1、\\ 2、/
try {
//从文件地址中读取内容到程序中
//1、建立连接
InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
//2、开始读取信息
//先定义一个字节数组存放数据
byte[] b = new byte[is.available()];//把所有的数据读取到这个字节当中
//is.available():返回文件的大小
// while(is.available()==0);//不等于0时才停止循环
//完整的读取一个文件
int off = 0;
int le = 2;
while(is.read(b, off, 2)!=-1){
off+=1;
}
is.read(b,off,2);
//read:返回的是读取的文件大小
//最大不超过b.length,返回实际读取的字节个数
System.out.println(Arrays.toString(b));//读取的是字节数组
//把字节数组转成字符串
System.out.println(new String(b));
//关闭流
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
//系统强制解决的问题:文件没有找到
e.printStackTrace();
} catch (IOException e) {
//文件读写异常
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.jredu.oopch11;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
public class Ch04 {
/**
* 读取中文字符的文件
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
/*FileInputStream fis = new FileInputStream("E:/iodemo/ch04.txt");
//包装流
BufferedInputStream bis = new BufferedInputStream(fis);*/
//包装流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:/iodemo/ch04.txt"));
//读取文件内容
byte[] b = new byte[bis.available()];
bis.read(b);
/*char[] c = new char[b.length];
for (int i = 0; i < c.length; i++) {
c[i]=(char) b[i];
}
System.out.println(Arrays.toString(c));//乱码
*/
System.out.println(Arrays.toString(b));//得到的是字节
//String(byte[])把字节数组转成字符串
System.out.println(new String(b));//可以得到中文
bis.close();//关闭流(关闭bis就可以了)
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Ch05 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//读取文件
FileInputStream fis = new FileInputStream("E:/iodemo/ch01.txt");
//fis.available():文件的长度
byte[] b=new byte[fis.available()];
//skip:跳过n个字节后再开始读取
fis.skip(5);//跳过前5个
fis.read(b);
System.out.println(new String(b));
fis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.jredu.oopch11;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Ch06 {
/**
* 读取过程暂停,给当前做一个标记,下一次从标记位置开始读取
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//读取过程中暂停
//给当前做一个标记
//下一次从标记位置开始读取
try {
BufferedInputStream bis= new BufferedInputStream(new FileInputStream("E:/iodemo/ch06.txt"));
byte[] b = new byte[bis.available()];
// bis.read(b, 0, b.length/2);
//设置断点
bis.mark(bis.read(b, 0, b.length/2));//位置就是读取的长度
System.out.println(new String(b));
System.out.println("暂停读取....");
Thread.sleep(2000);//休眠2s
//休眠后继续读
System.out.println("继续读取...");
//reset:将当前复位的位置设置成上次调用mark标记的位置
bis.reset();
bis.read(b);
System.out.println(new String(b));
bis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.SequenceInputStream;
/**
* 序列流(集合流)
* 把n个流合并在一起读取
* @author Administrator
*
*/
public class Ch07 {
public static void main(String[] args) {
try {
//第一个文件流
FileInputStream fis1=new FileInputStream("E:/iodemo/ch01.txt");
//第二个文件流
FileInputStream fis2=new FileInputStream("E:/iodemo/ch04.txt");
//合并到序列流中
SequenceInputStream sis=new SequenceInputStream(fis1, fis2);
//方式1
// //临时存放数据的数组
// int len =fis1.available()+fis2.available();
// byte[] b=new byte[2*len+1];
// //把每一次读取到的临时数据存放如sb中
//// StringBuffer sb=new StringBuffer();
// //一次性读取所有的内容
// int off=0;
// int i=0;
// while((i=sis.read(b,off,len))!=-1) {
//// sb.append();
// off+=i;
// }
// System.out.println(new String(b));
//方式2
byte[] b=new byte[fis1.available()];
// StringBuffer sb=new StringBuffer();
// int i=0;
while(sis.read(b)!=-1) {
System.out.println(new String(b));
// sb.append(new String(b));
}
// System.out.println(sb.toString());
sis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Vector;
public class Ch08 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//三个文件流
FileInputStream fis1 = new FileInputStream("E:/iodemo/a.txt");
FileInputStream fis2 = new FileInputStream("E:/iodemo/b.txt");
FileInputStream fis3 = new FileInputStream("E:/iodemo/c.txt");
//把三个流添加到集合中
Vector vector = new Vector<>();
vector.add(fis1);
vector.add(fis2);
vector.add(fis3);
// vector.elements(); //方法返回的是Enumeration
//合并到一个序列流中
SequenceInputStream sis = new SequenceInputStream(vector.elements());
byte[] b = new byte[fis1.available()+fis2.available()+fis3.available()];
//读取
int off=0;
//vector.get(i).available():一个文件的长度
for (int i = 0; i < vector.size(); i++) {
//off:数组当中存放数据的起始下标的位置
off+=sis.read(b, off, vector.get(i).available());//每次读取一个文件的长度
}
System.out.println(new String(b));
sis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}