IO流的分类
1.从磁盘读取数据到内存(Java代码) 磁盘=》代码中 输入流
2.从内存(Java代码 String str = "狗蛋很帅")写入数据到磁盘某一个文件 代码=》磁盘 输出流
参照物:是内存,就是Java代码。
输入流: 从磁盘读取到内存
输出流:从内存写入到磁盘
I:
input: 输入 从磁盘读取数据到内存
使用input输入流的应用场景是啥:比如 磁盘上面有一个1.txt文件,将1.txt文件的内容读取到Java内存中。使用的是输入流。
输入流分为两种:
1.字节输入流 FileInputStream
2.字符输入流
输出流分为两种:
1.字节输出流 FileOutputStream
2.字符输出流
字节输入流
public static void main(String[] args) throws IOException {
//将磁盘上面的c:/aaa/1.txt文件这个数据读取到内存(Java)中
//加上缓冲的效果,这种很牛逼啊,将磁盘上面的东西弄到咱们Java代码中
//1.创建File对象,是咱们本地磁盘文件的一个File对象
//为啥要创建这个File对象?因为要读取1.txt这个文件的里面的
//内容,首先先找到文件再说啊。
File file = new File("c:/aaa/1.txt");
//2.创建文件字节输入流对象,来操作1.txt
//FileInputStream(File file)
//通过打开与实际文件的连接创建一个 FileInputStream ,
// 该文件由文件系统中的 File对象 file命名。
//将c:/aaa/1.txt文件转为字节输入流的形式,之后可以按照流的形式读取到内存中
FileInputStream fis = new FileInputStream(file);
//3.fileInputStream 这个流不具备缓冲的效果。
//但是加上缓冲的效果!!! 咋办?使用另外一个流
//BufferedInputStream
//A BufferedInputStream为另一个输入流添加了功能,即缓冲输入
//咋加?将FileInputStream传给BufferedInputStream 此时
//FileInputStream 就具备缓冲的功能了!!!
BufferedInputStream bis = new BufferedInputStream(fis);
//使用字节缓冲流操作咱们的1.txt
//当创建BufferedInputStream时,
// 将创建一个内部缓冲区数组,这个数组是什么数据类型的?
//5.创建一个缓冲区的数组 byte 为啥是byte类型的数组
//因为是字节输入流 所以是byte byte 就是字节
//当缓冲数组是2个字节的时候,每次读取的时候存到缓冲数组中,只存2个字节
//发现数据一次性读取不完?咋办?咋解决?
byte[] buf = new byte[1024 * 4];//缓冲区4096字节
//现在数组是空的
//6.读取数据
//public int read(byte[] b)
// throws IOException
//从输入流读取一些字节数,并将它们存储到缓冲区b 。
// 实际读取的字节数作为整数返回
//将1.txt文件的内容 读取到缓冲数组中 buf 里面
//之前buf是一个空的数组,现在通过read方法将1.txt文件中的
//内容读取到了 buf空的数组中
// int read = bis.read(buf);
// System.out.println(read);
//6.调用read方法之后,buf 数组就有值了 能不能打印一下
//借助于String类来展示byte数组的内容
//buf 给字符串 为了展示字节数组中的内容的
//0 偏移量 buf这个数组中从哪开始取值 从下标为0 的地方取值
//read 取6个
//如果b的长度为零,则不会读取字节并返回0 ;
// 否则,尝试读取至少一个字节。
// 如果没有字节可用,因为流在文件末尾,则返回值-1
int length = -1;
//如果length=-1 那么就会到达流的末尾 就证明后面没哟数据
//循环结束,不要再读了
while ((length = bis.read(buf)) != -1) {
//循环4次
System.out.println("狗蛋");
//数组中的东西要展示出来 使用String
//将磁盘上面的内容 读取到 =》 内存 buf
System.out.println(new String(buf, 0, length));
}
//7.流是需要关闭的
bis.close();
fis.close();
}
}
字节输出流
public static void main(String[] args) throws IOException {
//将Java代码中的一个字符串写入到咱们的磁盘的某一个文件中
//1.创建File对象,文件路径对象 告知编译器要把数据写到哪个文件中
File file = new File("c:/aaa/2.txt");
//2.实例化字节输出流对象
FileOutputStream fos = new FileOutputStream(file);
//3.对FileOutputStream 加上缓冲的效果
//猜测一下 FileInputStream所对应的缓冲流 BufferedInputStream
//FileOutputStream 所对应的缓冲流 BufferedOutputStream
BufferedOutputStream bos = new BufferedOutputStream(fos);
//4.将一个字符串写入到磁盘中
String str = "大家再等我一天,后天见面!!!";
// write(byte[] b)
//咱们的参数是字节数组,咋办?str是一个字符串 但是参数是一个字节数组,咋解决?
//str是字符串 不能强转 将字符串转为字节数组,没有讲过!!!
//将str字符串转为字节数组
byte[] bytes = str.getBytes();
bos.write(bytes);
//5.写完以后一定要刷新流然后关闭流
bos.flush();//没有实际的意义,可以不写的
//6.关闭流
//在输入流的时候一定是先开的后关,后开的先关
bos.close();
fos.close();
}
}