一、概念
IO流(Input/Output stream)是用于处理输入和输出操作的机制。它提供了一种统一的方式来读取和写入不同类型的数据。IO流可用于从文件、网络连接、键盘、内存等源读取数据,也可用于将数据写入到文件、网络连接、屏幕等目标。
IO流主要分为字节流和字符流两种类型:
(1)字节流(Byte Stream):字节流以字节为单位进行读写操作,适用于二进制文件(如图像、视频等)或处理原始字节数据。常见的字节流类包括 InputStream 和 OutputStream。
(2)字符流(Character Stream):字符流以字符为单位进行读写操作,适用于处理文本数据,并提供了更高级别的操作,如字符编码和解码。常见的字符流类包括 Reader 和 Writer。
字节流和字符流之间可以通过适配器类(如 InputStreamReader 和 OutputStreamWriter)进行转换,以便在字节流和字符流之间进行转换和桥接。
Java提供了丰富的IO类库,包括用于文件操作的 FileInputStream、FileOutputStream、FileReader、FileWriter,用于处理网络连接的 Socket、ServerSocket,以及用于内存操作的 ByteArrayInputStream、ByteArrayOutputStream 等。
使用IO流,可以通过读取输入流进行数据的读取,或通过将数据写入输出流进行数据的写入。在使用完IO流后,为了释放资源,应该及时关闭流对象,可以使用 close() 方法来关闭流。
注意:从是读去和写入的维度看,Java的IO流可以分为:(简单易懂)
(1)输入流:InputStream和Reader。
(2)输出流:OutputStream和Writer。
适配器:
在软件工程中,适配器(Adapter)是一种设计模式,用于将一个类的接口转换成客户端所期望的另一种接口。适配器模式允许不兼容的接口之间进行协同工作,使得原本由于接口不匹配而无法合作的类能够一起工作。
适配器模式通常涉及三个角色:
目标接口(Target Interface):客户端期望的接口,它定义了客户端使用的方法。
适配器(Adapter):适配器是一个实现了目标接口的类。它包含一个对不兼容接口的引用,并通过实现目标接口方法来适配不兼容的接口。
不兼容接口(Adaptee Interface):不兼容的接口是已经存在的接口或类,其方法和目标接口不匹配。
适配器模式可以通过两种方式实现:
类适配器:适配器类同时继承目标接口和不兼容接口,从而使得适配器可以充当目标接口并调用不兼容接口的方法。
对象适配器:适配器类包含一个对不兼容接口的引用,并实现目标接口。适配器通过调用引用的不兼容接口方法来实现目标接口方法。
适配器模式的作用是使得原本由于接口不匹配而无法协同工作的类能够合作。通过使用适配器,我们可以重用现有的类,并且在不改变客户端代码的情况下实现接口的转换。
适配器模式在实际应用中非常常见,例如将不同数据库的访问接口适配成统一的接口、将不同文件格式的读写接口适配成统一的接口等。它提供了一种灵活的方式来解决接口不匹配的问题,并促进了代码的复用和可扩展性。
二、IO流练习
2.1.统计大小
(1)统计文件大小
import java.io.File;
public class Test11 {
public static void main(String[] args) {
File file =new File("D:\\1234567.exe");
long Bytes=file.length();
double KB=(double) Bytes/1024;
double MB=KB/1024;
System.out.println(Bytes+"(B)"+"\n"+KB+"(KB)"+"\n"+MB+"(MB)");
}
}
(2)统计磁盘大小
import java.io.File;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
public class Test3 {
public static void main(String[] args) {
//先看看API中与File有关的用法,具体参考API帮助文档
System.out.println("路径分割符:"+File.pathSeparator);
System.out.println("路径分割符:"+File.pathSeparatorChar);
System.out.println("路径分割符:"+File.separator);
System.out.println("路径分割符:"+File.separatorChar);
File file = new File("src/Weige");
System.out.println("是否存在:"+file.exists());
System.out.println("是文件:"+file.isFile());
System.out.println("是目录:"+file.isDirectory());
System.out.println("是绝对路径吗?:"+file.isAbsolute());
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("最后修改的时间:"+getDateString(file.lastModified()));
File file2=new File("./Weige.txt");
System.out.println("文件大小:"+getLength(file2.length()));
File[] files=File.listRoots();
System.out.println("盘符名\t总内存\t可用空间\t已用空间");
for(File f : files) {
System.out.println(f+"\t"+getLength(f.getTotalSpace())+"\t"+getLength(f.getFreeSpace())
+"\t"+getLength(f.getTotalSpace()-f.getFreeSpace()));
}
}
private static String getDateString(long time){
Date date = new Date(time) ;
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(date);
}
public static String getLength(long len) {
String info="";
if(len/1024/1024/1024/1024>0) {
info=len/1024/1024/1024/1024+"TB";
}else if(len/1024/1024/1024>0) {
info=len/1024/1024/1024+"GB";
}else if(len/1024/1024>0) {
info=len/1024/1024+"MB";
}else if(len/1024>0) {
info=len/1024+"KB";
}else {
info=len+"B";
}
return info;
}
}
2.2.复制文件及内容
(1)内容复制:将“Test1.txt"文件的内容复制到”Tested.txt"中。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test6 {
public static void main(String[] args){
File source = new File("Test1.txt");//这里是相对路径
File dest = new File("Test2.txt");
try (BufferedReader reader = new BufferedReader(new FileReader(source));
BufferedWriter writer = new BufferedWriter(new FileWriter(dest));
){
String info;
long start=System.nanoTime();
while((info=reader.readLine()) != null) {//读一行
writer.write(info);
//新建一行
writer.newLine();
}
writer.flush();
long end=System.nanoTime();
System.out.println("复制所需时间:"+(end-start)+"(纳秒)");
}catch (IOException e) {
e.printStackTrace();
}
}
}
(2)文件复制:将路径为"D:\\Tang.txt "的文件,复制到路径为:”D:\\pics\\Tang1.txt“的文件下。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test13 {
public static void main(String[] args) {
FileInputStream in=null;
FileOutputStream out=null;
File file=new File("D:\\pics");
if(!file.isDirectory()){
file.mkdir();
}
try{
in=new FileInputStream(new File("D:\\Tang.txt"));
out=new FileOutputStream(new File("D:\\pics\\Tang1.txt"));
while (true){
int inread=in.read();
if(inread==-1){
break;
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
(3)图片复制:将路径为:"D:\\Test.png"复制到路径为:"D:\\Tan\\TVT.png"文件中。
public static void main(String[] args){
File source =new File("D:\\Test.png");
File dest=new File("D:\\Tan\\TVT.png");
try(InputStream in=new FileInputStream(source);
OutputStream out=new FileOutputStream(dest)
){
if(!dest.exists()) {
dest.createNewFile();
}
byte[] bt=new byte[1024];
int len;
while((len=in.read(bt))!=-1) {
out.write(bt,0,len);
}
System.out.println("文件复制成功!!");
}catch (IOException e) {
e.printStackTrace();
}
}
2.3.读写文件
(1)向文件写入内容,文件路径:”D:\\Tang.txt“。
import java.io.*;
public class Test4 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\Tang.txt");
String str = "我要去上班!!!";
byte[] words = str.getBytes();
fos.write(words);
fos.close();
}
}
区分不同:(重在理解)
public class Test{
public static void main(String[] args) throws Exception {
File file = new File("Tang.txt");
OutputStreamWriter os = new FileWriter(file);
String info="我要去上班!!!";
os.write(info);
os.close();
}
}
(2)读取文件内容,文件相对路径:“Test.txt"。
public class Test{
public static void main(String[] args) throws Exception {
File f = new File("Test.txt");
InputStream in = new FileInputStream(f);
InputStreamReader rd = new InputStreamReader(in);
System.out.println("字节编码:"+rd.getEncoding());
int len;
char[] arr=new char[1024];
while ((len = rd.read(arr))!=-1){
String str = new String(arr,0,len);
System.out.println(str);
}
rd.close();
in.close();
}
}