java i/o流

本文深入解析IO流的概念,包括输入流、输出流、字节流、字符流及其分类,探讨装饰设计模式下的节点流与处理流,并提供代码示例,演示文件的创建、读取与写入过程。

1. IO流的分类:

按流向分类:输入流、输出流
按操作对象分类: 字节流、字符流
按功能分类: 节点流、处理流

IO流的设计模式为装饰设计模式;
节点流为最“原生态”的流,实现了流的基本功能,需待操作的数据创建对象,如File(文件)、Byte[](字节数组)、Char[](字符数组)等
处理流包装节点流,增强其功能(如处理编码问题防止乱码、使用缓冲流增强传输效率等),其处理的是节点流,所以需用节点流对象创建处理流对象

IO 流对象继承关系
在这里插入图片描述
其他常用与流有关的对象:
在这里插入图片描述

2.字节流和字符流:

IO 的体系。所具备的基本功能就有两个:读 和 写。
1,字节流
InputStream(读),OutputStream(写)。
2,字符流:
Reader(读),Writer(写)。
基本的读写操作方式:
因为数据通常都以文件形式存在。
所以就要找到 IO 体系中可以用于操作文件的流对象。
通过名称可以更容易获取该对象。
因为 IO 体系中的子类名后缀绝大部分是父类名称。而前缀都是体现子类功能的名字。
字节流和字符流的区别
1,字节流读取的时候,读到一个字节就返回一个字节。
字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8
码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。
2,字节流可以处理所有类型数据,如图片,mp3,avi。
而字符流只能处理字符数据。
结论: 只要是处理纯文本数据,就要优先考虑使用字符流。除此之外都用字节流。

3.常用IO流:

分类
字节流

InputStream

    FileInputStream 文件流  能处理二进制文件也能处理文本

    BufferedInputStream缓冲流  能处理二进制文件也能处理文本

            BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file1))

OutputStream

    FileOutputStream  文件流  能处理二进制文件也能处理文本

    BufferedOutputStream  缓冲流  能处理二进制文件也能处理文本

          BufferedOutputStream bis=new BufferedOutputStream(new FileOutputStream(file2))

    PrintStream

字符流

Reader

    FileReader文件流  只能处理文本文件

    BufferedReader 缓冲流  只能处理文本文件

            BufferedReader br=new BufferedReader(new FileReader(name))

            readLine()方法

Writer

    FileWriter 文件流  只能处理文本文件

    BufferedWriter 缓冲流  只能处理文本文件

    PrintWriter  只能处理文本文件

            PrintWriter pw=new PrintWriter(name)

            println()方法

转换流(字节到字符)(构造方法第二个参数编码)

InputStreamReader  将InputStream转化为Reader

OutputStreamWriter  OutputStream转化为Writer

二级制处理流

DataInputStream

DataOutputStresam

4.几个代码

1

package cn.filedemo;

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


public class FileDemo {
//1.创建文件用自己的FileDemo对象方法判断file
	public void create(File file){
		if (!file.exists()) {
			try {
				file.createNewFile();
				System.out.println("文件已创建");
			} catch (IOException e) {
				
				e.printStackTrace();
			}
			
		}
	
	}
	//2.查看文件相关信息
	public void showFileInfo(File file){
		if(file.exists()){
			//如果文件不存在,则查看其信息
			if(file.isFile()){
				//是文件
				System.out.println("该文件名:"+file.getName());
				System.out.println("相对路径:"+file.getPath());
				System.out.println("绝对路径:"+file.getAbsolutePath());
				System.out.println("文件大小"+file.length()+"字节");
				
			}
			
			if(file.isDirectory()){
				System.out.println("次文件是目录");
			}
				
		}else {
			System.out.println("文件不存在");
		}
	}
//	输出的信息:	
	//	该文件名:test.txt
	//	相对路径:d:\临时\test.txt
	//	绝对路径:d:\临时\test.txt
	//	文件大小1字节
	
	
// 1.2 默认就是当前Java的地方
	/*
	 * File file=new File("test.txt");
	 *			该文件名:test.txt
	 *			相对路径:test.txt
	 *			绝对路径:D:\java\java\07.IO流\test.txt
	 *			文件大小0字节
	 *
	 */
	
//	删除文件
	public void delete(File file2){
		if (file2.exists()) {
			file2.delete();
			System.out.println("文件已删除!");
			
		}
		
	}
	
	
	
	public static void main(String[] args) {
		FileDemo fileDemo= new FileDemo();
		File file=new File("d:\\临时\\test.txt");
		//fileDemo.create(file);//创建文件
		fileDemo.showFileInfo(file);//查看文件相关信息
		File file2=new File("D:\\java\\java\\07.IO流\\test.txt");
		fileDemo.delete(file2);//删除文件
		
	}
	
	
}

2

package cn.InputStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

//读取文件D:\临时\test.txt中的内容
public class FileInputStreamDemo {
	public static void main(String[] args) {
		FileInputStream fis = null;

		try {
			// 输入流FileIputStream
			fis = new FileInputStream("d:\\临时\\test.txt");
			try {
				//可以读到的字节数
				System.out.println(fis.available());
				
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			//(1)借助输入流的read()方法去读
//			int data;

//			try {
//				while ((data=fis.read())!= -1) {
//					System.out.print((char)data);
//
//				}
				
				
//		} catch (IOException e) {
//				e.printStackTrace();
//			}
			
		//(2)借助输入流read(byte[])去读
			byte[]b = new byte[1024];//建议放File.available();
			
			int data;
			try {
				data=fis.read(b);
					for (int i = 0; i < data; i++) {
						
						System.out.print((char)b[i]);
					}
					
				
			} catch (IOException e) {
				
				e.printStackTrace();
			}
			
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				//关闭输入流
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}

	}

}

3

package cn.outputstream;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamTest {
        public static void main(String[] args) {
        	File file=new File("D:\\临时\\hello.txt");
        	FileOutputStream fileout=null;
        	
        try {
			 fileout=new FileOutputStream(file);
			String str="好好学习Java";
			//将字符串打撒成一个字节数组
			byte[] words =str.getBytes();
			try {
				fileout.write(words, 0, words.length);//从0开始写
				System.out.println("hello文件已被更新!");
			} catch (IOException e) {
				e.printStackTrace();
				
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}finally{
			try {
				fileout.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
        
        	
        	
}
}

4

package com.cmy.character;
//字符输入
import java.io.FileReader;
public class ReaderTest {
   public static void main(String[] args) throws Exception {
	  FileReader reader=new FileReader("file/强哥.txt");
	  
	  StringBuilder sb=new StringBuilder();
	  
	  char chars[]=new char[1024];//每次缓冲1024个字符
	  
	  int data=0;
	  
	  while((data=reader.read(chars))!=-1){
	       String str=new String(chars);
	       sb.append(str);
	  } 
	  System.out.println(sb);
	  
	  reader.close();
   }
}

5

package com.cmy.character;

import java.io.FileWriter;
import java.io.IOException;
public class WriterTest {
   public static void main(String[] args) throws IOException {
	  FileWriter fw=new FileWriter("file/强哥.txt");
	   
	  String str="我叫上山间的风";
	  
	  fw.write(str);
	  
	  fw.close();
   }
}

6

package com.cmy.buffered;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class ReaderTest {
   public static void main(String[] args) throws Exception {
	   //无需用户手动声明缓冲区数组,在BufferedXXX中自带缓冲区
	   BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("file/强哥.txt")));
	   
	   //按照行的终止符:换行符
	   String readLine = br.readLine();
	   
	   System.out.println(readLine);
   }
}

7

package com.cmy.buffered;

import java.io.FileOutputStream;
import java.io.PrintWriter;

public class WriterTest {
   public static void main(String[] args) throws Exception {
	   PrintWriter pw=new PrintWriter(new FileOutputStream("file/强哥.txt"));
	   
	   pw.println("我叫强哥");
	   pw.println("我叫程程");
	   
	   pw.flush();//强制刷新缓冲区中的字符或字节
	   pw.close();
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值