java学习笔记12

io流

File提供的功能都是操作文件外部的能力,没有办法操作文件内部的内容

IO流:
流: 一连串流动的数据,以先入先出的方式进行流动,管道 以程序为中心
程序与 网络|文件|服务器|数组…

分类:
按照流向:

  • 输入流
  • 输出流

操作单元分:

  • 字节流 :万能流:任何内容都可以转为字节,可以传输文本,图片…
  • 字符流 :只能操作 纯文本数据

按照功能:

  • 节点流 : 包裹源头,实现基本功能
  • 功能流 : 对节点流增强性能,提高效率
  • 分类之间是相辅相成的

字节输入流 :
InputStream 此抽象类是表示字节输入流的所有类的超类。
FileInputStream 从文件系统中的某个文件中获得输入字节。

字节输出流 : OutputStream

	public static void main(String[] args) throws IOException {
		//FileInputStream(String name)   字符串
		//FileInputStream(File file) 	File对象
		//FileInputStream is=new FileInputStream("D:/test.txt");
		InputStream is=new FileInputStream(new File("D:/test.txt"));//多态
		System.out.println(is);//打印结果
		
		//读入数据 一个字节一个字节读入
		/*int num=is.read();
		System.out.println((char)num);
		num=is.read();
		System.out.println((char)num);
		System.out.println((char)(is.read()));*/
		//使用循环,循环读入  可以简化代码,重复代码只写一次,但是还是一个字节一个字节读入
		/*int num=-1;
		while((num=is.read())!=-1){
			System.out.println((char)num);
		}*/
		//int read(byte[] b)   一个字节数组一个字节数组的读入
		//返回值: 返回读入到字节数组中数据的个数,没有读到返回-1
		byte[] car=new byte[1];
		//int len=is.read(car); 
		int len=-1;
		while((len=is.read(car))!=-1){
			System.out.println(new String(car,0,len));
		}
		
		/*
		 * 问:  一个字节数组不一定能把数据全部读完,可以使用循环重复读取
		 * 		编写过程中,出现的异常都抛出,要求不抛出来捕获解决
		 */
		
		
		//关闭
		is.close();
	}

字节输出流

流向: 输出流 操作单元:字节流 功能: 节点流

  • OutputStream 此抽象类是表示输出字节流的所有类的超类。

  • public class FileOutputStream extends OutputStream文件输出流是用于将数据写入 File 的输出流。

    如果把文件中的数据先读入到程序中,在写出到另一个文件中,—>文件的拷贝

public static void main(String[] args) {
		//FileOutputStream(String name)
		//FileOutputStream(String name,boolean append)  true追加,false不追加(默认)内容拼接
		//FileOutputStream(File file,boolean append) 
		OutputStream os=null;//方便运行完关闭
		try {
			//1.选择流
			os=new FileOutputStream("D:/hehe.txt",true); //文件不存在,系统会自动帮我们创建,但是文件夹不会
			//2.准备数据
			String str="今天晚上要吃螃蟹..."; 
			byte[] car=str.getBytes();
			//3.写出 void write(byte[] b)  
			os.write(car);
			//4.刷出
			os.flush();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			//5.关闭
			try {//预防空指针异常
				if(os!=null){
					os.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

文件拷贝:

  • 数据从文件中读入到程序中,写出到文件中
  • 文件—>-----程序----->-------文件中
public static void main(String[] args) {
		//1.选择流
		InputStream is=null;
		OutputStream os=null;
		
		try{
			is = new FileInputStream("D:/hehe.txt");
			os = new FileOutputStream("E:hehe.txt"); 
			//2.读入.写出
			byte[] car=new byte[1024];
			int len=-1;
			while((len=is.read(car))!=-1){
				os.write(car,0,len);
			}
			//3.刷出
			os.flush();
		}catch(FileNotFoundException e){
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			//4.关闭
			//后打开的先关闭
			try {
				if(os!=null){
					os.close();
				}
				if(is!=null){
					is.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

io: 上传下载,写入写出…
File 类 文件和目录路径名的抽象表示形式。
能够定义真实存在的路径|文件,不在的也可以定义,所以抽象表现形式

public static void main(String[] args) throws IOException {
		//File(String pathname) 
		File file =new File("D:/test.txt");  //转义字符从\开始  所以在表示路径字符串中使用\\或者/表示
		System.out.println(file);
		
		//File(String parent, String child) 
		File file1 =new File("D:/AAA/haha.txt");  
		File file2 =new File("D:/AAA/","haha.txt");  
		System.out.println(file1);
		System.out.println(file2);
		File file3 =new File("D:/");  
		File file4 =new File(file3,"test.txt");  
		System.out.println(file3);
		System.out.println(file4);
		
		// boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 
		System.out.println("canWrite()"+file.canWrite());
		//setReadOnly()
		System.out.println("setReadOnly()"+file.setReadOnly());
		System.out.println("canWrite()"+file.canWrite());
		
		/*
		 * boolean mkdir() 
		          创建此抽象路径名指定的目录。 
		   boolean mkdirs() 
		          创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 
		 */
		/*
		 * String getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。 
 		   File getParentFile()  
		 */
		System.out.println("mkdir()"+file1.getParentFile().mkdir());
		//boolean createNewFile()  
		System.out.println("createNewFile()"+file1.createNewFile());
		// boolean delete() 删除此抽象路径名表示的文件或目录。 
		System.out.println("delete()"+file1.delete());
		// boolean exists() 测试此抽象路径名表示的文件或目录是否存在。 
		System.out.println("exists()"+file1.exists());
		/*
		 * File getAbsoluteFile() 
		          返回此抽象路径名的绝对路径名形式。 
		   String getAbsolutePath() 
		          返回此抽象路径名的绝对路径名字符串。 
		 */
		System.out.println("getAbsolutePath()"+file1.getAbsolutePath());
		
		//long getFreeSpace()  返回此抽象路径名指定的分区中未分配的字节数。 
		System.out.println("getFreeSpace()"+file3.getFreeSpace());
		
		// String getName()  返回由此抽象路径名表示的文件或目录的名称。 
		System.out.println("getName()"+file1.getName());
		/*
		 *  boolean isAbsolute()  测试此抽象路径名是否为绝对路径名。 
		 	boolean isDirectory()    测试此抽象路径名表示的文件是否是一个目录。 
		 	boolean isFile() 	
		 */
		System.out.println("isAbsolute()"+file1.isAbsolute());
		file1.createNewFile();
		System.out.println("isFile()"+file1.isFile()); //找路径下真实文件判断
		//long lastModified()  
		System.out.println("lastModified()"+new SimpleDateFormat().format(new Date(file.lastModified())));
	
		//File[] listFiles()  
		// String[] list() 
		System.out.println(Arrays.toString(new File("D:/code").listFiles()));
		
		/*
		 *  boolean renameTo(File dest)   重新命名 
		 *  	不能做跨盘符的文件重新命名
		 */
		File src=new File("D:/AAA");
		System.out.println("renameTo()"+src.renameTo(new File("D:/BBB")));
	}

文件拷贝封装类

//静态方法
	public static void copyFile(String src,String dest){
		copyFile(new File(src),new File(dest));
	}
	//重载方法,代码功能型更强,更灵活,更完善
	public static void copyFile(File src,File dest){
		//1.选择流  先声明:关闭资源的时候,变量is,os作用域的问题
		InputStream is=null;
		OutputStream os=null;
		//处理相同|功能的代码,可能会出现异常的放在一个try中
		try{
			is = new FileInputStream(src);
			os = new FileOutputStream(dest); 
			//2.读入.写出
			byte[] car=new byte[1024]; //一般为1024整数倍,1024进制的
			int len=-1;//len中的数据是读取到字节数组中数据的个数,作用用来控制循环结束
			while((len=is.read(car))!=-1){
				os.write(car,0,len); //写出到文件中的内容就是读取进行的内容
			}
			//3.刷出
			os.flush();
		}catch(FileNotFoundException e){
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			//4.关闭
			//后打开的先关闭
			try {
				if(os!=null){
					os.close();
				}
				if(is!=null){
					is.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

拷贝文件夹

public static void main(String[] args) {
		String src="D:/BBB";
		String dest="E:/";
		copyDir(src,dest);
	}
	
	public static void copyDir(String src,String dest){
		File srcFile=new File(src);  //D:/BBB
		File destFile=new File(dest,srcFile.getName());//E:/BBB
		copyDetails(srcFile,destFile);
		System.out.println(srcFile);
		System.out.println(destFile);
	}
	//实现拷贝细节的方法
	public static void copyDetails(File src,File dest){
		if(src.isFile()){
			if(!dest.getParentFile().exists()){
				//如果目的地路径不存在,需要创建
				dest.getParentFile().mkdirs();
			}
			CopyUtils.copyFile(src, dest);//***前面封装的文件拷贝静态方法
		}else{
			//如果是文件夹,先创建文件夹
			dest.mkdirs();
			//遍历原文件夹中的内容,如果是文件拷贝,如果是文件夹,创建,遍历...
			File[] files=src.listFiles();
			for(File srcFile:files){
				System.out.println(srcFile);
				copyDetails(srcFile,new File(dest,srcFile.getName()));
			}
		}
	}
  • 字符流: 只能操作纯文本…
  • 节点流:
  • 字符输入流: Reader 读取字符流的抽象类。
  • FileReader 用来读取字符文件的便捷类。
  • 字符输出流: Writer 写入字符流的抽象类
  • FileWriter用来写入字符文件的便捷类。
public static void main(String[] args) {
		//FileReader(String fileName) 
		Reader rd=null;
		try {
			//1.选择流
			rd=new FileReader("D:/hehe.txt");
			//2.读入
			//int read() 读取单个字符。 
			/*System.out.println((char)rd.read());
			System.out.println((char)rd.read());
			System.out.println((char)rd.read());
			System.out.println((char)rd.read());*/
			int len=-1;  //存储读到的数据  如果为-1,证明已达到末尾
			/*while(-1!=(len=rd.read())){
				System.out.println((char)len);
			}*/  
			
			// int read(char[] cbuf)  将字符读入数组。
			char[] car=new char[1024];
			while((len=rd.read(car))!=-1){
				System.out.println(new String(car,0,len));
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			if(rd!=null){
				try {
					rd.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}

字符输出流: Writer 写入字符流的抽象类
FileWriter用来写入字符文件的便捷类。

public static void main(String[] args) {
		//FileWriter(File file)    //默认不追加
		//FileWriter(File file, boolean append)true追加false不追加  
		//FileWriter(String file)  
		//FileWriter(String file, boolean append)true追加false不追加  
		Writer rt=null;
		try {
			//1.选择流 
			rt=new FileWriter("D:/houhou.txt",true);
			//2.写出
			/*
			 *   void write(char[] cbuf) 
				          写入字符数组。 
				 abstract  void write(char[] cbuf, int off, int len) 
				          写入字符数组的某一部分。 
				 void write(int c) 
				          写入单个字符。 
				 void write(String str) 
				          写入字符串。 
				 void write(String str, int off, int len) 
				          写入字符串的某一部分。 
			 */
			rt.write(97);
			rt.write("\r\n");  //换行
			rt.write("你真好看!!!!");
			rt.write("\r\n");
			rt.write("你真好看!!!!",2,2);
			rt.write("\r\n");
			char[] ch={'上','海','尚','学','堂'};
			rt.write(ch);
			rt.write("\r\n");
			rt.write(ch,2,3);
			//3.刷出
			rt.flush();
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			//4.关闭
			if(null!=rt){
				try {
					rt.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}

功能流(节点流):

缓冲流: 增强功能,提高性能,加快读写效率…

字节流:

  • BufferedInputStream 字节输入流缓冲流
  • BufferedOutputStream 字节输出流缓冲流
  • 没有新增方法,可以发生多态使用

字符流:

  • BufferedReader 字符输入流缓冲流
  • BufferedWriter 字符输出流缓冲流
public static void main(String[] args) throws IOException {
		//1.选择流
		//BufferedInputStream(InputStream in) 
		InputStream is=new BufferedInputStream(new FileInputStream("D:/hehe.txt"));
		OutputStream os=new BufferedOutputStream(new FileOutputStream("E:/hengheng.txt") );
		//2.读写
		byte[] car=new byte[1024];
		int len=-1;
		while((len=is.read(car))!=-1){
			os.write(car,0,len);
		}
		//3.刷出
		os.flush();
		//4.关闭
		os.close();
		is.close();
	}

字符流:

BufferedReader 字符输入流缓冲流

  • 新增方法:String readLine() 读取一个文本行。
  • BufferedWriter 字符输出流缓冲流
  • 新增方法:void newLine() 写入一个行分隔符。
public static void main(String[] args) throws IOException {
		//1.选择流  导包快捷键: ctrl+shift+o
		BufferedReader br=new BufferedReader(new FileReader("D:/hehe.txt"));
		BufferedWriter bw=new BufferedWriter(new FileWriter("D:/ccc.txt"));
		//2.读写
		String msg=null;
		while((msg=br.readLine())!=null){
			bw.write(msg);
			bw.newLine();
		}
		//3.刷出
		bw.flush();
		//4.关闭
		bw.close();
		br.close();
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值