IO流概述:
-
IO:输入输出(input/output)
-
流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输
-
IO流就是用来处理设备间数据传输问题的
常见应用:文件复制,文件上传/下载
IO流的分类:
-
按照数据的流向:
输入流:读数据
输出流:写数据
-
按照数据类型:
字节流
字节输入流,字节输出流
字符流
字符输入流,字符输出流
一般来说,我们说IO流的分类是按照数据类型来分的
-
如果数据通过Windows自带的记事本软件打开,还可以读懂里面的内容,就使用字符流,否则使用字节流,若不知道使用哪种,就用字节流
字节流写数据
字节流抽象基类
-
InputStream:这个抽象类是表示字节输入流的所有类的超类
-
OutputStream:这个抽象类是表示字节输出流的所有类的超类
-
子类名特点:子类名称都是以其父类名作为子类名的后缀
FileOutputStream:文件输出流用于将数据写入File
-
FileOutputStream(String name):创建文件输出流以指定的名称写入文件
public class FileOutputStreamDemo01 { public static void main(String[] args) throws IOException { //创建字节输出流对象 //FileOutputStream(String name) FileOutputStream fos = new FileOutputStream("F:\\io\\java.txt"); /* 做了三件事: 1.调用系统功能创建了文件 2.创建了字节输出流对象 3.让字节输出流对象指向创建好的文件 */ //void write(int b):将指定的字节写入此文件输出流 fos.write(97);//a fos.write(57);//9 fos.write(55);//7 //最后要释放资源 //void clos():关闭此文件输出流并释放与此流相关联的任何系统资源 fos.close(); } }
使用字节输出流写数据的步骤:
-
创建字节输出流对象(调用系统功能创建了文件;创建了字节输出流对象;让字节输出流对象指向创建好的文件)
-
调用字节输出流对象的写数据方法
-
释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
字节流写数据的3种方式
public class FileOutputStreamDemo02 { public static void main(String[] args) throws IOException { //创建字节输出流对象 //FileOutputStream(String name) FileOutputStream fos = new FileOutputStream("F:\\io\\java.txt"); //public void write(int b) fos.write(97); //public void write(byte[] b) byte[] arr1= {98,99}; //byte[] getBytes():返回字符串对应的字节数组 byte[] bys = "abcde".getBytes(StandardCharsets.UTF_8); fos.write(bys); //public void write(byte[] b,int off,int len) byte[] arr2= {97,98,99}; fos.write(arr2,1,1); fos.close(); } }
字节流写数据的2个问题
字节流写数据如何实现换行
-
写完数据后加换行符
-
Windows:\r\n
-
Linux:\n
-
mac:\r
-
字节流写数据如何实现追加写入
-
public FileOutputStream(String name,boolean append)
-
创建文件输出流以指定的名称写入文件,如果第二个参数为true,则字节将写入文件的末尾而不是开头
public class FileOutputStreamDemo03 { public static void main(String[] args) throws IOException { //public FileOutputStream(String name,boolean append) // 创建文件输出流以指定的名称写入文件 // 如果第二个参数为true,则字节将写入文件的末尾而不是开头 FileOutputStream fos = new FileOutputStream("F:\\io\\java.txt",true); for(int i = 0;i<10;i++){ fos.write("hello".getBytes(StandardCharsets.UTF_8)); //实现换行 fos.write("\r\n".getBytes(StandardCharsets.UTF_8)); } fos.close(); } }
字节流读数据(一次读一个字节)
需求:把文件java.txt中的内容读取出来在控制台输出
FileInputStream:从文件系统中的文件获取输入字节
-
FileInputSteam(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名。
使用字节输入流读数据的步骤:
-
创建字节输入流对象
-
调用字节输入流对象的读数据方法
-
释放资源
public class FileInputStreamDemo01 { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("F:\\io\\java.txt"); int i = fis.read();//如果达到文件的末尾:-1 System.out.print(i); i = fis.read(); while (i != -1) { System.out.print((char)i); i = fis.read(); } fis.close(); } }
字节流读数据(一次读一个字节数组)
需求:把文件java.txt中的内容读取出来在控制台输出
使用字节输入流读数据的步骤:
-
创建字节输入流对象
-
调用字节输入流对象的读数据方法
-
释放资源
public class FileInputStreamDemo02 { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("F:\\io\\java.txt"); //调用字节输入流对象的读数据方法 //int read(byte[] b):从该输入流读取最多b.length个子节点数据到一个字节数组中 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)); //第三次读数据 len = fis.read(bys); System.out.println(len); System.out.println(new String(bys)); /* hello\r\n world\r\n 第一次:hello 5 第二次:\r\nwor 5 第三次:ld\r\nr 4 */ //第三次修改 //String (byte[] bytes,int offset,int length) System.out.println(new String(bys,0,len)); // ld\r\n 4 //再读,末尾-1 byte[] bys1 = new byte[1024]; int len1; while((len1=fis.read(bys1))!=-1){ System.out.println(new String(bys1,0,len1)); } } }