流----Java.io包中(精讲)

1流
API查找在Java.io包中。

1.1概述
电流, 水流, 车流 ,

流是有起点和终点的有序字节序列的集合
Java中程序中可能会读写文件内容,需要使用IO流, 这个IO流指java.io包中的相关流类

流的分类:
输入流/输出流
是以当前程序为参照, 如果程序从外面读取数据就是输入流, 把程序中的数据保存到程序的外面就是输出流.
字节流/字符流
如果是以字节为单位处理流中的数据就是字节流, 如果是 以字符为单位处理流中的数据就是字符流. 在应用中, 可以使用字节流处理任意类型的文件. 在读写文本文件时,除了字节流外,还可以使用字符流.
节点流/处理流
直接从设备(数据源)中读写数据就是节点流, 处理流是对节点流的包装.

java.io包中定义了若干流类, 以Stream单词结尾的类就是字节流类,  以Reader单词结尾的类是字符输入流类, 以Writer结尾的流类是字符输出流类
字节流类:

在这里插入图片描述
字符流类
在这里插入图片描述

1.2 FileInputStream/FileOutputStream
以字节为单位读写文件

读取 d:/abc.txt 文件
	//1)建立流通道
	FileInputStream  fis = new FileInputStream( “d:/abc.txt” );
	//2) 一次读取一个字节, 返回读到的字节, 读到文件末尾返回-1
	int  cc = fis.read(); 
	while(  cc != -1 ){
对读到的cc数据进行处理
cc = fis.read();  //继续读后面的字节

}
//3)关闭流通道
fis.close()

在读取时,也可以把读到的若干字节保存到字节数组中
//2) 以字节数组为单位读取数据	 

public class Application {
/**
字节流的应用
*
* @author Administrator
*/

public static void main(String[] args) throws IOException {
    FileInputStream fis=null;
    try {
        fis = new FileInputStream("d:/abc.txt");
      //  int i = fis.read();创建一个初始值为1024的字节
        byte[]bytes=new byte[1024];
        int i = fis.read(bytes);
        while (i != -1) {
            i = fis.read(bytes);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
 if (fis != null){
 try
   {
     fis.close();
   }catch(IOEception e){
   }
 }
    }
}

}

异常处理
	手动关闭流
	自动 关闭流

把数据保存到文件中
FileOutputStream  fos = null;
try{
	fos = new FileOutputStream(“d:/def.txt” , true );
	fos.write( 65 );
	fos.write( “hello”.getBytes()  );

}catch(IOException e){
e.printStackTrace();
}finally{
if( fos != null ){
try{
fos.close();
}catch( IOEception e){
}
}
}

练习:
1)以字节为单位实现文件的复制
2)手动关闭,异常处理

3)以字节数组为单位实现文件复制
4)自动关闭,异常处理

1.3 BufferedInputStream/BufferedOutputStream
理解工作原理

	//创建字节流, InputStream是抽象类,需要赋值子类对象,      //解释原因:直接从设备(数据源)(父类)中读写数据就是节点流, 处理流是对节点流的包装.

	InputStream in = new FileInputStream("d:/abc.txt");       //父类的引用实际传递的是子类对象。
	//通过构造方法,指定被包装的字节流
	BufferedInputStream bis = new BufferedInputStream(in);

1.4 DataInputStream/DataOutputStream
读写数据时,可以带有数据格式
读取数据的顺序必须和写入的顺序一致

装饰者设计模式
	解决问题: 对现有类的现有方法进行功能的扩展
在IO流类中,以Filter开头的类都采用了装饰者设计模式

1.5 PrintStream打印字节流
基本用法
修改System.out的输出方向
经常把异常信息打印到日志文件中

1.6 ObjectInputStream/ObjectOutputStream

    1. 对象序列化
  •  把对象转换为01二进制序列就是对象序列化
    
  •  一般会把01序列保存到文件中, 使用ObjectOutputStream类
    
    1. 对象反序列化
  •  把01序列转换为对象就是对象的反序列化
    
  •  一般是从文件中把01序列读出来转换为对象, 使用ObjectInputStream类
    
    1. 对象如果要进行序列化/反序列化, 对象的类必须实现Serializable接口
  •  Serializable接口是一个标志接口,没有任何方法, 
    
    1. 一般情况下,类实现了Serializable接口后,会手动的添加serialVersionUID字段, 防止反序列化出现异常
  •  private static final long serialVersionUID = -564123146743165710L;
    

1.7 FileReader/FileWriter
字符流

  1. 只能读写纯文本文件
  2. 要求读写文件的编码格式与当前环境的编码格式要兼容

对文本文件进行复制

1.8 BufferedReader/BufferedWriter
字符缓冲流
默认有8192个字符大小的缓冲区

BufferedReader可以对字符流进行缓冲, readLine()一次可以读取一行, 读到文件末尾返回null
BufferedWriter可以字符输出流缓冲, newline()可以换行
 *小的总结:
 *当读写的文件编码格式与 当前环境的编码格式不一样时,就使用转换流
 *当读写的文件编码格式与当前环境编码格式一样时就使用字符流,一般不使用字节流
 *因为字节还要转化为字符输出。

2 File类
读写文件的内容使用IO流, 对文件/文件夹进行操作 使用File类
java.io.File

如何创建File对象

File基本操作

boolean createNewFile() 创建文件.

static File
createTempFile(String prefix, String suffix) 创建临时文件

boolean delete() 删除File对象.

boolean exists() 判断文件是否存在

File
getAbsoluteFile() 返回File对象

String
getAbsolutePath() 返回绝对路径

String
getName() 返回对象的名称

String
getParent() 返回上一级目录

File
getParentFile().

String
getPath() 返回路径

boolean isDirectory() 判断是否为 文件夹.

boolean isFile() 判断是否为文件

long lastModified() 最后一次修改的时间

long length() 文件的大小.

String[]
list() 列出目录中的内容.

String[]
list(FilenameFilter filter)

File[]
listFiles()

File[]
listFiles(FileFilter filter)

File[]
listFiles(FilenameFilter filter)

boolean mkdir() 创建文件夹.

boolean mkdirs() 创建文件夹,如果上一级文件夹不存在,会先创建上一组文件夹

boolean renameTo(File dest) 重命名.

Path
toPath()

URI
toURI()

猜你喜欢

转载自blog.csdn.net/qq_30347133/article/details/83512114