(1)明确要操作的数据是数据源还是数据目的(是读还是写)
源/读
InputStream Reader
目的/写
OutputStream Writer
(2)明确操作设备上的数据是字节还是文本
源/读
字节:InputStream
文本:Reader
目的/写
字节:OutputStream
文本:Writer
(3)明确数据所在具体地点
设备:
硬盘:文件File开头
内存:数组、字符串
硬盘:System.in
网络:Socket
对应目的地的设备
硬盘:文件File开头
内存:数组、字符串
硬盘:System.out
网络:Socket
(4)明确是否需要额外功能
需要转换——转换流 InputStreamReader、OutputStreamWtiter
需要高效率——缓冲流 Bufferedxxx
对象序列化——ObjectInputStream、ObjectOutputStream
IO流主要分类:
至于IO流,也就是输入输出流,从文件出发到文件结束,至始至终都离不开文件,所以IO流先从文件File类讲起。
File跟流无关,File类不能对文件进行读和写也就是输入和输出!
File主要表示类似D:\\文件目录1
与D:\\文件目录1\\文件.txt
,前者是文件夹(Directory)后者则是文件(file),而File类就是操作这两者的类。
绝对路径:一个完整的路径,以盘符开头,例如 F://Java//aaa//b.txt。也可以用单斜杠 /
相对路径:一个简化的路径,不以盘符开头,例如 //aaa//b.txt。也可以用单斜杠 /
以上方方法测试,代码如下【注意测试以自己的电脑文件夹为准】:
public class Test {
public void creat(File file)throws Exception{
if (!file.exists());//判断文件是否存在
file.createNewFile();//创建新的文件
}
public void show(File file){
if (file.exists()){//如果文件存在
if (file.isFile()){//如果是文件 输出文件信息
System.out.println("文件名称:"+file.getName());//文件名
//文件绝对路径
System.out.println("文件绝对路径:"+file.getAbsolutePath());
System.out.println("文件相对路径:"+file.getPath());
//相对路径
System.out.println("文件大小:"+file.length());//文件字节大小
}if (file.isDirectory()){//测试文件是否是目录
System.out.println("此文件是目录");
}
}else{
System.out.println("此文件不存在");
}
}
public void delete(File file){
if (file.exists()){//如果文件存在
file.delete();//删除文件
System.out.println("文件已删除");
}
}
public static void main(String[] args)throws Exception {
File file=new File("a.txt");//文件名
Test te=new Test();//创建对象 调动方法
te.creat(file);//创建文件方法
te.show(file);// 展示文件信息方法
}
}
1.如果目录可达,可以直接用 createNewFile() 创建文件,也可用 mkdir() 创建目录
2.如果父级目录不存在,需要先用getParentFile() 获取父级File对象,用父级对象 .mkdirs() 可以递归创建全部的父级目录
文件File的操作
增:createNewFile() mkdir() mkdirs()
删: delete() deleteOnExit()
改: renameTo()
查: getName() getPath() getAbsolutePath() getParentFile() list() liftFiles()
读文件是指把文件中的数据读取到内存中。反之,写文件就是把内存中的数据写到文件中,那通过什么读写文件呢?答案就是流。
流是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道
我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
划分流的方式:按流向区分、按处理数据单元划分
1.流向区分:输出流:OutputStream 和 Writer作为基类
输入流:InputStream 和 Reader作为基类
2.处理数据单元划分: 字节流:字节输入流InputStream基类
字节输出流OutputStream基类
字符流:字符输入流Reader基类
字符输出流Writer基类
字节流是8位通用字节流,字符流是16位 Unicode 字符流
1、 public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
2、int available():可以从输入流中读取的字节数目
3、int read():从输入流一个字节一个字节的读,返回的是该字节的整数表示形式,如果读到了输入流的末尾,返回-1
4、int read(byte[ ] b):从输入流读取若干字节,把这些字节保存到数组b中,返回的是读取的字节数,如果读到了输入流的末尾,返回-1
5、int read(byte[ ] b,int off,int len):从输入流读取若干字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标;len 指定读取的字节数目。如果读到了输入流的末尾,返回-1
使用步骤:
1.引入相关的类
2.构造文件输入流 FileInputStream 对象
3.读取文本文件的数据
4.关闭文件流对象
常用方法:
1、void write(int c): 往输出流中写入一个一个的字节
2、void write(byte[ ] buf): 往输出流中写入一个字节数组
3、void write(byte[ ] b,int off,int len): 往输出流中写入一个字节数组,off代表开始从字节数组的off位置开始往外写,len代表往外写len长度的字节
4、void colse(): 关闭输出流
5、void flush(): 强制把缓冲区的数据写到输出流中
FileOutputStream创建构造方法:
FileOutputStream(File file)
FileOutputStream(Stream name)
FileOutputStream(Stream name,boolean append) 可以在末尾追加内容
前两种构造方法在向文件写数据时将覆盖文件原有内容
创建FileOutputStream实例时,如果相应的文件不存在,则会自动创建一个空的文件
使用步骤:
1.引入相关的类
2.构造文件输出流 FileOutputStream对象
3.把数据写入文本文件
4.关闭文件流对象
不抛出异常的方法:try catch
抛出异常的方法:throws IOException
字符流的由来:因为数据编码的不同,因而有了对字符进行高效操作的流对象,字符流本质其实就是基于字节流读取时,去查了指定的码表,而字节流直接读取数据会有乱码的问题(读中文会乱码)
字符输入流(Reader):1.FileReader 、 2. InputStreamReader(解决中文乱码) 、 3.BufferedReader(提高效率)、4.BufferedReader读取包含中文的文件文本时,需要使用InputStreamReader
字符输出流(Writer):1.FielWrtier 、 2. Writer 子类 OutputStreamWriter(解决中文乱码) 、 3.BufferedWriter(提高效率)
1.1
以Reader为基类 FileReader,Reader的常用方法以及作用,字符流FileReader的创建方式
1、public void close() :关闭此流并释放与此流相关联的任何系统资源。
2、 public int read(): 从输入流读取一个字符。
3、 public int read(char[ ] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
FileReader类是Reader的孙子类,new FileReader类对象变成实际的字符输入流对象,从而对文件操作
1、
FileReader(File file)
: 创建一个新的 FileReader ,给定要读取的File对象。
2、FileReader(String fileName)
: 创建一个新的 FileReader ,给定要读取的文件的字符串名称。
FileReader读取文件流程
1.引入资源 IO流包
2.创建FileReader对象
3.调用相应read()读取文件
4.关闭字符流
中文乱码原因:文件与环境编码不一致
获取本地平台的编码:
System.out.println(System.getProperty("file.encoding"));
字符存入文件是按照字符编码格式编码后存储的
解决方案:(把一个字节流包成一个字符流,同时指定编码格式)
1.手动调整文件编码格式与程序环境编码一致,弊端:可能会导致代码乱码
2.使用Reader子类 InputStreamReader
① InputStreamReader(InputStream in)
②InputStreamReader(InputStream in,Stream charsetName)
Stream charsetName:字符编码格式
BufferedReader类:提高字符流读取文本文件的效率
常用构造方法:BufferedReader(Reader in)
子类BuferedReader特有方法: readLine()
Writer常用方法其作用 FileWrtier 构建及使用 OutputStreamWriter 解决中文乱码
Writer类常用方法:
1、void write(int c) 写入单个字符。
2、void write(char[ ] cbuf) 写入字符数组。
3、void write(char[ ] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
4、 void write(String str)写入字符串。
5、void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
6、void flush( ) 刷新该流的缓冲。
7、void close() 关闭此流,但要先刷新它。
FileWriter类是Writer的孙子类
覆盖原有内容:
FileWriter(File file)
FileWrtier(String name)
boolean类型的参数构造方法
FileWriter类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型
解决办法: Writer 子类 OutputStreamWriter 的常用构造方法
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out,Stream charsetName)
序列化:简单的说序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保存或可传输格式的过程。
反序列化:顾名思义就是与序列化相反,序列化是将对象的状态信息保存到存储介质中,反序列化则是从特定存储介质中读取数据并重新构建成对象的过程
序列化过程:
1.创建一个对象 输出流 ObjectOutputStream ,它可以包装一个其他类型的输出流,如文件输出流 FileOutputStream
2.通过对象输出流的 writeObject()方法写对象,也就是输出可序列化对象。
反序列化过程:
1.创建一个对象 输入流 ObjectInputStream ,它可以包装一个其他类型的输入流,如文件输入流 FileInputStream
2.通过对象输入流的 readObject()方法读取对象,该方法返回一个 Object 类型的对象,如果程序知道该 Java 对象的类型,则可以将该对象强制转换成其真实的类型。