title: IO流
IO
流的分类
-
按照数据的传输方向:以JVM作为参照物
-
输入流:将数据从外界输入到JVM中
-
输出流:将数据从JVM中输出到外界
-
-
按照数据的传输单位:
-
字节流:以字节为单位传输,可以传输任何类型的文件
-
字符流:以字符为单位传输,只能传输文本文件(.txt .java .html .xml等等,所以可以用记事本直接打开的都属于文本文件)
-
-
按照流的功能:
-
节点流:具有实际数据传输功能的流
-
过滤流:可以增强节点的传输能力,增加一些功能
-
字节流
- InputStream 字节输入流
- OutputStream 字节输出流
节点流
-
FileOutputStream OutputStream的子类 文件输出流
-
创建语法1:OutputStream os = new FileOutputStream(“文件路径”,true/false);
- 文件路径书写方式
- 绝对路径:相对电脑本身来说,“盘符名:/文件夹名/文件名” 例如: “C:/user/a.txt”,会去C盘的user中找到a.txt文件,如果文件不存在,将会自动生成一个,但是文件夹必须存在
- 相对路径:相对项目根目录来说,“文件夹名/文件名” 例如:“file/a.txt”,会去项目的根目录中寻找file文件夹,在file文件夹中寻找a.txt,若文件不存在,则自动生成一个,但是文件夹必须存在
- 文件路径书写方式
-
第二个参数可以是true或false
- true,代表在文件的原有内容上做追加,不会覆盖原有内容
- false,代表覆盖掉原有内容
- 如果不写默认为false
-
-
FileInputStream InputStream子类 文件输入流
- 创建语法:InputStream is = new FileInputStream(“文件路径”);
- 注意:文件必须存在,不会自动创建,若不存在,会报异常。
- 创建语法:InputStream is = new FileInputStream(“文件路径”);
过滤流
-
BufferedInputStream/BufferedOutputStream 缓冲过滤流
- 作用:内置一个数据缓冲数组,增强数据传输能力,减少访问磁盘次数
- 注意:会先把数据存入数组缓冲区当中,需要使用bos.flush()方法,将缓冲区的数据刷出来,或者直接调用close()方法
- 创建语法:
- BufferedInputStream bis = new BufferedInputStream(输入节点流)
- BufferedOutputStream bos = new BufferedOutputStream(输出节点流)
-
PrintStream 标准输出流
- System.out.println();
- System:java.lang包下的一个类
- out:System的一个静态方法
- println():是out的一个方法
- System.out.println();
-
ObjectInputStram/ObjectOutputStream
- 增加了8种数据类型数据的传输
- 传输对象,对象必须实现序列化接口Serializable
- 对象序列化:将对象转为字节放在流上传输
- 对象中的所有属性也都要实现Serializable接口
- 可以使用修饰符transient让某些属性不参加对象序列化,即反序列化
字符流
编码集
- 作用:专门用来处理char与String数据,并且可以设置编解码
字符流
-
字符流的父类
- Writer 字符输入流
- Reader 字符输入流
-
FileWriter 文件字符输出流
-
FileReader 文件字符输入流
-
过滤流
-
PrintWriter/BufferedReader 缓冲过滤流
- PrintWriter代替BufferedWriter,因为PrinterWriter更加的强大,功能多,使用方便
-
InputStreamReader/OutputStreamWriter 桥转换流
-
作用:可以将字节流转换为字符流,并且设置编码格式
-
构造方法有两个参数:第一参数:节点流 第二个参数:编码格式
-
-
File类
- File对象:代表一个文件或文件夹,通过File类中的方法可以对文件或文件夹本身做处理
- IO流是对文件内容做处理,File是对文做处理
随堂大练习
1. 题目:找出文件夹day19或day20中所有的java文件,并且复制到另一文件夹中
package com.day20.project;
import java.io.*;
//递归找到所有文件夹中的文件
//在判断文件是否以.java结尾
public class TestProject {
public static void main(String[] args) {
search("D:\\甲骨文\\code");
}
//判断文件函数
static void search(String str) {
File code = new File(str);
File[] file = code.listFiles();
for(File f:file) {
//判断是否是文件,是就判断,不是就进入文件夹中
if(f.isDirectory()) {
search(f.toString());
}else {
//分割字符串,注意.要转义,判断符合就复制文件
String[] str1 = f.toString().split("\\.");
if(str1[str1.length-1].equals("java")) {
copy(f);
System.out.println(f.getName());
}
}
}
}
//复制文件函数
static void copy(File f) {
//创建一个文件夹,存放复制的文件
File file = new File("D:\\甲骨文\\codejava");
file.mkdir();
//字符流先读文件
try (
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
BufferedReader br = new BufferedReader(isr);
//在写入文件
FileOutputStream fos = new FileOutputStream(file.getAbsolutePath()+"\\"+f.getName());
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
PrintWriter pw = new PrintWriter(osw))
{
while(true){
String s = br.readLine();
if(s == null) break;
pw.write(s);
}
}catch(Exception e) {
}
}
}
网络编程
BIO
BIO ServerSocket Socket
NIO
NIO ServerSocketChannel SocketChannel Selector