CoreJava基础之IO编程

1.输入输出的概念


    * a: 参照物
        * 到底是输入还是输出,都是以Java程序为参照
    * b: Output
        * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作
        * 程序到文件称为输出
    * c: Input
        * 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作
        * 文件到程序称为输入
    * d: IO操作
        * 把上面的这种输入和输出动作称为IO操作

2.流

(1)流的概念

用来传递数据的对象

(2)流的分类

①数据方向:输入流、输出流

②数据单位:字节流、字符流(文本数据)

字节流 字符流
所有数据都可以通过字节流来处理 字符流处理文本数据
以字节为单位 以字符为单位

③数据功能:节点流、过滤流

节点流 过滤流
实际负责数据传输 为节点流增强功能

(3)字节流

来自于:java.io

InputSream/OutputStream 字节流的父类 close()/read()/write()
FileInputStream/FileOutputStream 文件流  

BufferedInputStream/BufferedOutputStream

缓冲流 通过缓冲区,减少IO的次数 提高读写效率
PrintStream 缓冲输出流 print()/println()/System.out是一个PrintStream对象
ObjectInputSream/ObjectOutputStream 对象序列化 只有实现Serializable接口的对象才能序列化
package exception.io.thread.alltest;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamTest01 {
	public static void main(String[] args) throws IOException{
		//利用字节流进行文件的写操作  字节输出流FileOutputStream()
		FileOutputStream fos=new FileOutputStream("c:\\m.txt");
		//写一个字节
		fos.write(97);
		//写字符数组
		byte[] by={98,35,65,25,45};
		fos.write(by);
		//写入字符数组的一部分  by数组 1下标开始 3个长度
		fos.write(by,1,3);
		//写入字符串
		fos.write("hello,bigtooth!".getBytes());
		//关闭输出流
		fos.close();
	}
}
package exception.io.thread.alltest;

import java.io.FileOutputStream;

public class FileOutputStreamTest02 {
	public static void main(String[] args) throws Exception{
		//续写文件
		FileOutputStream fos=new FileOutputStream("c:\\m.txt",true);
		fos.write("China basketball".getBytes());
		//换行号    \r\n
		fos.write("winner\r\n".getBytes());
		fos.close();
	}
}

 

(4)处理异常的“语法糖”

//语法糖
try(创建资源对象的代码 资源对象:实现了AutoClosable接口的对象){}
catch(异常 e){}
最终资源对象会被自动关闭(Since 1.70)

(5)IO编程基本步骤:

①创建节点流 选择数据源;

②封装过滤流 选择流的功能;

③读/写数据   read/write;

④关闭流 对最外层的流close()。

(6)对象序列化:

1.只有实现Serializable接口的对象才能序列化;

2.对象的属性包括集合中的元素,均需要实现Serilizable接口;

3.利用transient修饰属性为临时属性,不参与序列化。

(7)字符流

Reader/Writer 字符流父类  
OutputStreamWriter/InputStreamReader 桥转换 字节流包装为字符流
BufferedReader/BufferedWriter 缓冲流  
PrintWriter 缓冲输出流  
在桥转换过程中可以指定编码方式

具体案例:

package exception.io.thread.alltest;

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

public class InputStreamReaderTest01 {
	public static void main(String[] args) throws IOException {
		FileInputStream fis=new FileInputStream("c:\\m.txt");
		//字符流转换流 
		InputStreamReader isr=new InputStreamReader(fis);
		char[] ch=new char[1024];
		int len=isr.read();
		System.out.println(new String(ch,0,len));
		isr.close();
		//OutputStreamWriter和InputStreamReader是字节流和字符流的桥梁 
		//字符转换流
	}
}
package exception.io.thread.alltest;

import java.io.FileWriter;

public class FileWriterTest01 {
	public static void main(String[] args) throws Exception {
		//文本输出流FileWriter
		FileWriter fw=new FileWriter("c:\\g.txt");
		//写一个字符
		fw.write(100);
		fw.flush();
		//写一个字符数组
		char[] ch={'a','a','w','e','r'};
		fw.write(ch);
		fw.flush();
		//写入字符串
		fw.write("\r\nhelloworld!");
		fw.flush();
		
		fw.close();
		
	}
}

(8)File类

来自于java.io.File 用于文件的操作

File对象代表了磁盘上的一个文件或是目录

File file = new File("c:\\a.txt");
常用方法 作用
createNewFile() 创建新文件
mkdir() 创建新目录
delete() 删除文件或空目录
exists() 判断file对象代表的文件是否存在
getAbsolutePath() 获得绝对路径
isDirectory()/isFile() 判断File对象代表的是不是目录/文件  【返回值:boolean】
renameTo(File dest) 改名字 最终由dest指向改名后的文件
listFiles() 返回file数组,列出目录中内容(包括文件、目录)
listFiles(File Filter) 通过过滤器筛选过滤器中的内容

具体功能实例:

package exception.io.thread.alltest;

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

public class FileTest02 {
	public static void main(String[] args) throws IOException {
		function();
		function_1();
		function_2();
		function_3();
		function_4();
		function_5();
		
	}
	//将路径封装成File类的对象
	public static void function(){
		File file = new File("d:\\eclipse");
		System.out.println(file);
	}
	//File创建文件的功能   boolean	类型返回值createNewFile()方法
	public static void function_1() throws IOException{
		File file = new File("c:\\m.txt");
		boolean b = file.createNewFile();
		System.out.println(b);
	}
	//File类创建目录的功能   mkdir()	mkdirs()
	public static void function_2(){
		File file = new File("c:\\m.txt");
		//创建文件夹 如果存在文件夹就不再进行创建
		boolean b=file.mkdir();
		//创建文件夹 如果父文件夹不存在就帮你创建出来	创建多层文件夹
		boolean c=file.mkdirs();
		System.out.println(b+"\t"+c);
	}
	//File类的删除功能 delete() 返回值类型boolean 直接从硬盘删除 不走回收站
	public static void function_3(){
		File file = new File("c:\\a.txt");
		boolean a=file.delete();
		System.out.println(a);
	}
	public static void function_4(){
		//获取绝对路径 返回String对象	getAbsolutePath(
		File file=new File("a.txt");
		String abosolute=file.getAbsolutePath();
		System.out.println(abosolute);
		//获得绝对路径 返回File对象 	getAbsoluteFile()
		File file01 = new File("b.txt");
		File file02=file01.getAbsoluteFile();
		System.out.println(file02);
		//获得路径中文件的字节数 	length()
		long length=file02.length();
		System.out.println(length);
		//获得文件名或文件夹名		getName() 返回值String类型
		String name=file02.getName();
		System.out.println(name);
	}
	//File类的判断功能
	public static void function_5(){
		File file = new File("c:\\m.txt");
		//判断是不是文件
		boolean a=file.isFile();
		System.out.println(a);
		//判断是不是文件夹
		boolean b=file.isDirectory();
		System.out.println(b);
		//判断是否存在
		boolean c=file.exists();
		System.out.println(c);
	}
}

(9)对象的克隆

1.需要克隆的类必须实现Cloneable接口(标记接口,没有方法需要实现);

2.需要克隆的类必须主动覆盖clone()方法(把访问修饰符提高到public);

3.调用clone方法,完成对象的赋值。

深拷贝和浅拷贝比较:

浅拷贝:对象中的每个属性,做简单的复制,属性对象并未复制本身,而是复制地址

深拷贝:对象中的每个属性,都会做彻底复制

字符文件流和stream配合:

猜你喜欢

转载自blog.csdn.net/erpang7/article/details/82023185