_IO流概述和分类
-
IO:输入/输入(Input/Output)
-
流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质就是数据的传输
-
IO流就是用来处理设备间数据传输问题的
- 常见的应用:文件复制;文件上传;文件下载
-
IO流的分类:
- 按照数据的流向
- 输入流:读数据
- 输出流:写数据
- 按照数据类型来分
- 字节流:字节输入流;字节输出流
- 字符流:字符输入流;字符输出流
- 按照数据的流向
-
一般来说,我们说IO流的分类是按照数据类型来分的
-
如果数据通过Windows自带的记事本软件打开,我们还可以读懂里面的内容,就使用字符流,否则使用字节流。如果不知道该使用那种类型的流,就使用字节流。
字节流写数据
-
字节流抽象基类
- InputStream:这个抽象类是表示字节输入流的所有类的超类
- OutputStream:这个类是表示字节输出流的所有类的超类
- 子类名特点:子类名称都是以其父类作为子类名的后缀
-
FIleOutputStrea:文件输出流用于将数据写入File
- FileOutputStream(String name):创建文件输出流以指定的名称写入文件
-
使用字节输出流写数据的步骤:
- 创建字节流输出对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
- 调用字节流输出对象的写数据方法
- 释放资源(关闭此文件输出流并释放与此流相关的任何系统资源)
-
package demo11; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class _IO_Demo_01 { public static void main(String[] args) throws IOException { // 创建字节流输出对象 FileOutputStream fos = new FileOutputStream("C:\\Users\\Alvord\\Desktop\\markdown学习\\code\\studyProject\\src\\demo11\\note.txt"); /* public void write(byte[] b) throws IOException 将 b.length字节从指定的字节数组写入此文件输出流。 */ fos.write(97); fos.write(98); fos.write(99); fos.write(100); /* 做了三件事: 1. 调用系统功能创建了文件 2. 创建了字节输出流对象 3. 让字节输出流对象指向创建好的文件 */ fos.close(); // IO流不要忘了.close()方法释放内存 } } ===================================== Process finished with exit code 0 ******************************** abcd
_字节流写输入的三种方式
-
方法名 说明 void write(int b) 将指定的字节写入此文件输出流,一次写以一个字节数据 void write(byte[] b) 将 b.length 字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据 void write(byte[] b ,int off,int len) 将 len 字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,一次写一个字节数组的部分数据 -
package demo11; import java.io.FileOutputStream; import java.io.IOException; public class _IO_Demo_02 { public static void main(String[] args) throws IOException { /* void write(int b) 将指定的字节写入此文件输出流,一次写以一个字节数据 void write(byte[] b) 将 b.length 字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据 void write(byte[] b ,int off,int len) 将 len 字节从指定的字节数组开始,从偏移量off开始写入此文件输出流, 一次写一个字节数组的部分数据 */ FileOutputStream fos = new FileOutputStream("C:\\Users\\Alvord\\Desktop\\markdown学习\\code\\studyProject\\src\\demo11\\book.text"); // void write(int b) 将指定的字节写入此文件输出流,一次写以一个字节数据 fos.write(97); // a // void write(byte[] b) 将 b.length 字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据 byte[] b = {97,98,99,100,101,102}; fos.write(b); // abcdef /* 重新写入时会覆盖原来文件中的内容 */ // void write(byte[] b ,int off,int len) 将 len 字节从指定的字节数组开始,从偏移量off开始写入此文件输出流, // 一次写一个字节数组的部分数据 fos.write(b,1,3); // bcd // String 类中的getBytes()方法 byte[] bytes = "hijk".getBytes(); fos.write(bytes); // hijk fos.close(); } } ===================================== Process finished with exit code 0 ************************************* aabcdefbcdhijk
_字节流写数据的两个小问题
-
字节流写数据如何实现换行
-
windows: \r\n linux: \n mac: \r
-
-
package demo11; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; public class _IO_demo_03 { public static void main(String[] args) throws IOException { /* 字节流写数据实现换行 windows: \r\n linux: \n mac: \r */ FileOutputStream fos = new FileOutputStream("C:\\Users\\Alvord\\Desktop\\markdown学习\\code\\studyProject\\src\\demo11\\note_03.txt"); for (int i = 0; i < 5; i++) { byte[] bytes = "hello".getBytes(); fos.write(bytes); fos.write("\r\n".getBytes()); } fos.write("==========================".getBytes()); fos.write("\r\n".getBytes()); fos.close(); /* 字节流写数据如何实现追加写入 public FileOutputStream(File file, boolean append) throws FileNotFoundException 创建文件输出流以写入由指定的File对象表示的文件。 如果第二个参数是true ,则字节将被写入文件的末尾而不是开头。 创建一个新的FileDescriptor对象来表示此文件连接。 */ FileOutputStream fosAppend = new FileOutputStream("C:\\Users\\Alvord\\Desktop\\markdown学习\\code\\studyProject\\src\\demo11\\note_04.txt", true); for (int i = 0; i < 3; i++) { fosAppend.write("cyc love xx".getBytes()); fosAppend.write("\r\n".getBytes()); } fosAppend.close(); } } =================================== Process finished with exit code 0 *********************************** hello hello hello hello hello ================================== cyc love xx cyc love xx cyc love xx cyc love xx cyc love xx cyc love xx