Java IO
IO流的概念
计算机中的数据时基于随着时间变化高低电压信号传输的,这些数据信号连续不断,有着固定的传输方向,类似于水管中的水的流动,因此,抽象数据流是指一组有顺序的、有起点和终点的字节集合
IO流的作用
抽象出数据流是为了实现程序逻辑与底层硬件的解耦:通过引入数据流作为程序与硬件设备之间的抽象层,面向通用的数据流输入输出接口编程,而不是具体硬件特性,程序和底层硬件可以独立灵活替换和扩展
IO流的类型
IO是指对数据流的输入和输出
流向类型:输入/输出流
流的数据单位:字节流(可以处理任何类型的数据)、字符流(只能处理字符类型的数据)
流的功能角色:节点流、处理流(对一个已有流进行连接和封装)
节点类型:File(文件)、Piped(进程内线程通信管道)、ByteArray/CharArray(字节/字符数组)、StringBuffer/String(字符串缓冲区/字符串)
抽象流类型:InputStream、OutputStream、Reader、Writer
功能:Buffered(缓冲)、Data(基本数据类型)、Object(对象)
BIO(同步阻塞型IO)blocking I/O:适用于连接数目小且固定的架构
NIO(同步非阻塞型IO)【JDK1.4】non-blocking I/O:适用于连接数目多且连接比较短的架构
AIO(异步非阻塞型IO)【JDK1.7】asynchronous I/O:适用于连接数目多且连接比较长的架构
涉及的设计策略与设计模式
设计策略:链接机制、对称性
设计模式:装饰模式、适配模式
outputStream中的三个基本的写方法
abstract void write(int?b):往输出流中写入一个字节。
void write(byte[]?b) :往输出流中写入数组b中的所有字节。
void write(byte[]?b, int?off, int?len) :往输出流中写入数组b中从偏移量off开始的len个字节的数据。
其它方法
void flush() :刷新输出流,强制缓冲区中的输出字节被写出。
void close() :关闭输出流,释放和这个流相关的系统资源。
Java流类的类结构图:
字符流的由来: Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
3)特性
相对于程序来说,输出流是往存储介质或数据通道写入数据,而输入流是从存储介质或数据通道中读取数据,一般来说关于流的特性有下面几点:
1、先进先出,最先写入输出流的数据最先被输入流读取到。
2、顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile可以从文件的任意位置进行存取(输入输出)操作)
3、只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。
1File 类
如何创建创建一个文件对象
File f1 =new File(“绝对路径”);
package demo7;
import java.io.File;
import java.io.IOException;
public class IO01 {
public static void main(String[] args) throws Exception {
File f1=new File("a.txt");
if(!f1.exists()) {
f1.createNewFile();
}
System.out.println(f1.isFile());
System.out.println(f1.isDirectory());
System.out.println(f1.getName());
System.out.println(f1.getParent());
System.out.println(f1.getPath());
System.out.println(f1.getAbsolutePath());
System.out.println(f1.length());
System.out.println(f1.delete());
}
}
2
package demo7; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class IO02 { public static void main(String[] args) throws Exception { File fl=new File("a.txt"); if(!fl.exists()) { fl.createNewFile(); } FileInputStream fis=new FileInputStream(fl); byte[] bt=new byte[(int)fl.length()]; fis.read(bt); for (byte b : bt) { System.out.print((char)b); } fis.close(); } }
3
package demo7;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class IO03 {
public static void main(String[] args) throws Exception {
File fl=new File("b.txt");
//String 调 getBytes方法变成byte数组
String s="我心中的那团火是不会熄灭滴!!";
byte[] bt=s.getBytes();
FileOutputStream fs;
fs=new FileOutputStream(fl);
fs.write(bt);
fs.close();
System.out.println("执行成功");
}
}
4
package demo7;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class IO04 {
public static void main(String[] args) throws Exception {
File fl=new File("b.txt");
File f2=new File("d.txt");
FileInputStream fis;
FileOutputStream fos;
//复制文件 位置
fis =new FileInputStream(fl);
fos =new FileOutputStream(f2);
//方式一
// byte[] bt=new byte[(int)fl.length()];
// fis.read(bt);
// fos.write(bt);
//方式二
int i;
while((i=fis.read())!=-1) {
fos.write(i);
}
fos.close();
fis.close();
System.out.println("成功啦");
}
}
5
package demo7;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class IO05 {
public static void main(String[] args) throws Exception {
File fl =new File("e.txt");
FileWriter fw=null;
fw=new FileWriter(fl);
//String 调 toCharArray方法变成 char数组
String s="Hellow";
char[] cr=s.toCharArray();
fw.write(221);//输入的数字对应ascll码
fw.write(s);
fw.write("apple");//输入的数字对应ascll码
fw.write(221);
fw.write(cr);
fw.close();
System.out.println("成功啦!!");
}
}
6
package demo7;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
public class IO06 {
public static void main(String[] args) throws Exception {
File fl=new File("e.txt");
FileInputStream fis;
InputStreamReader isr;
//定义输入流
fis= new FileInputStream(fl);
isr=new InputStreamReader(fis);
//定义一个char数组 把文件内容传进去
char[] cr=new char[(int)fl.length()];
isr.read(cr);
//遍历char数组 输出
for (char c : cr) {
System.out.print(c);
}
}
}
7
package demo7;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class IO07 {
public static void main(String[] args) throws Exception {
FileInputStream fis=null;
InputStreamReader isr=null;
BufferedReader br=null;
File ff=new File("a.txt");
fis=new FileInputStream(ff);
isr=new InputStreamReader(fis);
//加入缓冲区
br=new BufferedReader(isr);
//输出一行 只有一行helloWorld
System.out.println(br.readLine());
br.close();
isr.close();
fis.close();
}
}
8
package demo7;
import java.io.*;
public class IO08 {
public static void main(String[] args) throws Exception {
FileOutputStream fis=null;
OutputStreamWriter isr=null;
BufferedWriter br=null;
File ff=new File("e.txt");
fis=new FileOutputStream(ff);
isr=new OutputStreamWriter(fis);
//加入缓冲区
br=new BufferedWriter(isr);
String s="banana";
char[] ch= s.toCharArray();
br.write(ch);
br.write(s+"+apple");
br.write(111);
br.close();
isr.close();
fis.close();
System.out.println("成功了");
System.out.println(ff.exists());
}
}
9
package demo7;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
public class IO09 {
public static void main(String[] args) throws Exception {
//使用 字符流 缓冲流实现文件的复制
File fl=new File("e.txt");
File f2=new File("f.txt");
FileReader fr=null;
FileWriter fw=null;
BufferedReader br=null;
BufferedWriter bw=null;
fr=new FileReader(fl);
fw=new FileWriter(f2);
br=new BufferedReader(fr);
bw=new BufferedWriter(fw);
String line ;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
fw.close();
fr.close();
System.out.println("成功啦!!");
}
}
10
package demo7;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class IO10 {
public static void main(String[] args) throws Exception {
long start=System.currentTimeMillis();
//使用字节流 File Date 实现 视频的复制
File fl=new File("D:\\JavaVideo\\javaBase\\io类2.mp4");
File f2=new File("D:\\JavaVideo\\javaBase\\io类201.mp4");
FileInputStream fis=null;
FileOutputStream fos=null;
DataInputStream dis=null;
DataOutputStream dos=null;
fis=new FileInputStream(fl);
fos=new FileOutputStream(f2);
dis=new DataInputStream(fis);
dos=new DataOutputStream(fos);
//创建数组 接受视频
byte[] bt=new byte[(int)fl.length()];
dis.read(bt);
dos.write(bt);
dos.close();
dis.close();
fos.close();
fis.close();
long end=System.currentTimeMillis();
System.out.println("系统花费时间==="+(end-start));
}
}
字节流和字符流的区别(重点)
字节流和字符流的区别:
节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法。
· 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
· 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
结论:只要是处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。