java i/o

File类
public File(String pathname)
File类中主要的方法和常量
在这里插入图片描述
f.list() 返回该目录下的所有文件名
f.fIleList()返回该目录下所有文件的路径
显示该目录下所有的文件包括子目录
方法

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

public class demo1 {
	 public static void main(String[] args)
	 {
		 File f= new File("./");
		 printf(f);
		 
		
	 }
	 public static void printf(File file)
	 {
		 if(file!=null)
		 {
			 if(file.isDirectory())
			 {
				 File f[] =file.listFiles();
				 if(f!=null) 
				 {
					 for(int i=0;i<f.length;i++)
					{
						 printf(f[i]);
					}
				 }
			 }
			 else
			 {
				 System.out.println(file);
			 }
		 }
	 }
}

Random AccessFile类

完成随机读取功能,可以读取指定位置的内容。
在文件中所有的内容是在字节存放的,有固定的保存位置
public RandomAccessFile(File f,String mode)
创建对象时要制定要操作的文件对象和操作模式,r-read,w-write rw-read&&write
操作例子
写入内容
在这里插入图片描述
读取内容:
在这里插入图片描述

字节流和字符流

流中保存的全是字节文件
OutputStream类 抽象类
在这里插入图片描述
写入数据到文件过程
实例化File对象
实例化FileOutputStream对象并向上转型为OutputStream对象,将要写入的内容通过getBytes()方法转化为字节数组,调用OutputStream的write(Byte[] b)方法写入字节数组
最后关闭字节流
不覆盖已有文件内容添加数据到文件的方法
通过FileOutputStream的另一个构造方法
FileOutputStream(File file,boolean append) ,append设置为true则表示追加内容例如:
在这里插入图片描述

InputStream
和输出流类似,注意read(byte[] b)方法返回的是读取内容的字节个数。
可以通过File对象的length()方法获取文件内容的大小,依据这个数值来开辟接收读取内容的数组的大小空间
方法如下
在这里插入图片描述
另一种读取方式,依据是读到文件末尾时=-1,这种适用于不知道文件内容大小的情况。
在这里插入图片描述

字符流

输出流Writer
较字节流好的一点是可以直接输出字符串了,不需要再进行转换。例如:
在这里插入图片描述

输入流没啥要记的

字节流和字符流的区别

真正操作文件的是字节流
字节流直接操作文件,字符流则需要经过缓存来操作文件,根据是字符流不关闭,输出的文件不会有内容显示,只有关闭后,才会强制刷新缓冲区,才能把内容输出,当然也可以用flush强制刷新。
使用字节流好还是字符流?
在这里插入图片描述

实现将一个文件内容读取到另外一个文件,且采用边读边写的方式代码如下

import java.io.*;

public class Copy {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		if(args.length!=2)
		{
			System.out.println("输入参数不足");
			System.exit(1);
		}
		File f1= new File(args[0]);
		File f2= new File(args[1]);
		if(!f1.exists())
		{
			System.out.println("不存在源文件");
			System.exit(1);
		}
		InputStream in = new FileInputStream(f1);
		OutputStream out = new FileOutputStream(f2);
		int temp;
		while((temp=in.read())!=-1)
		{
			out.write(temp);
		}
		System.out.print("copy完成");
		out.close();
		in.close();
	}

}

字符-字节转换流

在这里插入图片描述
使用这种方式输出的话,操作的是字符流,然后通过转换成字节流输入到文件
在这里插入图片描述
输入的话则以下为例
在这里插入图片描述
在这里插入图片描述

梳理一下继承关系
在这里插入图片描述
FileWriter和FileReader中间使用了转换类

内存操作流

主要方法
在这里插入图片描述
实例:
在这里插入图片描述

内存操作对象一定是以内存为准。
重点:通过此类可以很深入的了解字节流,根据要操作的对象,生成不同的字节流的子类的实例,再通过向上转型,由于不同子类的操作方法不一样,但通过父类可以将子类不同的操作给统一化,都通过父类这个接口来完成操作,不需要关注子类是如何实现此功能的,这很重要!!!!!

管道流

线程间的通讯。

打印流

通过指定输出流类型如FileOutputStream来表示程序输出数据要到的位置
构造方法
public PrintStream(OutputSream out)
例如:
在这里插入图片描述
这个时候其实就是将FIleOutputStream的功能包装了一下。

System类对io的支持

System.out
这out是由指定输出位置为屏幕的类实例化得来的
梳理一下继承关系,OutputStream是PrintStream和FileOutputStream的 父类,
printStream有构造方法 传入OutputStream类型的对象实例化,这样可以通过对象的多态传入OutputStream的子类来指定输出的位置。
实例:
在这里插入图片描述

System.err

表示错误的标准输出
与out的区别:
在这里插入图片描述
System.in
实际上是一个键盘的输入流,本身是InputStream的对象,完成从键盘读取数据的功能。
例子
在这里插入图片描述
一个字节一个字节的读取造成中文乱码的问题。
在这里插入图片描述

输入输出重定向

重定向的方法setOut/err/in
例子:
将错误信息输出到文件
在这里插入图片描述
在这里插入图片描述

System.err向内存中输出
在这里插入图片描述
System.in重定向
将输入位置变为文件:
在这里插入图片描述
重定向一般是用Out来给用户显示信息

BufferedReader

在这里插入图片描述
这个类接收的是一个字符流对象
例子:
在这里插入图片描述

io操作实例

校验输入的数据是否是整型,不是则提示重新输入功能。
需要使用正则表达式
String.matches(规则)
在这里插入图片描述
格式化日期:

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
class Util{
	private BufferedReader buf=null;
	public Util() {
		this.buf= new BufferedReader(new InputStreamReader(System.in));
	}
	public String getInfo(String info) throws Exception
	{
		String temp = null;
		System.out.println(info);
		temp=this.buf.readLine();
		return temp;
	}
	public Date getDate(String info,String err) throws Exception
	{
		Date temp=null;
		String str=null;
		boolean flag= true;
		while(flag)
		{
			str=this.getInfo(info);
		if(str.matches("^\\d{4}-\\d{2}-\\d{2}$"))
		{
			SimpleDateFormat sdf= new SimpleDateFormat("YYYY-MM-DD");
			temp=sdf.parse(str);
	
			flag = false;
		}
		else
			
			System.out.println(err);
		}
		return temp;
			
		
	}

}
public class Demo3 {
	public static void main(String[] args) throws Exception
	{
		Util util = new Util();
		Date i=util.getDate("请输入日期","输入错误请请重新输入");
	
		System.out.println(i);
	}
}

一个提供操作说明的菜单

在这里插入图片描述

Scanner类

接收输入的数据
常用方法
在这里插入图片描述
比BufferedReader方便一些
使用时要使用useDelimiter(String pattern)来设置分隔符
将分隔符设置为\n
在这里插入图片描述
接收整数和小数
在这里插入图片描述
输入正确格式的日期例子:
在这里插入图片描述
直接操作文件数据:
在这里插入图片描述
读取文件存在一些问题,就是换行符作为读取的分隔符,即读取完一行就不读了
这时需要经过以下处理
在这里插入图片描述

数据操作类

实例:
在这里插入图片描述
输出流
在这里插入图片描述
输入流
在这里插入图片描述

合并流

将两个文件的内容合并到一个文件
在这里插入图片描述
例子
在这里插入图片描述

压缩流

先不学。。

回退流

先不学

字符编码

在这里插入图片描述
System.getProperty(“file.encoding”)查找本机编码

测试例子:
在这里插入图片描述

对象序列化

在这里插入图片描述
根据这张图后者是前者的父类,后者定义了两个方法来选择进行输出和输入对象的属性,后后者只能全部保存对象的属性。
serializable:

import java.io.*;
class Person implements Serializable{
	private String name;
	private static final long serialVersionUID=1L;
	public Person(String name,int age)
	{
		this.name= name;
		this.age=age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	private int age;
	@Override
		public String toString()
		{
		return this.name+this.age;
		}
}
public class Demo5 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub

		File f= new File("./test2");
		ObjectInputStream ois= new ObjectInputStream(new FileInputStream(f));
		Person per =(Person)ois.readObject();
		System.out.println(per);
	}

}

ExternalSerializable
接口定义:
在这里插入图片描述

实现此接口例子:
被序列化的类中必须定义一个无參构造!!!!!!
在这里插入图片描述
在这里插入图片描述

transient关键字

在序列化操作的时候,某个属性不属于被序列化,则直接用transient关键字声明

保存多个对象
例子如下:

所引用资料来自midnjava视频教程,只用学习交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值