字节流读数据(一次一个)
- 需求:把文件fos.txt中的内容读取出来在控制台输出
- FileInputStream 从文件系统中的文件获取输入字节
- 构造方法
- FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统的路径名name命名。
- 使用字节输入流读数据的步骤:
- 创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo01 {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis = new FileInputStream("基础语法/src/io/fos.txt");
//调用字节输入流读数据方法
//int read() ,从该输入流读取一个字节的数据
int by = fis.read();
System.out.println(by);
//释放资源
fis.close();
}
}
- 输出a
System.out.println((char)by);
- 第二次读取数据
//第一次读取数据
int by = fis.read();
System.out.println(by);
System.out.println((char)by);
//第二次读取数据
by = fis.read();
System.out.println(by);
System.out.println((char)by);
- 两次读取数据的步骤都是一样的,能否用循环改进?如果文件到达末尾,他的返回值就是-1
int by = fis.read();
while( by != -1){
System.out.println((char)by);
}
- 这次会输出一个死循环
- 因此我们得在循环体内再读一遍字节,才会往下一个字节去走
int by = fis.read();
while( by != -1){
System.out.print((char)by);
by = fis.read();
}
- 优化上面的程序
int by;
while ((by = fis.read()) != -1){ //fis.read() 读数据 ;by=fis.read() 把读取到的数据赋值给by ;用 by != -1 判断读取到的数据是否是-1
System.out.print((char)by);
}
复制文本文件
- 复制”窗里窗外.txt” 文件。
- 分析:复制文本文件,其实就是把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地)
- 数据源 “基础语法/src/io/窗里窗外.txt” – 读数据–InputStream–但因为他是个抽象类所以最终选择FileInputStream。
- 目的地"基础语法/src/io/窗里窗外1.txt" – 写数据–OutputStream–FileOutputStream
- 思路:
- 根据数据源创建字节输入流对象
- 根据目的地创建字节输出流对象
- 读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)
- 释放资源
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyTxtDemo {
public static void main(String[] args) throws IOException{
//根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("基础语法/src/io/窗里窗外.txt");
//根据目的地创建字节输出流对象
FileOutputStream fos = new FileOutputStream("基础语法/src/io/窗里窗外1.txt");
//读写数据,复制文本文件
int by;
while((by=fis.read())!=-1){
fos.write(by);
}
fos.close();
fis.close();
}
}
字节流读数据(一次读一个字节数组数据)
- 需求:把文件fos.txt中的内容读取出来输出
- 使用字节输入流读数据的步骤:
- 创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo02 {
public static void main(String[] args) throws IOException{
//创建字节输入流对象
FileInputStream fis = new FileInputStream("基础语法/src/io/fos.txt");
//调用字节输入流对象的读数据方法
byte[] bys = new byte[5];
//第一次读取数据
int len = fis.read(bys); //实际读取的字节数
System.out.println(len);
System.out.println(new String(bys));
//第二次读取数据
len = fis.read(bys);
System.out.println(len);
System.out.println(new String(bys,0,len));
//释放资源
fis.close();
}
}
- 当实际读取的数为-1的时候,说明他已经到达末尾了。
- 使用循环改进
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo03 {
public static void main(String[] args) throws IOException{
//创建字节输入流对象
FileInputStream fis = new FileInputStream("基础语法/src/io/fos.txt");
byte[] bys = new byte[1024]; // 一般给1024及其整数倍
int len;
while((len=fis.read(bys))!=-1){
System.out.println(new String(bys,0,len));
}
//释放资源
fis.close();
}
}
复制图片
- 将1.jpg复制到2.jpg
- 思路:
- 根据数据源创建字节输入流对象
- 根据目的地创建字节输出流对象
- 读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
- 释放资源
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyJpgDemo {
public static void main(String[] args) throws IOException{
//根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("基础语法/src/io/1.jpg");
//根据目的地创建字节输出流对象
FileOutputStream fos = new FileOutputStream("基础语法/src/io/2.jpg");
//读写数据,复制图片
byte[] bys = new byte[1024];
int len;
while((len=fis.read(bys))!=-1){
fos.write(bys,0,len);
}
fos.close();
fis.close();
}
}