欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1102javaIO流

程序员文章站 2022-03-20 08:25:50
...

IO流简介

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

1102javaIO流
IO 流的分类

  • 根据处理数据类型的不同分为:字符流和字节流
  • 根据数据流向不同分为:输入流和输出流

文件操作File 类

创建目录和文件

  1. public boolean mkdir() 创建此抽象路径名指定的目录
  2. public boolean createNewFile() 创建一个文件
package com.java1234.chap10.yun2;

import java.io.File;
import java.io.IOException;

import javax.print.attribute.standard.MediaName;

public class Demo1 {

	public static void main(String[] args) throws IOException {
		File file=new File("d://java创建目录");
		boolean b=file.mkdir();	//创建虚拟目录
		if (b) {
			System.out.println("目录创建成功");
			file=new File("d://java创建目录//java创建的文件.txt");
			boolean b2=file.createNewFile();	//创建文件
			if (b2) {
				System.out.println("文件创建成功");
			} else {
				System.out.println("文件创建失败");
			}
		}
		else {
			System.out.println("目录创建失败");
		}	
	}
}

删除文件或目录

  1. public boolean delete()删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除
  2. public boolean exists()测试此抽象路径名表示的文件或目录是否存在
package com.java1234.chap10.yun2;

import java.io.File;
import java.io.IOException;
import java.text.FieldPosition;

import javax.print.attribute.standard.MediaName;

public class Demo2 {

	public static void main(String[] args) throws IOException {
		File file=new File("d://java创建目录//java创建的文件.txt");	//把.txt也写上
		if (file.exists()) {	//文件存在
			boolean b=file.delete();	
			if (b) {
				System.out.println("删除文件成功");
			} else {
				System.out.println("删除文件失败");
			}
		}
		else {
			System.out.println("文件不存在");
		}
		file=new File("d://java创建目录");
				if (file.exists()) {	//目录存在
					boolean b=file.delete();	
					if (b) {
						System.out.println("删除目录成功");
					} else {
						System.out.println("删除目录失败");
					}
				} 
	}
}

遍历目录

  1. public File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
package com.java1234.chap10.yun2;

import java.io.File;

public class Demo3 {
	public static void main(String[] args) {
		File file=new File("D:\\毕业设计");
		File files[]=file.listFiles();	//遍历目录
		for (int i = 0; i < files.length; i++) {
			System.out.println(files[i]);
		}
	}
	
}

测试此路径是否为目录

  1. public boolean isDirectory() 测试此抽象路径名表示的文件是否是目录
package com.java1234.chap10.yun2;

import java.io.File;
/**
 * 打印文件
 * @author Administrator
 *
 */
public class Demo4 {
	
	public static void ListFile(File file) {
		if (file!=null) {
			if (file.isDirectory()) {	//是目录
				File f[]=file.listFiles();	//遍历目录
				if (file!=null) {
					for (int i = 0; i < f.length; i++) {
						ListFile(f[i]); 	//递归调用
					}
				}
			} else {	//是文件
				System.out.println(file);
			}
		} 
	}
	
	
	public static void main(String[] args) {
		File file=new File("D://毕业设计");
		ListFile(file);
	}
}

字节输入输出流

InputStream 读取文件

字节输入,硬盘的文件读取到内存,读取到内存后就可以显示了
也就是从硬盘到内存

一般不这么用,太浪费了

package com.java1234.chap10.yun3;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * @author WXYUNDI
 * 2020-11-02_20:31:47
 * InputStream读取文件到内存
 */
public class Demo1 {
	public static void main(String[] args) throws Exception {
		File file=new File("D:\\测试文件.txt");
		InputStream inputStream=new FileInputStream(file);	//实例化FileInputStream
		
		byte b[]=new byte[1024];	
		
		int len=inputStream.read(b);
		inputStream.close();   //关闭输入流
		System.out.println("读取到的内容为:"+new String(b,0,len,"UtF-8"));
		
	}
}

指定大小的字节数组,节省空间

public class Demo2 {
	public static void main(String[] args) throws Exception {
		File file=new File("D:\\测试文件.txt");
		InputStream inputStream=new FileInputStream(file);	//实例化FileInputStream
		
		int FileLength=(int)file.length();	//文件长度
		byte b[]=new byte[FileLength];	//指定大小的字节数组,节省空间
		
		inputStream.read(b);
		inputStream.close();   //关闭输入流
		System.out.println("读取到的内容为:"+new String(b,"UtF-8"));
		
	}
}

一个字节一个字节的读取,放到b字节数组里

public class Demo3 {
	public static void main(String[] args) throws Exception {
		File file=new File("D:\\测试文件.txt");
		InputStream inputStream=new FileInputStream(file);	//实例化FileInputStream
		
		int FileLength=(int)file.length();	
		byte b[]=new byte[FileLength];	
		int temp=0;
		int len=0;
		while ((temp=inputStream.read())!=-1) {
			//一个字节一个字节的读取,放到b字节数组里
			b[len++]=(byte)temp;
		}
		
		inputStream.close();   //关闭输入流
		System.out.println("读取到的内容为:"+new String(b,"UtF-8"));
		
	}
}

OutputStream 写入文件

从内存到硬盘
FileOutputStream(file)默认会覆盖原来的内容,即默认为FileOutputStream(file,false);
改成FileOutputStream(file,true);就会在原有文件后边写了

package com.java1234.chap10.yun3;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class Demo4 {
	public static void main(String[] args) throws Exception {
		File file=new File("D:\\测试文件.txt");
		OutputStream out=new FileOutputStream(file);	//追加默认为false,改成(file,"true")就好了
		String str="你好,我好,大家好";
		byte b[]=str.getBytes();
		out.write(b);	//覆盖了
		out.close();
		
		
	}
}

缓冲和非缓冲的区别及性能对比

BufferedInputStream 和fBuferedOutputStream

package com.java1234.chap10.yun3;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
 * @author WXYUNDI
 * 2020-11-02_21:43:49
 * 缓冲提高效率
 */
public class Demo7 {
	
	public static void bufferStream() throws Exception{
		//定义一个带缓冲的字节输入流
		BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream("D:\\java基础教程笔记.docx"));
		//定义一个带缓冲的字节输出流
		BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(new FileOutputStream("D:\\作业用\\复制的文件2.docx"));
		
		int b=0;
		long statrtime=System.currentTimeMillis();//开始时间
		
		while ((b=bufferedInputStream.read())!=-1) {
			bufferedOutputStream.write(b);
			}
		bufferedInputStream.close();
		bufferedOutputStream.close();
		
		long endtime=System.currentTimeMillis();//结束时间
		System.out.println("缓冲花费的时间:"+(endtime-statrtime));
		
	}
	
	
	
	//非缓冲
	public static void stream() throws Exception {
		InputStream inputStream=new FileInputStream("D:\\java基础教程笔记.docx");
		OutputStream outputStream=new FileOutputStream("D:\\作业用\\复制的文件.docx");
		int b=0;
		long statrtime=System.currentTimeMillis();//开始时间
		
		while ((b=inputStream.read())!=-1) {
			outputStream.write(b);
			}
		inputStream.close();
		outputStream.close();
		
		long endtime=System.currentTimeMillis();//结束时间
		System.out.println("非缓冲花费的时间:"+(endtime-statrtime));
	}
	
	
	public static void main(String[] args) throws Exception {
		stream();
		bufferStream();
	}
}

字符输入输出流

更强大一点

Reader 读取文件

package com.java1234.chap10.yun4;

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

public class Demo1 {
	public static void main(String[] args) throws Exception {
		File file=new File("D:\\test.txt");
		Reader reader=new FileReader(file);
		char c[]=new char[1024];
		int len=reader.read(c);
		reader.close();	//关闭字符输入流
		System.out.println("is:"+new String(c,0,len));
	}

}

一个一个读

package com.java1234.chap10.yun4;

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

public class Demo2 {
	public static void main(String[] args) throws Exception {
		File file=new File("D:\\test.txt");
		Reader reader=new FileReader(file);
		char c[]=new char[1024];
		int temp=0;
		int len=0;		
		while ((temp=reader.read())!=-1) {
			c[len++]=(char)temp;	
		}
		//int len=reader.read(c);
		reader.close();	//关闭字符输入流
		System.out.println("is:"+new String(c,0,len));
	}

}

Writer 写入文件

Writer out=new FileWriter(file,true);不覆盖

package com.java1234.chap10.sec04;

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;

public class Demo3 {

	public static void main(String[] args) throws Exception {
		File file=new File("D://test.txt");
		Writer out=new FileWriter(file);//Writer out=new FileWriter(file,true);不覆盖
		String str="我爱雨杰宝宝";
		out.write(str);  // 将字符串写入输出流
		out.close();  // 关闭输出流
	}
}

总结

  • 一定别忘了close();

  • 字节流的方法也太多了,掌握读取、写入、复制这些基本的,其他的慢慢研究吧

  • insert键表示插入状态,这样就不会写一个后边少一个了,numlock关着按倒0也是这样。

  • 小锋老师的最后一节课,撒花

  • 基础先学到这吧,还是得多敲代码,这几天打字速度倒提升不少,代码也是跟着别人敲的

  • 用好API把里边的方法多用用