1.基础概念
在 Java 中 java.io 包含的每一个类几乎都要进行输入和输出操作。所有的这些流代表一个输入源和输出目的地。在 java.io 包中支持许多数据,如原语,对象,本地化字符等等。
流可以被定义为一个序列的数据。输入流用来从一个源中读数据,输出流用来向一个目的地写数据。
字节流:
Java 字节流是用来处理8比特字节的输入和输出。常用的是 FileInputStream 类和 FileOutputStream 类。
字符流:
Java 字符流用于处理16位 unicode 的输入和输出。最常用的类是, FileReader 和 FileWriter。虽然在内部 FileReader 还是使用 FileInputStream 和 FileWriter 使用 FileOutputStream,但是主要的区别是 FileReader 和 FileWriter 一次读写两个字节。2.FileOutputStream
//建立字符输出的对象,同是指向了输出出数据的位置
FileOutputStream f=new FileOutputStream("a.txt");
//向输出的文件输入数据
f.write("hello".getBytes());
f.write("java".getBytes());
f.write("world".getBytes());
//输出结果是:hellojavaworld
//要实现换行输出方式:windows:换行符是\r\t Linx:\n mac:\r
f.write("\r\t".getBytes());
f.write("one".getBytes());
f.write("\r\t".getBytes());
f.write("tow".getBytes());
//通过\r\t来实现换行
//
f.close();
3.FileInputStream
//创建输入对象
FileOutputStream f=new FileOutputStream("b.txt");
//写入数据
f.write("j".getBytes());;
f.write("\r\t".getBytes());
for(int x=0;x<=10;x++) {
f.write(("java"+x).getBytes());
f.write(("\r\t").getBytes());
}
//建立输出对象
FileInputStream f1=new FileInputStream("b.txt");
int read = f1.read();
//读出来的是该字符对应得AscaII表
System.out.println(read);
//输出为106,对应得是j
System.out.println((char)read);
//只输出一个字节,提高效率只能用循环
//for循环
//用read1接收符f1读出来的数据并存储
int read1=f1.read();
//当读出来的为-1是则说明没有数据可以读,则结束
while(read1!=-1) {
//输出read1,但是因为是int类型,所以通过强制类型转化来转为字节类型
System.out.print((char)read1);
//再用read1接收下一个数据并存储,用来循环
read1=f1.read();
}
//for循环最终版
System.out.println("--------------");
int read3=0
;
while((read3=f1.read())!=-1) {
System.out.print((char)read3);
}
f.close();
4.问题: 现在的read方法只能一个字节一个字节的读,效率慢,改进方法
//int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
public class file3 {
public static void main(String[] args) throws IOException {
FileInputStream in=new FileInputStream("b.txt");
//解决read()方法一次只能读一个字符的问题
//建立byte[]数组,该数组的作用就是传入fead()中,来改变每次只读一个字符的情况
//而数组是多长,那么每次读多少个数组,减少读取太多的重复性,节约时间
byte[] by=new byte[1024];
//建立int类型的r进行判断是否读出数据(-1则表示没有数据)
//同是将存储read()方法读取出来的数据
int r=0;
//循环流程:
//1.in.read()读取字符
//2.read()中传入了by字符数组,(地层走的是by.length来获取该数组的长度,然后一次读取by.length个字符,并将
//值存入by中
//3.read每次读出来的是int类型,传给r,通过判断r是否等于-1,可知是否数据为空
//4.ture结束,false进入循环体输出
while((r=in.read(by))!=-1) {
// while((r=in.read(new byte[1024]))!=-1){
//while循环false的时候带出的是1024个by字节,遍历by字节即可
//(如果需要输出的小于1024,但是却依然去遍历1024个字节的话,没有值得位置会用 □ 补齐
//所以遍历时只需要遍历到有数据该位的长度
//遍历by字节的方法
for(int x=0;x<r;x++) {
System.out.print((char)by[x]);
}
//简单法(用new String的构造方法遍历)
System.out.println(new String(by,0,r));
}