输入输出流--读写文件
输入--从文件中获取数据到自己的程序中接受处理【读】
输出--将自己的程序中处理好的数据保存到文件中【写】
流----数据的移动轨迹
按照数据的移动轨迹将流分为:输入流 输出流
按照每一次读/写数据量的大小将流分为:字节流 字符流
字节流:每一次可以读写一个字节的数据量,一个字节就是8位2进制,可以处理任何类型的文件【文本,图片,视频.......】
字符流: 每一次可以读写一个字符的数据量,一个字符就是16位2进制,只能处理文本类型的数据。
详细划分: 字节输入流 字节输出流 字符输入流 字符输出流
字节输出流---OutputStream---抽象类---不能new---子类
FileOutputStream类
FileOutputStream类构造方法:
FileOutputStream(File file) 通过File对象创建一个不可追加的字节输出流。
FileOutputStream(File file, boolean append) 通过File对象创建一个是否追加的字节输出流。
FileOutputStream(String name) 通过String 对象创建一个不可追加的字节输出流。
FileOutputStream(String name, boolean append)通过String对象创建一个是否追加的字节输出流。
- package com.wangxing.test1;
-
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.OutputStream;
-
- public class TestFileOutputStream {
- public static void main(String[] args)throws Exception {
- String filepath="F:"+File.separator+"mytest";
- File file=new File(filepath);
- //FileOutputStream类构造方法:
- //FileOutputStream(File file) 通过File对象创建一个不可追加的字节输出流。
- FileOutputStream out1=new FileOutputStream(file);
- OutputStream out11=new FileOutputStream(file);
- //FileOutputStream(File file, boolean append) 通过File对象创建一个是否追加的字节输出流。
- FileOutputStream out2=new FileOutputStream(file,true);
- OutputStream out22=new FileOutputStream(file,true);
- //FileOutputStream(String name) 通过String 对象创建一个不可追加的字节输出流。
- FileOutputStream out3=new FileOutputStream(filepath);
- OutputStream out33=new FileOutputStream(filepath);
- //FileOutputStream(String name, boolean append)通过String对象创建一个是否追加的字节输出流。
- FileOutputStream out4=new FileOutputStream(filepath,true);
- OutputStream out44=new FileOutputStream(filepath,true);
- }
- }
FileOutputStream类实例方法:
void write(byte[] b) 将 b.length个字节从指定的字节数组写入此文件输出流。
void write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此 文件输出流。
void write(int b) 将指定的字节写入此文件输出流。
void close() 关闭此文件输出流并释放与此流相关联的任何系统资源。
- package com.wangxing.test1;
- import java.io.File;
- import java.io.FileOutputStream;
- public class TestFileOutputStream2 {
- public static void main(String[] args)throws Exception {
- //FileOutputStream类实例方法:
- //void write(byte[] b) 将 b.length个字节从指定的字节数组写入此文件输出流。
- /*
- String data1="world";
- String filepath1="F:"+File.separator+"mytest"+File.separator+"hello.txt";
- File file1=new File(filepath1);
- FileOutputStream out1=new FileOutputStream(file1);
- out1.write(data1.getBytes());
- out1.close();
- */
-
- //void write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。
- /*
- String data2="hello,world";
- String filepath2="F:"+File.separator+"mytest"+File.separator+"hello1.txt";
- File file2=new File(filepath2);
- FileOutputStream out2=new FileOutputStream(file2,true);
- byte bytearray[]=data2.getBytes();
- out2.write(bytearray,0,5);
- out2.close();
- */
-
- //void write(int b) 将指定的字节写入此文件输出流。
- /*
- String filepath3="F:"+File.separator+"mytest"+File.separator+"hello2.txt";
- File file3=new File(filepath3);
- FileOutputStream out3=new FileOutputStream(file3,true);
- out3.write(100);
- out3.close();
- */
- String data3="hello,world";
- String filepath3="F:"+File.separator+"mytest"+File.separator+"hello2.txt";
- File file3=new File(filepath3);
- FileOutputStream out3=new FileOutputStream(file3,true);
- byte bytearray[]=data3.getBytes();
- for(int i=0;i
- out3.write(bytearray[i]);
- }
- out3.close();
- //void close() 关闭此文件输出流并释放与此流相关联的任何系统资源。
- }
- }
字节输入流---InputStream---抽象类---不能new---子类
FileInputStream类
FileInputStream类构造方法:
FileInputStream(File file) 通过File对象创建一个字节输入流
FileInputStream(String name) 通过String对象创建一个字节输入流
- package com.wangxing.test1;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStream;
- public class TestFileInputStream1 {
- public static void main(String[] args)throws Exception {
- String filepath="F:"+File.separator+"mytest"+File.separator+"hello2.txt";
- File file=new File(filepath);
- //FileInputStream类构造方法:
- //FileInputStream(File file) 通过File对象创建一个字节输入流
- FileInputStream in1=new FileInputStream(file);
- InputStream in11=new FileInputStream(file);
- //FileInputStream(String name) 通过String对象创建一个字节输入流
- FileInputStream in2=new FileInputStream(filepath);
- InputStream in22=new FileInputStream(filepath);
- }
- }
FileInputStream类实例方法
int read() 从该输入流读取一个字节的数据。
返回值:读取到的具体字节数据的int型,如果到达文件末尾返回-1
int read(byte[] b) 从该输入流读取最多 b.length个字节的数据为字节数组。
返回值:读取的总字节数, 如果到达文件末尾返回-1
void close() 关闭此文件输入流并释放与流相关联的任何系统资源。
- package com.wangxing.test1;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStream;
- public class TestFileInputStream2 {
- public static void main(String[] args)throws Exception {
- //FileInputStream类实例方法
- //int read(byte[] b) 从该输入流读取最多 b.length个字节的数据为字节数组。
- //返回值:读取的总字节数, 如果到达文件末尾返回-1
- /*
- String filepath1="F:"+File.separator+"mytest"+File.separator+"hello2.txt";
- File file1=new File(filepath1);
- FileInputStream in1=new FileInputStream(file1);
- byte bytearray[]=new byte[1024];
- int len=in1.read(bytearray);
- String info=new String(bytearray,0,len);
- in1.close();
- System.out.println("info=="+info);
- */
-
- //int read() 从该输入流读取一个字节的数据。
- //返回值:读取到的具体字节数据的int型,如果到达文件末尾返回-1
- /*
- String filepath1="F:"+File.separator+"mytest"+File.separator+"hello2.txt";
- File file1=new File(filepath1);
- FileInputStream in1=new FileInputStream(file1);
- int data=in1.read();
- in1.close();
- System.out.println("data=="+data);
- */
-
- String filepath1="F:"+File.separator+"mytest"+File.separator+"hello2.txt";
- File file1=new File(filepath1);
- FileInputStream in1=new FileInputStream(file1);
- byte bytearray[]=new byte[100];
- int temp=0;
- int index=0;
- while((temp=in1.read())!=-1){
- bytearray[index]=(byte)temp;
- index++;
- }
- String info=new String(bytearray,0,index);
- in1.close();
- System.out.println("info=="+info);
- //void close() 关闭此文件输入流并释放与流相关联的任何系统资源。
- }
- }
DataOutputStream类
DataOutputStream类的构造方法
DataOutputStream(OutputStream out) 创建一个新的数据输出流,以将数据写入指定的底层输出流。
- package com.wangxing.test2;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.OutputStream;
- public class TestDateOutputStream1 {
- public static void main(String[] args)throws Exception {
- //DataOutputStream类的构造方法
- //DataOutputStream(OutputStream out) 创建一个新的数据输出流,以将数据写入指定的底层输出流。
- String filepath="F:"+File.separator+"mytest"+File.separator+"data1.txt";
- File file=new File(filepath);
- OutputStream out=new FileOutputStream(file,true);
- DataOutputStream dataout=new DataOutputStream(out);
- }
- }
DataOutputStream类的实例方法
void writeBoolean(boolean v) 将 boolean写入底层输出流作为1字节值。
void writeByte(int v) 将 byte作为1字节值写入底层输出流。
void writeChar(int v) 将 char写入底层输出流作为2字节值,高字节优先。
void writeDouble(double v) 双参数传递给转换 long使用 doubleToLongBits方法在类 Double ,然后写入该 long值基础输出流作为8字节的数量,高字节。
void writeFloat(float v) 浮子参数的转换 int使用 floatToIntBits方法在类 Float ,然后写入该 int值基础输出流作为一个4字节的数量,高字节。
void writeInt(int v) 将底层输出流写入 int作为四字节,高位字节。
void writeLong(long v) 将 long写入底层输出流,为8字节,高字节为首。
void writeShort(int v) 将 short写入底层输出流作为两个字节,高字节优先。
void writeUTF(String str) 使用 modified UTF-8编码以机器无关的方式将字符串写入基础输出流
void flush() 刷新此数据输出流。
void close() 关闭此输出流并释放与此流相关联的任何系统资源。
- package com.wangxing.test2;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.OutputStream;
- public class TestDateOutputStream2 {
- public static void main(String[] args)throws Exception {
- //DataOutputStream类的实例方法
- String filepath="F:"+File.separator+"mytest"+File.separator+"data1.txt";
- File file=new File(filepath);
- OutputStream out=new FileOutputStream(file,true);
- DataOutputStream dataout=new DataOutputStream(out);
- int age=23;
- dataout.writeInt(age);
- double height=168.5;
- dataout.writeDouble(height);
- boolean sex=true;
- dataout.writeBoolean(sex);
- String name="zhangsan";
- dataout.writeUTF(name);
- dataout.flush();
- dataout.close();
- }
- }
DataInputStream类
DataInputStream类构造方法
DataInputStream(InputStream in)创建使用指定的底层InputStream的DataInputStream。
- package com.wangxing.test2;
- import java.io.DataInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStream;
- public class TestDateInputStream1 {
- public static void main(String[] args)throws Exception {
- //DataInputStream类的构造方法
- //DataInputStream(InputStream out) 创建一个新的数据输入流,以将数据读取到指定的底层输入流。
- String filepath="F:"+File.separator+"mytest"+File.separator+"data1.txt";
- File file=new File(filepath);
- InputStream in=new FileInputStream(file);
- DataInputStream datain=new DataInputStream(in);
- }
- }
DataInputStream类实例方法
boolean readBoolean()
byte readByte()
char readChar()
double readDouble()
float readFloat()
int readInt()
long readLong()
short readShort()
String readUTF()
void close()
- package com.wangxing.test2;
- import java.io.DataInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStream;
- public class TestDateInputStream2 {
- public static void main(String[] args)throws Exception {
- //DataInputStream类实例方法
- String filepath="F:"+File.separator+"mytest"+File.separator+"data1.txt";
- File file=new File(filepath);
- InputStream in=new FileInputStream(file);
- DataInputStream datain=new DataInputStream(in);
- int age=datain.readInt();
- double height=datain.readDouble();
- boolean sex=datain.readBoolean();
- String name=datain.readUTF();
- datain.close();
- System.out.println("age=="+age+",height="+height+
- ",sex="+sex+",name="+name);
- }
- }
优点:可以直接写出基本数据类型的数据和String,且不需要转换成字节数组
缺点:保存到文件中的数据是乱码
序列化和反序列化
如果我们将一台计算机中的java对象,发送给另一台计算机识别,可能会因为不同的计算机中安装了不同JDK版本,从而造成java对象无法识别。所以就需要对传递的java对象进行序列化和反序列化。
序列化---将一个java对象转换成2进制流数据过程。
完成一个序列化需要创建对象的java类实现一个序列化接口【Serializable】
序列化接口的定义 : public interface Serializable
这个接口的特殊之处就在于该接口中一个方法都没有。
这个接口被视为是功能性接口,当某一个类实现了这个接口之后,就意味着具备序列化功能。
ObjectOutputStream类
ObjectOutputStream的构造方法
ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream
- package com.wangxing.test3;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.ObjectOutputStream;
- import java.io.OutputStream;
- public class TestObjectOutputStream1 {
- public static void main(String[] args)throws Exception {
- //ObjectOutputStream的构造方法
- //ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream
- String filepath="F:"+File.separator+"mytest"+File.separator+"object1.txt";
- File file=new File(filepath);
- OutputStream out=new FileOutputStream(file);
- ObjectOutputStream objout=new ObjectOutputStream(out);
- }
- }
序列化操作步骤:
1.创建java类,实现序列化接口【Serializable】
2.创建这个java类对象
3.创建ObjectOutputStream字节输出流类对象
4.使用ObjectOutputStream字节输出流类对象调用void writeObject(Object obj) 将对象写出
- package com.wangxing.test3;
- import java.io.Serializable;
- public class Student implements Serializable{
- public void testStudent(){
- System.out.println("Student类的实例方法");
- }
- }
-
- package com.wangxing.test3;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.ObjectOutputStream;
- import java.io.OutputStream;
- public class TestObjectOutputStream2 {
- public static void main(String[] args)throws Exception {
- //创建java类对象
- Student student=new Student();
- //创建ObjectOutputStream类对象
- String filepath="F:"+File.separator+"mytest"+File.separator+"object.txt";
- File file=new File(filepath);
- OutputStream out=new FileOutputStream(file);
- ObjectOutputStream objout=new ObjectOutputStream(out);
- //使用ObjectOutputStream字节输出流类对象调用writeObject(Object obj)将对象写出
- objout.writeObject(student);
- objout.close();
- }
- }
反序列化---将2进制流数据转换成一个java对象的过程
创建ObjectInputStream字节输入流类对象
使用ObjectInputStream字节输入流类对象调用Object readObject()将数据读取成java对象
ObjectInputStream类
ObjectInputStream字节输入流类构造方法
ObjectInputStream(InputStream in) 创建一个读取指定的InputStream的ObjectInputStream
- package com.wangxing.test3;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.io.ObjectInputStream;
- public class TestObjectInputStream1 {
- public static void main(String[] args)throws Exception {
- //ObjectInputStream字节输入流类构造方法
- //ObjectInputStream(InputStream in) 创建一个读取指定的InputStream的ObjectInputStream
- String filepath="F:"+File.separator+"mytest"+File.separator+"object.txt";
- File file=new File(filepath);
- InputStream in=new FileInputStream(file);
- ObjectInputStream objin=new ObjectInputStream(in);
- }
- }
-
- package com.wangxing.test3;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.io.ObjectInputStream;
- public class TestObjectInputStream2 {
- public static void main(String[] args)throws Exception {
- //读取object.txt文件中的2进制数据成为一个Student类对象
- String filepath="F:"+File.separator+"mytest"+File.separator+"object.txt";
- File file=new File(filepath);
- InputStream in=new FileInputStream(file);
- ObjectInputStream objin=new ObjectInputStream(in);
- Object obj=objin.readObject();
- Student stu=(Student)obj;
- objin.close();
- stu.testStudent();
- }
- }