流
IO流:就是以流的方式进行输入输出操作(读写操作)
流:从发送端 —> 接收端 的有序数据
分类:
<1> 流向:输入流(读) 和 输出流(写)
<2> 处理数据类型:字节流 和 字符流 (每次读写一个byte) (每次读写一个char)
<3> 查看构造函数:低级流(节点流) 和 高级流(处理流) 若构造函数的参数又是一个流,这个流就是高级流
例如:BufferedReader(Reader in) 参数又是一个Reader
<4> 按照操作的数据源不同
区分流的细节:xxxxStream 一定是一个字节流 xxxxer 一定是一个字符流
字节输入流:InputStream 字节输出流:OutputStream 字符输入流:Reader 字符输出流: Writer
字节流
1.InputStream
abstract class InputStream 字节输入流
class ByteArrayInputStream 从字节数组中读数据 (使用率非常低)
class FileInputStream 读文件中的内容 (√)
class ObjectInputStream 每次读一个对象 (√) 对象反序列流
class SequenceInputStream 有序读入文件内容,从第一个文件读到结尾,接着读第2个文件内容
FileInputStream
把文件中的数据读到程序中
①构造方法
FileInputStream(File file)
FileInputStream(String name)
②方法
int available() 获取可读的字节个数
int read()
从该输入流读取一个字节的数据
int read(byte[] b)
从该输入流读取最多 b.length个字节的数据为字节数组
int read(byte[] b, int off, int len)
从该输入流读取最多 len字节的数据为字节数组
long skip(long n)
③int read()每次读一个字节
public class ReadDemo {
public static void main(String[] args) {
try {File file = new File("src/demo.txt");
// ctrl+shift+o
// 检查异常:在编译阶段就要处理的异常
// 若文件不存在,则抛出此异常
FileInputStream fis = new FileInputStream(file);
int size = fis.available();
// 鼠标放在红色提示线上,选择第2个 add catch
System.out.println("可读的字节个数" + size);
// 循环读数据,while循环,循环要有结束条件,要不然就是一个死循环
// 读到文件的末尾就不读
int end = -1; // int read() 返回是int类型
while ((end = fis.read()) != -1) {
//若读到文件的末尾返回-1,就结束循环
System.out.println((char) end);
}
fis.close();// 关闭流
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.OutputStream
abstract class OutputStream 字节输出流
class ByteArrayOutputStream 向输入中写入字节数据(使用率非常低)
class FileOutputStream 向文件中写数据 (√)
class ObjectOutputStream 将对象写入一个磁盘文件或者网络中(√)对象序列化流
class SequenceOutputStream 将内容写入文件中
FileOutputStream
向一个文件中写入数据,每次写入一个字节的数据
①构造方法
//File代表一个文件或者目录,此时这里只能是文件
FileOutputStream(File file) 创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(File file, boolean append)
FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。
FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。
②方法
void close() 关闭此文件输出流并释放与此流相关联的任何系统资源.
protected void finalize() 清理与文件的连接,并确保当没有更多的引用此流时,将调用此文件输出流的 close方法.
FileChannel getChannel() 返回与此文件输出流相关联的唯一的FileChannel对象。
FileDescriptor getFD() 返回与此流相关联的文件描述符.
void write(byte[] b) 将 b.length个字节从指定的字节数组写入此文件输出流.
void write(byte[] b, int off, int len) 将len字节从位于偏移量 off的指定字节数组写入此文件输出流.
void write(int b) 将指定的字节写入此文件输出流.
③示例
public class WriteDemo {
public static void main(String[] args) {
try {
//在src目录下,新建一个文件demo.txt
//使用相对路径创建File对象
File file=new File("src/demo.txt");
//向文件中写数据
FileOutputStream fos=new FileOutputStream(file);
//需要try...catch 选中需要放入try中的代码
//右键-->Surround with --> try...catch block
for(int i=97;i<=122;i++) {
fos.write(i);
// ASCII值
}
byte[] arr= {65,66,67,68,69}; //ASCII码
fos.write(arr); //把数组写入文件中
//void write(byte[] b)
//void write(byte[] b, int off, int len)
fos.write(arr,1,3); // 66 67 68
String msg="你们真的很棒!"; //先将字符串转换成字节数组byte[] byte[]
arr2=msg.getBytes();
fos.write(arr2);
//关闭流
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
⑤不覆盖文件原有的内容
FileOutputStream(File file, boolean append)
FileOutputStream(String name, boolean append)
boolean 值 true,就会在 File 文件末尾追加,而不是覆盖
字符流
字节流每次读写都是一个字节 byte
字符流每次读写都是一个字符 char
1.Reader
abstract class Reader 字符输入流,每次读一个字符
class FileReader 读文件中的内容
class BufferedReader 带缓冲区的高级字符输入流,readLine() 每次读1行 (√)
FileReader
①构造方法
FileReader(File file)
FileReader(String fileName)
②方法
int read() 读一个字符
int read(char[] cbuf) 将字符读入数组
abstract int read(char[] cbuf, int off, int len) 将字符读入数组的一部分
③示例
public class ReadDemo {
public static void main(String[] args) {
try {File file=new File("src/demo.txt");
FileReader fr=new FileReader(file);
//一个字符一个字符的读 int read()
// int end=-1;
// while( (end=fr.read()) !=-1) {
// System.out.println((char)end);
// }
//注意区分:字符数组
char[] arr=new char[10];
int len=-1;
while( (len=fr.read(arr))!=-1) {
String s=new String(arr,0,len);
System.out.println(s);
}
fr.close();
//关闭流
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.Writer
abstract class Writer 字符输出流,每次写入一个字符
class FileWriter 向文件中写入内容
class BufferedWriter (×) PrintWriter 字符输出流,println() 每次可以写入1行数据
FileWriter
①构造方法
FileWriter(File file)
FileWriter(File file, boolean append)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)
②方法
void write(int c) 写一个字符
void write(String str) 写一个字符串
void write(String str, int off, int len)的一部分
③示例
public class WriteDemo {
public static void main(String[] args) {
try {
Scanner sc=new Scanner(System.in);
FileWriter pw=new FileWriter(new File("src/demo3.txt"),true);
while(true) { String str=sc.nextLine();
//next 和 nextLine(写空格)
if(str!=null && str.equals("quit")) {
break;
}
//把输入str,写入到文件demo3.txt中
pw.write(str+"\r\n");
pw.flush(); //刷新的
}
pw.close();
//不要在循环中关闭流
sc.close();
//关闭扫描器
} catch (IOException e) {
e.printStackTrace();
}
}
}