I:input输入(读取),把硬盘中的数据,读取到内存中使用。
O:output输出(写入),把内存中的数据写入到硬盘中。
流:数据(字符,字节)1个字符=2个字节,1个字节=8个二进制位
字节流:InputStream,OutputStream
字符流:Reader,Writer
字节流:一切皆为字节,字节流可以传输任意文件数据。
OutputStream:close(),flush(),write(byte[] b),write(byte[],int off,int len),write(int b).
FileOutputStream把内存中的数据写到硬盘的文件中。
InputStream:
写入数据的原理(内存-->硬盘)
java程序-->JVM--->OS--->OS调用写数据的方法--->把数据写入到文件中。
字节输出流的使用步骤:
1.创建一个FileOutputStream对象,构造方法中传递写入数据的目的地。
2.调用对象中write方法,把数据写入到文件中
3.释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率 )
构造方法的作用:
1.创建一个FileOutputStream对象。
2.会根据构造方法中传递的文件/文件路径,创建一个空的文件
3.会把FileOutputStream对象指向创建好的文件。
任意文件中都是存储的二进制,数据是字节,任意的文本编辑器在打开文件的时候,都会查询编码表,把字节转换为字符表示。0-127:查询ASCII表。其他值查询系统默认码表(中文系统GBK)
FileOutputStream(File file,boolean append),append是否追加。
写换行:window:\r\n linux:/n mac:/r
FileInputStream:把文件内容读入到内存。
int read()
int read(byte[] b)
void close()
构造方法:
FileInputStream(String name) //文件路径
FileInputStream(File file) //文件
构造方法的作用:
1.会创建一个FileInputStream对象
2.会把FileINputStream对象指定构造方法中要读取的文件
读取数据的原理(硬盘-->内存)
java程序-->JVM--->OS--->OS读取数据的方法--->读取文件
字节输入流的使用步骤:
1.创建FileInputStream对象,构造方法中绑定要读取的数据源。
2.使用对象中的方法read,读取文件
3.释放资源。
循环语句:知道多少次循环用for循环,不知道多少次用while循环。
int len = 0;
while((len = fis.read())!=-1){sout(len)}
-1,说明已经读到文件末尾。
文件的复制:
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("e:\\pl5_1.4.5.apk");
fos = new FileOutputStream("f:\\pl5_1.4.5.apk");
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fos.flush();
fos.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
使用字节流读取中文文件:可能不会显示完整的字符,因为一个中文字符可能占用两个字节或多个字节。需要用字符流,以字符为单位读写数据,专门用于处理文本文件。
1个中文
GBK:占用两个字节
utf-8:占用三个字节。
字符流:输入流Reader,输出流Writer
public void close();关闭此流,并释放与此流相关联的任何系统资源。
public int read();从输入流读取一个字符。
public int read(char[] cbuf);从输入流中读取一些字符,并将它们存储到字符数组cbuf中。
FileReader类:构造方法的作用:1.创建一个FileReader对象。2.会把fileReader对象指向要读取的文件。
FileWriter类:构造方法的作用;1.创建一个对象。2.会根据构造方法中传递的文件/文件路径,创建文件。2.会把对象指向创建好的文件。
字符输出流的使用步骤:
1.创建对象,构造方法中绑定要写入数据的目的文件。
2.使用write,把数据写入到内存缓冲区。(字符转换成字节的过程)
3.使用flush,把内存缓冲区的数据刷新到文件中。
4.释放资源。
flush和close方法的区别:flush刷新缓冲区,流对象可以继续使用。close先刷新缓冲区,然后通知系统释放资源,流对象不可以再使用。
字符流的续写和换行:
续写/追加写FileWriter(String filename,boolean append)
FileWriter(File file,boolean append)
append,续写开关,true不会创建新文件覆盖源文件。false,创建新的文件覆盖源文件。
写换行:window:\r\n linux:/n mac:/r
IO异常的处理:
在jdk1.7前使用try catch finally处理流中的异常。
jdk7新特性:try(定义流对象;定义流对象){} try代码执行完毕,会自动把流对象释放,不用写finally来释放流对象。
在 jdk9新特性:在try前边可以定义流对象,在try()中可以直接引入流对象名称,try代码执行完后,流对象自动释放。
字节缓冲流入流:
给基本的字节输入流增加一个缓冲区(数组)提高基本的字节输入流的读取效率。
BufferedInputStream(InputStream is)
BufferedInputStream(InputStream is,int size)
BufferedOutputStream(OutputStream os);
BufferedOutputStream(OutputStream os,int size);
BufferedWriter(Writer writer);
BufferedReader(Reader reader);
特殊的成员方法:
void newLIne();写入一个行分割符,会根据不同的操作系统,获取不同的行分隔符。
String readLine();读取一个文本行。
转换流:
字符编码和字符集
编码表:生活中的文字和计算机中的二进制文件进行对应的集合表。
编码:字符--->字节
解码:字节-->字符
InputStreamReader :是字节流通向字符流的桥梁。通过方法的形参,设置各种字符编码。
OutputStreamWriter:是字节流通向字符流的桥梁。通过方法的形参,设置各种字符编码。
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out,String charsetName)
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName)
序列化:
序列化流和反序列化流:
把对象以流的方式保存到文件中,叫写对象,也叫对象的序列化。
对象中包含的不仅仅是字符,使用字节流。
ObjectOutputStream:对象的序列化流。
Person p = new Person("小龙女",18);
writeObject(p);
构造方法:ObjectOutputStream(OutputStream out)
把文件中保存的对象,以流的方式读取出来,叫做读对象,也叫做对象的反序列化。
读取的文件保持的都是字节,使用字节流。
ObjectInputStream:对象的反序列化流。
Object obj = (Person)readObject();
NotSerializableException
通过java.io.Serializable接口来实现序列化和反序列化。
Serializable接口也叫标记型接口
要进行序列化和反序列化的类必须实现接口,就会给类添加一个标记。
当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记。
有:就可以序列号和反序列化
没有:就会抛出NotSerializableException
transient关键字:瞬态关键字,它所修饰的成员变量,不能被序列化。
对象序列化后,此类修改了,反序列化的时候,会报InvalidClassException
集合的序列化和反序列化。
打印流:
PrintStream
System.setOut(PrinetStream ps)改变输出语句的目的地。可以打印到文件里面。