IO总结

File类的知识

public static void main(String[] args) throws IOException
	{
		//以当前路径创建一个file对象
		File  file = new File("C:\\Users\\G410\\eclipse-workspace\\javase");
		//直接获取文件名输出一点
		System.out.println(file.getName());
		//获取相对路径的父路径可能出错, 下面代码输出 null
		System.out.println(file.getParent());
		//获取绝对路径
		System.out.println(file.getAbsoluteFile());
		//获取绝对路径
		System.out.println(file.getAbsolutePath());
		//以当前时间作为新文件名来创建文件
		File newfile = new File(System.currentTimeMillis()+"");
		System.out.println("newfile对象是否已经存在"+newfile.exists());
		//以指定的newfile对象来创建一个文件
		newfile.createNewFile();
		//文件创建完成后返回true
		System.out.println("newfile对象是否已经存在"+newfile.exists());
		//mkdir方法返回false 无法创建newfile目录
		System.out.println(newfile.mkdir());
		//使用list方法列出当前路径下所有的文件和路径
		String[] filelist = file.list();
		System.out.println("=====当前目录下所有文件和路径如下========");
		for(String filename:filelist)
		{
			System.out.println(filename);
		}
		//列出C:\Users\G410\eclipse-workspace\javase下所有磁盘的根路径
		File[] roots = File.listRoots();
		System.out.println("======所有磁盘根路径=====");
		for(File f:roots)
		{
			System.out.println(f);
		}
		//列出file下所有子文件
		System.out.println("======列出C:\\Users\\G410\\eclipse-workspace\\javase下下所有子文件=====");
		File[] filelis=file.listFiles();
		for(File fi:filelis)
		{
			System.out.println(fi);
		}
	}

输出

javase
C:\Users\G410\eclipse-workspace
C:\Users\G410\eclipse-workspace\javase
C:\Users\G410\eclipse-workspace\javase
newfile对象是否已经存在false
newfile对象是否已经存在true
false
=====当前目录下所有文件和路径如下========
.classpath
.project
.settings
1520311111063
1520311120680
1520311238677
1520311446642
1520311507031
1520311673879
1520311681120
1520311804875
1520322187481
bin
src
======所有磁盘根路径=====
C:\
D:\
E:\
F:\
G:\
======列出C:\Users\G410\eclipse-workspace\javase下下所有子文件=====
C:\Users\G410\eclipse-workspace\javase\.classpath
C:\Users\G410\eclipse-workspace\javase\.project
C:\Users\G410\eclipse-workspace\javase\.settings
C:\Users\G410\eclipse-workspace\javase\1520311111063
C:\Users\G410\eclipse-workspace\javase\1520311120680
C:\Users\G410\eclipse-workspace\javase\1520311238677
C:\Users\G410\eclipse-workspace\javase\1520311446642
C:\Users\G410\eclipse-workspace\javase\1520311507031
C:\Users\G410\eclipse-workspace\javase\1520311673879
C:\Users\G410\eclipse-workspace\javase\1520311681120
C:\Users\G410\eclipse-workspace\javase\1520311804875
C:\Users\G410\eclipse-workspace\javase\1520322187481
C:\Users\G410\eclipse-workspace\javase\bin
C:\Users\G410\eclipse-workspace\javase\src

文件过滤器的使用

匿名内部类写法

public class FileFilter {
	public static void main(String[] args)
	{
		File file = new File("C:\\Users\\G410\\eclipse-workspace\\javase");	
		//匿名内部类中写文件过滤规则
		String[] nameList = file.list(new FilenameFilter() {

			@Override
			public boolean accept(File dir, String name) {
				
				return name.endsWith(".java")||new File(name).isDirectory();
			}
			
		});
		
		for(String name:nameList)
		{
			System.out.println(name);
		}
		
	}
}

lambda写法

public class FileFilter {
	public static void main(String[] args)
	{
		File file = new File("C:\\Users\\G410\\eclipse-workspace\\javase");	
		//直接写过滤规则
		String[] nameList = file.list((dir,name)->name.endsWith(".java")|| new File(name).isDirectory());
		
		for(String name:nameList)
		{
			System.out.println(name);
		}
		
	}
}

输出结果

.settings
bin
src
IO流

InputStrem 和reader 是所有输入流的模板他们是接口 

 int read()从输入流中读取单个字节返回读取的字节数据
 int read(byte[] b) 从输入流中最多读取b.length个字节,并将其储存在b中返回实际读取的字节数
  int resd(byte[] b,int off,int len)从输入流最多读取len个字节的数据并将其存储在b中并不是从数组起点开始而是从off位置开始返回实际读取的字节数组
 

 * Reader也有类似的方法

创建测试文件 


内容

FileInputStream 是InputStream的实现类

测试FileInputStream

        @Test
	public void fileInputStreamtest()  {
		//创建流
		try(FileInputStream fis = new FileInputStream("src//test111//test"))
		{
			//存储从流中读取的值
			byte[] temp=new byte[1024];
			int len;
			while((len=fis.read(temp))>0)//len为读出长度如果<0则读取完毕
			{
				System.out.println(new String(temp,0,len));//输出读取内容
			}
		
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		
	} 

输出

字符流 FileReader 是Readerd的实现类

测试FileReader

 

//测试字符流
	@Test
	public void FileReader()
	{
		try(FileReader r = new FileReader("src//test111//test");)
		{
			char[] temp = new char[1024];
			int len;
			while((len=r.read(temp))>0)
			{
				System.out.println(new String(temp,0,len));
			}
		}
		catch (Exception e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	
		
		
	} 

输出:

outputStream和writer是输出流接口

方法

             void write(int c) 将指定字节/字符数组中的数据输出到指定输出流中
     void  write(byte[]/char[] buf)将字节数组/字符数组中的数据输出到指定流中

     void writer(byte[]/char[] buf,int off,int len)

FileOutputStream和FileWriter是他们的实现类

测试FileOutputStream

//将tes1.java中内容写入到test中
	@Test
	public void fileoutputStream()
	{
		try(
				FileInputStream fis = new FileInputStream("src//test111//test1.java");	
				FileOutputStream fos = new FileOutputStream("src//test111//test");
		   )
		   {
				int len;
				byte[] temp = new byte[1024];
				while((len=fis.read(temp))>0)
				{
					fos.write(temp,0,len);
				}
			
		   } 
			catch (Exception e) {
		
				e.printStackTrace();
		   } 
		
	}

运行后test中内容变为


转换流

将键盘输入的字节流转化为字符流打印到控制台如果读取到exit 则退出程序

	//转换流
	@Test
	public void InputStreamReader()
	{
		//字节流转字符流
		InputStreamReader isr = new InputStreamReader(System.in);
		//再次包装为缓冲流这样流的功能更加强大可以用整行读取的方法  readline()
		BufferedReader   br = new BufferedReader(isr);
		String line=null;
		try {
			while((line=br.readLine())!=null)
			{
				System.out.println(line);
				if(line.equals("exit"))
				{
					System.out.println("退出");
					System.exit(1);
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

运行结果


对象序列化

Serialize 指将一个对象写入IO流    反序列化(Deserialize)从IO中恢复对象  

如果一个实现Serializable 接口的类 的Field是另一个引用类型而这个引用类型没有实现Serlalizable 则这个类变得不可不可序列化

如果多个对象引用同一个对象序列化时那个对象只被序列化一次   有一个序列化算法给每个每个对象一个序列化编号防止重复

对象序列化测试

新建一个待序列化的类要实现Serializable接口

public class test1 implements Serializable{
	int value;
	String string;
	
	public test1(int value, String string) {
		System.out.println("构造器启动");
		this.value = value;
		this.string = string;
	}

	@count
	public void fun1() {}
		
	public void fun2() {}
	@count
	public void fun3() {}
	public void fun4() {}
}

测试

@Test
	public void ObjectInputStream()
	{
	
		try (	ObjectOutputStream  oos = new ObjectOutputStream(new FileOutputStream("src//test111//test"));
				ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src//test111//test"));
			)
			{
				test1  obj= new test1(1,"对象1"); 
				oos.writeObject(obj);
				System.out.println("写入完成读出对象");
				test1  obj1=(test1) ois.readObject();
				System.out.println(obj1.string+"	"+obj1.value);
			
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		
	} 

输出:

由结果可知test1对象只在new的时候调用了构造器反序列化时没有再次调用构造器

参考资料:疯狂Java讲义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值