File的使用和 IO流使用

java IO篇

JAVA File

File 类

通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。

File(File parent,String child);

通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。

File(String pathname);

  • filemethod
public class Demo_method {
	
	public static void main(String[] args) {
		//demo1();
		//demo2();
		//案例找到.txt 结尾的文件并打印
		//demo3();
		//file 类 文件名称过滤器 的使用 例子:找到.txt 结尾的文件并打印
		File dir=new File("C:\\Users\\11276\\Desktop\\dnf");
		String[] test=dir.list(new FilenameFilter() {//变成只存在.txt 的数组
			
			@Override
			public boolean accept(File dir, String name) {
				// TODO Auto-generated method stub
				//System.out.println(dir);
				//System.out.println(name);
				File file=new File(dir, name);
				return file.isFile()&& file.getName().endsWith(".txt");
			}
		});
		for (String string : test) {//string 中是条件成立的
			System.out.println(string);
		}
	}


	private static void demo3() {
		File findFile=new File("C:\\Users\\11276\\Desktop\\dnf");
		File [] findFileList=findFile.listFiles();
		for (File file: findFileList) {
			if(file.isFile()&&file.getName().endsWith(".txt")) {//获得名字
				System.out.println(file);
			}
		}
	}

	
	private static void demo2() {
		File file=new File("ccc.txt");
		/*
		 * System.out.println(file.exists());
		 * System.out.println(file.getAbsolutePath());//获得绝对路径
		 */	
		//getoath();获取构造方法中传入的路径
		System.out.println(file.getPath());
		//length
		System.out.println(file.length());
		//文件的最后修改时间lastModified
		Date d=new Date(file.lastModified());
		System.out.println(d);
		//public String [] list(); 获取名字
			File dir=new File("C:\\Users\\11276\\Desktop\\dnf");
			String [] list=dir.list();
			for (String string : list) {
				System.out.println(string);
			}
			//public File[] listFile(); 获取对象File
			File[] listFile=dir.listFiles();
			for (File file2 : listFile) {
				System.out.println(file2);//可以对其进行操作
			}
	}

	private static void demo1() {
		/**
		 * isDirectory//判断是否为文件夹
		 * isFile/判断是否为文件
		 * exists//是否存在
		 * canread//是否可读
		 * canwrite//是否可写
		 * isgidden//是否是隐藏
		 * 
		 * @param args
		 */
		// TODO Auto-generated method stub
		File dir1=new File("ccc.text");
		System.out.println(dir1.isDirectory());//判断是否为文件夹
		File dir2=new File("zzz");
		System.out.println(dir1.isFile());//判断是否为文件
		System.out.println(dir2.isFile());
		System.out.println(dir1.exists());//是否存在
		dir2.setReadable(false);//不可写
	}

}

  • IO流

    IO常用的子类

    字节流的抽象父类:计算机存储的是字节的格式

    inputStream:

    Fileinput Stream

    public static void main(String[] args) throws IOException {
    	//读取的方法1 read(); 返回的类型为int ,
        //不是byte :byte 可能 碰到 byte 的 -1源码
    	//demo1();
    	//读取的方法2,规范
    	FileInputStream fis=new FileInputStream("ccc.txt");
    	int b;
    	while((b=fis.read())!=-1) {//结束符为-1(读到末尾)
    		System.out.println(b);
    	}
    }
    
    private static void demo1() throws FileNotFoundException, IOException {
    	FileInputStream fis = new FileInputStream("ccc.txt");
    	int read = fis.read();
    	System.out.println(read);
    	fis.close();
    }	
    

    BuffInputStream

    #### 原理:
    

    [外链图片转存失败(img-F3I4WCZP-1563628520420)(C:\Users\11276\AppData\Local\Temp\1562654769950.png)]和小型数组的对比:

    [外链图片转存失败(img-lyIk3oNm-1563628520421)(C:\Users\11276\AppData\Local\Temp\1562654988033.png)]

    小型处理小型数据会跟快点,因为操作的是一个字节数组,而缓存是操作2个字节数组

    outputStream:

    FileoutputStream

    public static void main(String[] args) throws IOException {
    	//创建字节输出流
    	FileOutputStream fos=new FileOutputStream("yyy.txt",true);
        //续写的append
        */FileOutputStream(String name, boolean append) 
    	创建文件输出流以指定的名称写入文件。 
            /*
    	fos.write(97); //虽然写出的是int数但是会转化为byte
    	fos.write(98);
    	fos.close();
    }
    

    简单的案例

    /**
    	 * 简单的数据拷贝案例
    	 *把图片ccc复制到ddd中
    	 */
    方法1:不推荐,因为效率慢
    	FileInputStream fis=new FileInputStream("ccc.jpg");
    	FileOutputStream fos=new FileOutputStream("ddd.jpg");
    	int d;
    	while((d=fis.read())!=-1) {//判断是否存在这个图片
    		fos.write(d);
    	}
    方法2:不推荐,因为有可能内存溢出
    	available() :获得文件的字节数
    	FileInputStream fis=new FileInputStream("ccc.jpg");
    	FileOutputStream fos=new FileOutputStream("bbb.jpg");
    	byte[] arr=new byte[fis.available()];
    	fos.write(arr);
    
    	
    
    原理:

    [外链图片转存失败(img-F5N8ELTZ-1563628520422)(C:\Users\11276\AppData\Local\Temp\1562590903851.png)]

    解决方案:需要一个容器:数组

    public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    FileInputStream fis=new FileInputStream("ccc.txt");
    FileOutputStream fos=new FileOutputStream("yyy.txt");
    byte[] arr=new byte[1024];//创建字节数组
    int len;//返回值类型为int
    while((len=fis.read(arr))!=-1) {//如果不加arr,就会返回字节的码表,不是个数
    /*
     * write(byte[] b, int off, int len) 
    将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。
     */
    fos.write(arr, 0, len);
    }
    fis.close();
    fos.close();
    }
    

    读取中文(不推荐使用字符流)

    public static void main(String[] args) throws IOException {
    
    		// 读中文 ,字符流不好
    		//demo1();
    		//取中文
    		FileOutputStream fos=new FileOutputStream("ccc.txt");
    		fos.write("你好".getBytes());//转化为字节
    		fos.write("\r\n".getBytes());
    		fos.close();
    	}
    private static void demo1() throws FileNotFoundException, IOException {
    	FileInputStream fis=new FileInputStream("ccc.txt");	
    	byte[] arr=new byte[3];
    	int len;
    	while((len=fis.read(arr))!=-1) {
    		System.out.println(new String(arr,0,len));
    	}
    }
    

    1.7的IO流的标准处理异常代码

    public static void main(String[] args) throws IOException {
    		// 1.7 流的异常处理
    			try(
    				//实现的autoclose的方法,所以可以这样用
    				FileInputStream fis=new FileInputStream("ccc.txt");
    				FileOutputStream fos=new FileOutputStream("yyy.txt");
    					){
    				int d;
    				while((d=fis.read())!=-1) {
    					fos.write(d);
    				}
    			}
    		//普通的
    		FileInputStream fis=new FileInputStream("ccc.txt");
    		FileOutputStream fos=new FileOutputStream("yyy.txt");
    		int d;
    		while((d=fis.read())!=-1) {
    			fos.write(d);
    		}
    		fis.close();
    		fos.close();
    	}
    

    小练习

    练习1拷贝文件到项目文件下

    public class Test_1 {
    	/**
    	 * 拷贝文件到项目文件下
    	 * @param args
    	 * @throws IOException
    	 */
    	public static void main(String[] args) throws IOException {
    		File file=getFile();//获得File
    		BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
    		BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file.getName()));
    		int b;
    		while((b=bis.read())!=-1){
    			bos.write(b);
    		}
    		System.out.println("复制成功");
    		bis.close();
    		bos.close();
    	}
    	/**
    	 * 创建键盘录入对象
    	 * 在主方法接受文件
    	 * 读和写文件
    	 */
    	public static File getFile() {
    		Scanner sc=new Scanner(System.in);
    		System.out.println("输入名称");
    		while(true) {
    			String line=sc.nextLine();
    			File file=new File(line);//把String 封装成File 类型
    			if(!file.exists()) {
    				System.out.println("路径不存在");
    			} else if(file.isDirectory()) {
    				System.out.println("输入的是文件夹的,不正确");
    			} else {
    				return file;
    			}
    		}
    	}
    }
    

    练习2录入数据拷贝到文件

    public class Test_2 {
    	public static void main(String[] args) throws IOException {
    		/**
    		 * 练习录入数据拷贝到文件
    		 */
    		//1.创建键盘录入对象
    		Scanner sc=new Scanner(System.in);
    		//2.创建输出流对象
    		BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("ccc.txt"));
    		//进行拷贝文件
    		while(true) {
    			//接收数据
    			String  line=sc.nextLine();
    			if("quit".equals(line)) {
    				break;
    			}else {
    				bos.write(line.getBytes());
    				bos.write("\r\n".getBytes());
    			}	
    		}
    		bos.close();
    	}
    }
    

    字符流的抽象父类: (只能拷贝纯文本)

    ​ *reader 根据码表进行读字符

    Filereader

    ​ [外链图片转存失败(img-mDJDdP2T-1563628520422)(C:\Users\11276\AppData\Local\Temp\1562765574030.png)]

    public class Demo_FileReader {
    	/**
    	 * 字符流 FileReader
    	 * @param args
    	 * @throws IOException 
    	 */
    	public static void main(String[] args) throws IOException {
    		// TODO Auto-generated method stub
    		FileReader fir=new FileReader("ccc.txt");
    		int x;
    		while((x=fir.read())!=-1) {
    			System.out.print((char)x);
    		}
    	}
    }
    
    

    ​ *writer

    Filewriter

    public class FileWiter {
    
    	/*
    
    	 * 字符流
    
    	 */
    
    	public static void main(String[] args) throws IOException {
    
    		FileWriter fw=new FileWriter("ccc.txt");
    
    fw.write("大家好111");
    	
    	fw.close();
    }
    }
    

    ​ 字符流的拷贝(不推荐)

    public class FileWiter {
    
    	/*
    
    	 * 字符流
    
    	 */
    
    	public static void main(String[] args) throws IOException {
    
    		demo1();
    
    		//字符流的拷贝
    
    		FileReader fr=new FileReader("ccc.txt");
    
    		FileWriter fw=new FileWriter("zzz.txt");
    
    		int c;
    
    		while((c=fr.read())!=-1) {
    
    			fw.write(c);
    
    		}
    		fr.close();
    		fw.close();//write类中有一个2k的缓冲区,不关闭就不会显示数据
    
    	}
    
    private static void demo1() throws IOException {
    	FileWriter fw=new FileWriter("ccc.txt");
    	fw.write("大家好111");
    	fw.close();
    	
    	}
    }
    

    原因

    [外链图片转存失败(img-yqGlxdok-1563628520423)(C:\Users\11276\AppData\Local\Temp\1562846763258.png)]

[外链图片转存失败(img-ecqaZc5Q-1563628520424)(C:\Users\11276\AppData\Local\Temp\1562846986339.png)]

字符流的缓冲

​ BufferedReader

​ [外链图片转存失败(img-2sVEYsqM-1563628520425)(C:\Users\11276\AppData\Local\Temp\1562848773616.png)]

​ BufferedWriter

​ [外链图片转存失败(img-C9gx9jtw-1563628520425)(C:\Users\11276\AppData\Local\Temp\1562848810762.png)]

readLine()和newLine()

​ readLIne属于Bufferedreader,newLine属于Bufferedwriter

public static void main(String[] args) throws IOException {

		BufferedReader br=new BufferedReader(new FileReader("ccc.txt"));

		BufferedWriter bw=new BufferedWriter(new FileWriter("yyy.txt"));

		String Line;

		while((Line =br.readLine())!=null) {//包含行的内容的字符串,不包括任何行终止字符,如果已达到流的末尾,则为null 

			bw.write(Line);

			bw.newLine(); //表示\r\n 
						//可以跨平台使用
		}

		br.close();

		bw.close();

}

小练习 将文本反转

  public class Demo_test1 {
  public static void main(String[] args) throws IOException {
  	//创建流对象
  	BufferedReader br=new BufferedReader(new FileReader("ccc.txt"));
  
  	//创建集合
  	ArrayList<String> list=new ArrayList<String>();
  	//保存数据
  	String line;
  	while((line=br.readLine())!=null) {
  		list.add(line);
  		System.out.println(list.size());
  	}
  	br.close();
BufferedWriter bw=new BufferedWriter(new FileWriter("fz.txt"));
for(int i=list.size()-1;i>=0;i--) {
	System.out.println(i);
	bw.write(list.get(i));
	bw.newLine();
}
bw.close();
	}
}

BufferedReader 的子类 LIneNumberinputStream:

[外链图片转存失败(img-myozUppH-1563628520428)(C:\Users\11276\AppData\Local\Temp\1562854353768.png)]

public static void main(String[] args) throws IOException {
		LineNumberReader lnr=new LineNumberReader(new FileReader("yyy.txt"));
		String line;
		lnr.setLineNumber(4);//设置行数的开始
		while((line=lnr.readLine())!=null) {
			System.out.println(lnr.getLineNumber()+":"+line);//获得行数的值
		}
}

IO流 (装饰设计模式)

public class Demo_装饰设计模式 {

/**
- 装饰设计模式 的好处是耦合性不强
- 被修饰的类的变化和装饰类的变化无关
- @param args
  */
  public static void main(String[] args) {
  	// TODO Auto-generated method stub
  	new wengyanmin(new Student()).code();;
  	
  }
  }
  interface Coder{
  public void code();
  }
  class Student implements Coder{
  @Override
  public void code() {
  	// TODO Auto-generated method stub
  	System.out.println("javaee");
  	System.out.println("javaweb");
  }
  }
  class wengyanmin implements Coder{
  //1,获取被修饰类的引用
  public Student s;
  //2,构造方法中传入被修饰类的对象
  public  wengyanmin(Student s) {
  	this.s=s;
  }
  //3,对功能进行升级	
  @Override
  public void code() {
  	// TODO Auto-generated method stub
  	s.code();
  	System.out.println("android");
   }
}

使用指定的码表读写字符

InputStreamReaber&OutputStreamWriter字节通向字符的桥梁

使用例子:

public class Demo_InputStreamReader {

	public static void main(String[] args) throws IOException, IOException {
		//更高效的读和写
		BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("ccc.txt"),"utf-8"));
		BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("fz.txt"),"utf-8"));
		int b;
		while((b=br.read())!=-1) {
			bw.write(b);
		}
		br.close();
		bw.close();
	}
}

原理:

[外链图片转存失败(img-tg2kMfrc-1563628520429)(C:\Users\11276\AppData\Local\Temp\1562936770796.png)]

练习 :获取一个文本上的每个字符出现的次数,将结果写在times.txt上

public class Demo_test2 {
/**
 * 获取一个文本上的每个字符出现的次数,将结果写在times.txt上
 * @param args
 * @throws IOException 
 */
	public static void main(String[] args) throws IOException {
		//1创建一个输入流对象
		BufferedReader br=new BufferedReader(new FileReader("ccc.txt"));
		//创建一map集合
		HashMap<Character, Integer> map=new HashMap<>();
		//读取每一个字符
		int index;//拿到了每一个字符
		while((index=br.read())!=-1) {
			char c=(char)index;//强制转型
			map.put(c,! map.containsKey(c)? 1: map.get(c)+1);
		}
		br.close();
		//创建输出流对象
		BufferedWriter bw=new BufferedWriter(new FileWriter("times.txt"));
		//遍历集合
		for (Character string : map.keySet()) {
			bw.write(string+"="+map.get(string));//打印
			bw.newLine();
		}
		bw.close();
	}
}

####注意:

要保留一个完整的数字例如10:使用字符流, readLine();方法保留一行的数据

练习 试用版软件的体验

public class Demo_test3 {
	/**
	 * 试用版软件的体验,一共有10次使用机会
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//创建输入流对象
		BufferedReader br=new BufferedReader(new FileReader("config.txt"));
		//进行数据的转化
		String lian=br.readLine();
		int cs=Integer.parseInt(lian);
		if(cs>0) {
			System.out.println("还有使用次数"+cs--);
			FileWriter fw=new FileWriter("config.txt");
			fw.write(cs+"");
			fw.close();//要注意加,因为Filewriter 中有个小型的缓存区
		}else {
			System.out.println("请购买");
		}
		br.close();
	}
}

file递归

自己调用自己

缺点:占用内存大

优点: 不用知道循环次数

注意:构造方法不能使用递归, 不一定有返回值,可以有也可以没有v

public class Demo_递归 {
/**
 * 自己调用自己 求阶层!
 * @param args
 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int re=1;
		for(int i=1;i<=5;i++){
			re=re*i;
			System.out.println(re);
		}
		System.out.println(fun(5));
	}
	public static int fun(int i) {
		if(i==1) {
			return 1;
		}else {
			int sum=i*fun(i-1);
			return sum;
		}	
	}
}

File递归的练习

public class Demo_test4 {
/**
 * File类练习
 * 需求: 从键盘输入接收一个文件夹路径,打印出文件夹下的.java文件
 * @param args
 */
	public static void main(String[] args) {
		// 接收文件夹名称
		File FileName=getDic();
		//打印文件夹下的所以.java 文件名
		printFileName(FileName);
	}
	/**
	 * 获取文件夹的方法 getDic();
	 */
	public static File getDic() {
		Scanner sc=new Scanner(System.in);
		while(true){
			String line=sc.nextLine();//获取输入的数据
			//进行判断是否是文件夹
			File file=new File(line);
			if(!file.exists()) {
				System.out.println("文件夹不存在");
			}else if(file.isFile()) {
				System.out.println("你输入的是文件名,不是文件夹");
			}else {
				return file;
			}
		}
	} 
	/**
	 * 打印文件夹下的.java文件
	 * print Filename(File FileNamev)
	 */
	public static void printFileName(File FileName){
		File [] saveFile=FileName.listFiles();//获取文件夹,存储到数组中
		for (File file : saveFile) {//过滤器
			if(file.isFile()&&file.getName().endsWith(".txt")) {
				System.out.println(file);
			}else if(file.isDirectory()) {
				printFileName(file);//进行递归,若找到文件夹则进行继续递归 
			}	
		}
	}
}

IO序列流

什么是序列流:可以把多个字节输入流整合成一个,读取这是从第一个开始读,到最后

原理:

[外链图片转存失败(img-D5OoFTtU-1563628520430)(C:\Users\11276\AppData\Local\Temp\1563112725238.png)]

代码:

public static void main(String[] args) throws IOException {
		demo1();
		//方式2
		FileInputStream fis1=new FileInputStream("yyy.txt");
		FileInputStream fis2=new FileInputStream("ccc.txt");
		SequenceInputStream sis=new SequenceInputStream(fis1, fis2);//序列流
		FileOutputStream fos=new FileOutputStream("c.txt");
		int b;
		while((b=sis.read())!=-1) {
			fos.write(b);
		}
		sis.close();
		fos.close();
	}

	private static void demo1() throws FileNotFoundException, IOException {
		//传统方式
		FileInputStream fis1=new FileInputStream("yyy.txt");
		FileOutputStream fos=new FileOutputStream("c.txt");
		int b;
		while((b=fis1.read())!=-1) {
			fos.write(b);
		}
		fis1.close();
		FileInputStream fis2=new FileInputStream("ccc.txt");
		int c;
		while((c=fis2.read())!=-1) {
			fos.write(c);
		}
		fis2.close();
		fos.close();
	}

多个流的整合

public class Demo_SequenceInputStream {
	/**
	 * SequenceInputStream(InputStream s1,InputStream s2);
	 * 
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//demo1();
		//demo2();
		//多个序列流整合
		FileInputStream fis1=new FileInputStream("a.txt");
		FileInputStream fis2=new FileInputStream("b.txt");
		FileInputStream fis3=new FileInputStream("c.txt");
		Vector<FileInputStream> vector=new  Vector<FileInputStream>();
		vector.add(fis1);
		vector.add(fis2);
		vector.add(fis3);
		Enumeration<FileInputStream> en= vector.elements();//创建枚举,获取枚举的引用
		SequenceInputStream sis=new SequenceInputStream(en);//传递SequenceInputStream构造
		
		FileOutputStream fos=new FileOutputStream("yyy.txt");
		
		int b;
		while((b=sis.read())!=-1){
			fos.write(b);
		}
		sis.close();
		fos.close();
	}

	private static void demo2() throws FileNotFoundException, IOException {
		//序列流
		FileInputStream fis1=new FileInputStream("yyy.txt");
		FileInputStream fis2=new FileInputStream("ccc.txt");
		SequenceInputStream sis=new SequenceInputStream(fis1, fis2);
		FileOutputStream fos=new FileOutputStream("c.txt");
		int b;
		while((b=sis.read())!=-1) {
			fos.write(b);
		}
		sis.close();
		fos.close();
	}

	private static void demo1() throws FileNotFoundException, IOException {
		//传统方式
		FileInputStream fis1=new FileInputStream("yyy.txt");
		FileOutputStream fos=new FileOutputStream("c.txt");
		int b;
		while((b=fis1.read())!=-1) {
			fos.write(b);
		}
		fis1.close();
		FileInputStream fis2=new FileInputStream("ccc.txt");
		int c;
		while((c=fis2.read())!=-1) {
			fos.write(c);
		}
		fis2.close();
		fos.close();
	}
}

IO流 (内存输出流)

什么是内存输出流:

​ 该输出流可以向内存中写输入数据,把内存当成一缓存区,写出之后可以一次性获取所以的数据

使用方法:

​ toByteArray();

​ toString();

例子:
public class Demo_ByteArrayOutputStream {
	/**
	 * 内存输出流
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//不使用ByteArrayOutputStream 读取中文
		//demo1();
		//使用ByteArrayOutputStream 读取中文
		FileInputStream fis=new FileInputStream("c.txt");
		ByteArrayOutputStream bos=new ByteArrayOutputStream();//使用内存进行存储
		int b;
		while((b=fis.read())!=-1) {
			bos.write(b);//写到内存当中
		}
		byte [] arr=bos.toByteArray();//将缓冲区的数据全部拿出来,赋值给arr数组
		System.out.println(new String(arr));
		//System.out.println("toString"+bos);
		fis.close();
	}

	private static void demo1() throws FileNotFoundException, IOException {
		FileInputStream fis=new FileInputStream("c.txt");
		byte [] arr=new byte[3];
		int b;
		while((b=fis.read(arr))!=-1) {
			System.out.println(new String(arr,0,b));
		}
	}
}

内存输出流的练习题

/**
 * 定义一个文件输入流,调用read(byte [] b)方法,
 * 将a.txt文件中的内容打印出来 (byte数组大小限制为5)
 * @author 翁艳敏
 *
 */
public class Demo_test5 {
	public static void main(String[] args) throws IOException {
		// 创建文件输入流
		FileInputStream fis=new FileInputStream("c.txt");
		//定义一和字节数组
		byte [] arr=new byte[5];
		//创建内存输出流
		ByteArrayOutputStream bos=new ByteArrayOutputStream();
		//读取数据
		int d;
		while((d=fis.read(arr))!=-1) {
			bos.write(arr,0,d);
		}
		System.out.println(bos);
		fis.close();
	}
}

随机访问流 RandomAccessFile() 了解

public class Demo_ReadomAccessFile {
/*
 * 随机读取
 * 应用多线程下载
 */

	public static void main(String[] args) throws IOException {
		//例子:
		RandomAccessFile raf=new RandomAccessFile("ccc", "rw");
		//第2个参数为 模式 "r" ,"rw" read ,write
		//读和写都可以
		raf.seek(1);//在指定位置设置指针
		raf.close();
    }
}

对象操作流 ObjecOutputStream

personBean:
package Bean;

import java.io.Serializable;

public class Person  implements Serializable{//要实现这个接口
	private  String name;
	private  int age;
	
	

	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public Person(String name, int age) {
		super();
		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;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}	

}

public class Demo_ObjectOutputStream {
	/**
	 * 序列化操作(写入)
	 * 比如游戏就是退出时进行拿数据写到服务器上一样
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		/*
		 * Person p1=new Person("weng", 22); Person p2=new Person("yan", 23); //Bean
		 * 要实现Serializable 序列化 ObjectOutputStream oos=new ObjectOutputStream(new
		 * FileOutputStream("c.txt")); oos.writeObject(p1); oos.writeObject(p2);
		 * oos.close();
		 */
		//反序列化,就是登陆游戏
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream("c.txt"));
		Person p1=(Person) ois.readObject();
		Person p2=(Person) ois.readObject();
		System.out.println(p1);
		System.out.println(p2);
		ois.close();
	}
}

优化对象操作

比如,只写了2个对象,但输出了3个对象,就会报错说读取到末尾错误

使用容器

		//进行优化
		//序列化
		Person p1=new Person("1", 23);
		Person p2=new Person("2", 21);
		Person p3=new Person("3", 23);
		Person p4=new Person("4", 24);
		//创建容器
		ArrayList<Person> arr=new ArrayList<Person>();
		arr.add(p1);
		arr.add(p2);
		arr.add(p3);
		arr.add(p4);
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("c.txt"));
		oos.writeObject(arr);	
		//反序列化		
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream("c.txt"));
		ArrayList<Person> list= (ArrayList<Person>) ois.readObject();
		for (Person person : list) {
			System.out.println(person);
		}
		oos.close();
		ois.close();
	}

Bean 实现了Serializable 得 最好加个ID

private static final long serialVersionUID = 1L;//生成Id号在未存档就读档的情况下可以将原因显示出来
注意要先存档,后读档就不会有问题

数据输入流和输出流

DataInputStream &DatOutputStream

用法:

public static void main(String[] args) throws IOException {
		// 创建一个数据输出流 和对象流一样
		//开发用的很少
		DataOutputStream dos=new DataOutputStream(new FileOutputStream("c.txt"));
		dos.writeInt(999);
		dos.close();
			DataInputStream dataInputStream=new DataInputStream(new FileInputStream("c.txt"));
			int x= dataInputStream.readInt();
		System.out.println(x);
		dataInputStream.close();
	}

打印流 属于字节流

[外链图片转存失败(img-DLENGbRi-1563628520431)(C:\Users\11276\AppData\Local\Temp\1563411812353.png)]

public static void main(String[] args) {
		//打印流 printStream
		System.out.println("aaa");
		PrintStream ps=System.out;//获取标记输出流
		ps.println(97);   //转化为String 并打印 toString
		ps.write(97);	//查找码表
		Person person=new Person("aaa",23);
		ps.print(person);//打印引用数据类型 如果是null 就null 反之打印toString
		ps.close();
	}
//自动刷新功能(没用)
public static void main(String[] args) throws IOException {
		//打印流 printStream
		//demo1();
		PrintWriter pw=new PrintWriter(new FileOutputStream("c.txt"),true);
		pw.print(97);
		pw.println(87);//代有自动刷新功能
	}

总结下:

对象流(objectStream),打印流(printStream),数据流(DataStream)

都类似游戏读档,和取档

比如游戏就是退出时进行拿数据(out)写到服务器上一样

登陆就要输入到服务器 (inp)

和字符流,字节流不一样

2种键盘录入的方法

	BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//可以不用关流,因为	没和键盘产生关联
		//InputStreamReader  是字节转化为字符的桥梁
		String lin=br.readLine();
		System.out.println(lin);
		br.close();
		//2
		Scanner sc=new Scanner(System.in);
		String line=sc.nextLine();
		System.out.println(line);

IO流 (properties) 的使用

使用方法: load store 和properties 的基本用法

public class Demo_Properties {

	/**
	 * properties 是Hashtable 的子类
	 * properties 基本使用都是字符串
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException {
		// TODO Auto-generated method stub
		//demo1();
		//demo2();
		//有关properties 的方法 ;load() store()
		Properties prop=new Properties();
		System.out.println("读取前"+prop);
		prop.load(new FileInputStream("config.properties"));
		//修改参数
		prop.setProperty("yan", "11111");
		//修改完要写入到文件中去
		prop.store(new FileOutputStream("config.properties"),null);//写入的相当于是日志
		System.out.println(prop);
		
	}

	private static void demo2() {
		//保存和遍历
		Properties prop=new Properties();
		prop.put("1", "1");
		prop.put("2", "2");
		//遍历
		Enumeration<String> en=(Enumeration<String>) prop.propertyNames();
		while(en.hasMoreElements()) {
			String key=en.nextElement();
			String val=prop.getProperty(key);
			System.out.println(key+"="+val);
		}
	}

	private static void demo1() {
		Properties prop=new Properties();
		prop.put("abc", 1);
		System.out.println(prop);
	}
}

FIle递归练习综合

1,统计文件,和文件夹的大小

public class Demo_test6 {
	/**
	 * 统计文件和文件夹的大小
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File file=getFile();
		System.out.println(sunFileSize(file));
	}

	/**
	 * 键盘获取一个文件夹路径
	 * getFile()
	 * @return
	 */
	public static File getFile() {
		// 1创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		System.out.println("输入文件夹路径");
		while (true) {
			String ScName = sc.nextLine();
			// 封装成File
			File file = new File(ScName);
			if (!file.exists()) {// 不是
				System.out.println("输入的不是文件");
			} else if (file.isFile()) {
				System.out.println("输入的是文件不是文件夹");
			} else {
				return file;
			}
		}
	}
	/**
	 * 统计文件的大小
	 * sumFileSize
	 */
	public static Long sunFileSize(File file){
		//定义一个求和的变量
		Long sum=0l;
		//获取到文件和文件夹listfiles();
		File[] files=file.listFiles();
		//遍历数组
		for (File filename : files) {
			//进行判断是文件还是文件夹
			if(filename.isFile()) {
				sum=sum+filename.length();
			}else {
				sum=sum+sunFileSize(filename);//递归调用
			}
		}
		return sum;		
	}	
}

2,File类递归删除文件夹

public class Demo_test7 {
/**
 * 删除键盘录入的文件夹
 * 注意:删除不走回收站的,
 * 思路: 先删除文件再删除文件夹
 * 使用递归的方法
 * @param args
 */
	public static void main(String[] args) {
		// 获取文件夹
		File FileName=Demo_test6.getFile();
		//删除键盘录入的文件夹
	}
	public static void deleteFile(File FileName) {
		//获取文件夹和文件
		File [] files =FileName.listFiles();
		for (File deletefile : files) {
			//是文件就直接删除
			if(deletefile.isFile()) {
				deletefile.delete();
			}else{
			//是文件夹,递归调用	
				deleteFile(deletefile);
			}			
		}
		//循环完把空文件夹删除
		FileName.delete();
	}
}

3,模拟拷贝文件

public class Demo_test8 {
/**
 * 模拟拷贝文件
 * @param args
 * @throws IOException 
 */
	public static void main(String[] args) throws IOException {
		// 接收2个文件夹路径,
		//把其中的一个文件夹中内容拷贝到另外的一个当中
		File fz=Demo_test6.getFile();
		File kb=Demo_test6.getFile();
		//创建方法copy(fz,kb)
		copy(fz, kb);
	}
	/**
	 * 拷贝的方法
	 * copy(fz,kb)
	 * @throws IOException 
	 */
	public static void copy(File fz,File kb) throws IOException {
		//再目标文件中创建原文件夹
		//File newDir=new File(kb, fz.getName());
		kb=new File(kb, fz.getName());
		int sum=1;
		//把这个路径创建出来(*)
		//newDir.mkdir();
		kb.mkdir();
		//获取源文件保存到File 数组中
		File [] saveFile =fz.listFiles();//获得原文件中的内容
		for (File file : saveFile) {
			//如果是文件就继续拷贝
			if(file.isFile()) {
			//IO流
				BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
				BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(new File(kb, file.getName())));
				int b;
				while((b=bis.read())!=-1) {
					bos.write(b);
				}
				bis.close();
				bos.close();
			}else {
				copy(file, kb);
			}
		}
		System.out.println("复制完成"+sum++);
	}
}

4,把文件夹中的所以文件以及文件夹的名字按层级打印

import java.io.File;

/**
 * 把文件夹中的所以文件以及文件夹的名字按层级打印
 * @author 翁艳敏
 *
 */
public class Demo_test9 {
	public static void main(String[] args) {
		//接收一个文件夹
		File dir= Demo_test6.getFile();
		printFile(dir,0);
	}
	/**
	 * 打印文件的层级的方法printFile(File dir)
	 * 返回值: void 
	 * 参数:(File dir,int sum)
	 * @param dir
	 */
	public static void printFile(File dir,int sum) {
		//获取所有文件,及文件夹
		File [] sumFile =dir.listFiles();
		//遍历
		for (File file : sumFile) {
			for(int i=0;i<=sum;i++) {
				System.out.print("\t");
			}
			System.out.println(file);
			if(file.isDirectory()) {
				printFile(file,sum+1);//不用sum++ 因为sum++ 会把原来的值也改变掉
			}
		}
	}
}
 
output
输入文件夹路径
E:\test1
	E:\test1\one.txt
	E:\test1\test2
		E:\test1\test2\1111.txt
		E:\test1\test2\test22

IO流的学习就告一段落 weng

​ 2019.7.20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值