JAVA-I/O(1)
一,I/O
定义:基于数据流的输入和输出;
数据流:表示字符或字节数据的流动序列;
一组有序,有起点和终点的数据序列,分为输入流和输出流;
数据写入时:将数据分段按照一定的顺序组成数据流写入数据流管道;
数据读取时:将数据流管道中的数据流按照先后顺序按照自定义大小进行读取;
数据读取途径:内存,文件,网络连接
数据流分类:
字节流:数据流中最小的数据单元字节,二进制数据
字符流:数据流中最小的数据单元字符,java采用Unicode编码,一个字符占两个字节
二,I/O主要类和接口
1,类:File, InputStream OutputSteam, Reader, Writer
2,接口:Serializable
三,I/O层次
1,流式 : InputSteam, OutputSteam, Reader, Writer等
2,非流式 : File, RandomAccessFile, FileDescriptor等
3,其他:读取安全相关的类,如:SerializablePermission
读取本地操作系统相关的类:如:FileSystem, Win32FileSystem, WinNTFileSystem
主要类:
【1】File:(文件特征和管理)
用于文件和目录的描述信息;如生成目录, 修改文件名, 删除文件, 判断文件所在路径
【2】InputStream:(字节流,二进制格式操作; 抽象类)
用于字节的输入操作; 所有输入流的父类,定义了所有输入流的共同特征;
【3】OutputStream:(字节流,二进制格式操作; 抽象类)
用于字节的输出操作; 所有输出流的父类,定义了所有输出流的共同特征;
【4】Reader:(字符流,文本格式操作; 抽象类)
用于字符的输入操作;
【5】Writer:(字符流,文本格式操作; 抽象类)
用于字符的输出操作;
【6】RandomAccessFile:(随机文件操作)
用于从文件的任意位置进行输入输出操作;
四,I/O流
1,JAVA的I/O含有4个基本类:InputStream, OutputSteam, Reader, Writer;分别处理输入输出流;
脑图:
2,按照来源或去向分类
【1】,File(文件)
FileInputStream, FileOutputStream, FileReader, FileWriter
【2】,byte[](字节数组)
ByteArrayInputStream, ByteArrayOutputStream
【3】,char[](字符数组)
CharArrayReader, CharArrayWriter
【4】,String(字符串)
StringBufferInputStream, StringReader, StringWriter
【5】,网络数据流
InputStream, OutputStream, Reader, Writer
五,选择IO流
【1】,输入还是输出
输入:InputStream, Reader
输出:OutputStream, Writer
【2】,操作数据是否纯文本
文本:Reader, Writer
非文本:InputStream, OutputStream
【3】,具体操作类型
1,文件
读:FileInputStream, Reader
写:FileOutputStream, Writer
2,数组
byte[ ]:ByteArrayInputStream, ByteArrayOutputStream
char[ ]:CharArrayReader, CharArrayWriter
3,String
StringReader, StringWriter
4,Socket
键盘:用System.in(是一个InputStream对象)读取,用System.out(是一个OutoutStream对象)打印
5,是否转换流
InputStreamReader,OutputStreamWriter
6,是否需要缓冲提高效率
加上Buffered:
BufferedInputStream, BufferedOuputStream, BufferedReader, BufferedWriter
六,示例数据流操作
1,将键盘输入进行输出
//1-获取键盘输入的字节流 InputStream inputStream = System.in; //2-字节流转字符流 Reader reader = new InputStreamReader(inputStream); //4-将字符流进行缓存 BufferedReader in = new BufferedReader(reader); //5-读取字符流 char ar; while((ar = (char)in.read()) != -1){ System.out.println(ar); }
2,读取文件内容
方式一:
//1-获取文件的字符输出流 Reader reader = new FileReader("c:\\MainTest.java"); //2-将字符输出流进行缓存 BufferedReader bufferedReader = new BufferedReader(reader); //3-读取字符输出流 String str; while((str = bufferedReader.readLine()) != null){ System.out.println(str); }
方式二:
//1-获取文件的字符输出流 FileReader reader = new FileReader("c:\\MainTest.java"); //2-输出字符输出流 int b; while((b = reader.read()) != -1){ System.out.print((char)b); }
方式三:
//1-获取文件的字符输入流 FileInputStream in = new FileInputStream("c:\\MainTest.java"); //2-将输入流写入字节数组,将字节数组转字符串输出 int n = 1024; byte[] buffer = new byte[n]; while((in.read(buffer)) != -1){ System.out.println(new String(buffer)); }
3,文件拷贝
//1-获取A文件的字符输入流流,和B文件的字符输出流 FileInputStream in = new FileInputStream("d:\\MainTest.java"); FileOutputStream out = new FileOutputStream("d:\\copy.txt"); //2-将A文件字符输入流写入B文件 int b; while((b = in.read()) != -1){ out.write(b); } //3-关闭资源 out.flush(); in.close(); out.close();
4,将键盘输入写入文件
//1-获取字节输入流,文件字符输出流 Scanner in = new Scanner(System.in); FileWriter out = new FileWriter("d:\\Content.txt"); //2-将字节输入流写入文件 String s; while(!(s = in.nextLine()).equals("Q")){ out.write(s + "\r\n"); } //3-关闭资源 out.flush(); in.close(); out.close();