Java输入输出流

介绍的了Java中常见的输入输出流

前言

文件                         文件

内存        程序          内存

键盘                         控制台

I/O的层次

在整个java.io中,最重要的就是五大类和一个接口,这五大类分别是File,Reader,Writer,InputStream,OutStream和接口Serializable

各个类主要作用:

1:File(文件管理):主要是处理文件的,不参与文件流的输入与输出,比如创建文件,删除文件,确定文件名,确定路径等.

2:Reader(文件格式操作):抽象类,基于字符的输入操作

3:Writer(文件格式操作):抽象类,基于字符的输出操作

4:InputStream(二进制格式操作):抽象类,基于字节的输入操作,拥有所有输入流的特征

5:OutputStream(二进制格式操作):抽象类,基于字节的输出操作,拥有所有输出流的特征

文件:

相关记录或放在一起的数据的集合

如何访问文件属性:

JAVA API  java.io.File

一、File类

方法名称

说明

boolean exists( )

判断文件或目录是否存在

boolean isFile( )

判断是否是文件

boolean isDirectory( )

判断是否是目录

String getPath( )

返回此对象表示的文件的相对路径名

String getAbsolutePath( )

返回此对象表示的文件的绝对路径名

String getName( )

返回此对象表示的文件或目录的名称

boolean delete( )

删除此对象指定的文件或目录

boolean createNewFile( )

创建名称的空文件,不创建文件夹

long  length()

返回文件的长度,单位为字节, 如果文件不存在,则返回 0L

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

public class FileDemo {

	public static void main(String[] args) {
		//创建File的对象
		File file1=new File("F:\\newdemo.txt");

		//查询api里面file类里面的方法对文件属性进行操作
		boolean result=file1.exists();
		System.out.println("文件存在: "+result);
		
		//获取路径
		String path=file1.getPath();
		System.out.println("file1对象指向的文件路径是:"+path);
		//获取绝对路径
		String path1=file1.getAbsolutePath();
		System.out.println("file1对象指向的文件绝对路径是:"+path1);
		
		//创建新的空文件 
		File file2=new File("test.txt");
		File file3=new File("F:\\a");
		File file4=new File("F:\\mm\\fds\\asd");
		try {
			boolean result2=file2.createNewFile();
			boolean result3=file3.mkdir();
			System.out.println("file2对象指向的文件创建成功 "+result2);//已经创建成功不能在创建
			System.out.println("file3对象创建的是否为目录: "+file3.isDirectory());//判断是否是目录
			System.out.println("file3对象创建的目录成功: "+result3);
			//mkdirs
			boolean result4=file4.mkdirs();
			System.out.println("file4对象创建的目录成功: "+result4);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		System.out.println("file2对象创建的文件相对路径为: "+file2.getPath()); 
		System.out.println("file2对象创建的文件绝对路径为: "+file2.getAbsolutePath());
		
		//删除指定的文件
		System.out.println("file2对象创建的文件删除成功: "+file2.delete());	
		System.out.println("file3对象创建的文件删除成功: "+file3.delete());	
		file4.delete();
		
		//获取文件的长度
		long changDU=file1.length();
		System.out.println("file1对象创建的文件长度为: "+changDU);	
	}

}

运行结果:

文件存在: true
file1对象指向的文件路径是:F:\newdemo.txt
file1对象指向的文件绝对路径是:F:\newdemo.txt
file2对象指向的文件创建成功 true
file3对象创建的是否为目录: true
file3对象创建的目录成功: true
file4对象创建的目录成功: true
file2对象创建的文件相对路径为: test.txt
file2对象创建的文件绝对路径为: F:\Java课程\java高级特性\Demo0705输入输出流\test.txt
file2对象创建的文件删除成功: true
file3对象创建的文件删除成功: true
file1对象创建的文件长度为: 25

二、输入/输出流与数据源

按照流向区分:输出流---OutputStream和Writer作为基类

     输入流---inputStream和Reader作业基类

输入和输出是按照计算机内存来说的

按照处理数据单元划分:字节流:字节流输入流InputStream基类

    字节输出流OutputStream基类

 字符流:字符输入流Reader基类

    字符输出流Write基类

字节流是8位通用的字节流,字符流是16位的Unico字符流

InputStream类

void close();

int read();//从输入流中读取下一个字节

int read(byte[] b);//从输入流中输入一定的字节,并将其存储在缓冲区数组b中

int read(byte[] b,int off,int len);

 

FileInputStream(InputStream子类)

常用构造方法:

FileInputStream(File file)

FileInputStream(String name)

ObjectInputStream(InputStream子类)//ObjectInputStream 对以前使用     ObjectOutputStream 写入的基本数据和对象进行反序列化。

代码如下(示例):

		
		import java.io.File;
		import java.io.FileInputStream;
		import java.io.FileNotFoundException;
		import java.io.IOException;
		import java.io.InputStream;
		
		public class FileInputStreamDemo {
		
			public static void main(String[] args) {
				//创建File的对象
				File file=new File("F:\\newdemo.txt");
				FileInputStream fis = null;
				//读取数据流
				try {
					fis=new FileInputStream(file);//因为InputStream是一个抽象类,抽象类不能实例化,所以其子类创建对
				/*	int num1=fis.read();
					char ch1=(char)num1;
					System.out.println(ch1);
					int num2=fis.read();
					char ch2=(char)num2;
					System.out.println(ch2);*/
					int num;
					while((num=fis.read())!=-1){//注意,不能在下面写fis.read()方法
						char ch = (char)num;
						System.out.print(ch);
					}
					
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}finally{
					try {
						fis.close();//关闭文件流
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
					
				
			}
		
		}

 

OutputStream类

OutputStream类常用方法

void write(int c)

void write(byte[] buf)

void write(byte[] b,int off,int len)

void close()

void flush():强制把缓冲区的数据写到输出流中

FileOutputStream(OutputStream子类)

常用的构造方法

FileOutputStream (File file)

FileOutputStream(String name)        

FileOutputStream(String name,boolean append)

注意:OutputStream在创建对象时如果文件中没有该文件,会自动创建一个文件

代码如下(示例):

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

public class FileOutputStreamDemo01 {

	public static void main(String[] args) {
		//创建OutputStream类对象指向FileOutputStream类对象
		OutputStream os=null;
		try {			
			/*
			 * 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
			 * 如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。
			 */
			 os=new FileOutputStream("F:\\newdemo.txt",true);
			//将数据写入到自定义的文件中
			os.write(65);//返回的是空值,不需要变量接受
			System.out.println("数据传入完毕");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

Reader类

InpoutStreamReader(Reader子类),可以按照指定编码格式读取数据

构造方法:

InpoutStreamReader(InputStream is)

InpoutStreamReader(InputStream is ,String charset name)

FileReader(InputStreamReader的子类)

构造方法:

FileReader(File file)

FileReader(String fileName)//在给定情况下创建一个新的FileReader

BufferedReader(Reader子类)

这个类可以高效率的一行一行的读取数据

readLine()方法:一行一行读取数据

 

Writer类

OutputStreamWriter(Writer子类)

构造方法:

OutputStreamWriter(OutputStream os)

OutputStreamWriter(OutputStream out, String charsetName) //创建使用指定的字符集

FileWriter(OutputStreamWriter子类)

构造方法:

FileWriter(File file)

FileWriter(File file,boolean append)//根据给定的File对象构造一个FileWriter对象

BufferedWriter(Writer的子类)

构造方法:

BufferedWriter(Writer w)

 

DateInputStream和DateOutputStream文件读写二进制文件

DateInputStream和DataOutputStream是FilterInputStream和FilterOutputStream的子类

		//可以实现文件的复制,采用边输入边输入的模式
		import java.io.DataOutputStream;
		import java.io.FileInputStream;
		import java.io.DataInputStream;
		import java.io.FileNotFoundException;
		import java.io.FileOutputStream;
		import java.io.IOException;
		
		public class DateOutputStreamAndDateIntputStreamDemo {
		
			public static void main(String[] args) {
				// 边读取边操作
				DataInputStream dis=null;
				DataOutputStream dos=null;
				try {
					dis=new DataInputStream(new FileInputStream("F://lol图片.webp"));
					dos=new DataOutputStream(new FileOutputStream("F://copflol图片.webp"));
					int num;
					while((num=dis.read())!=-1){//读取输入流
						dos.write(num);//将指定字节写入基础输出流
					}
					System.out.println("读写成功!");
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}finally{
					try {
						dis.close();
						dos.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}	
			}
		}

序列化流和反序列化流

序列化指的是将对象的状态写入特定流中的工程:

		import java.io.FileNotFoundException;
		import java.io.FileOutputStream;
		import java.io.IOException;
		import java.io.ObjectOutputStream;
		
		public class ObjectOutputStreamDemo01 {
		
			/**
			 * 实现对象的序列化
			 */
			public static void main(String[] args) {
				ObjectOutputStream ois=null;
				try {
					ois=new ObjectOutputStream(new FileOutputStream("F://demo.txt"));
					Student stu=new Student("小明",18);
					ois.writeObject(stu);
					System.out.println("对象写入完毕");
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}finally{
					try {
						ois.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
		
			}
		
		}

 反序列化就是从特定的流中获取数据重新构建对象的过程:

		import java.io.FileInputStream;
		import java.io.FileNotFoundException;
		import java.io.IOException;
		import java.io.ObjectInputStream;
		
		/*
		 * 实现特定的流到重新构建数据形成新的对象
		 * 反序列化
		 */
		
		public class ObjectInputStreamDemo01 {
		
			public static void main(String[] args) {
				
				try {
					ObjectInputStream ois=new ObjectInputStream(new FileInputStream("F://demo.txt"));
					Object object=ois.readObject();
					Student	stu=(Student)object;
					System.out.println(stu.getAge());
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		
		}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值