Java IO流学习总结

                                                       IO流知识总结 

目录

         1、什么是IO流?

1.1、IO流的分类

1.2 字符流和字节流简单的区分与知识图

2、File类(java.io.File)总结

2.1、File类的构造方法

2.2、File的创建功能

2.3、File的删除功能

2.4、File类的获取功能

2.5、File类中的判断功能

2.6、File文件过滤器

3、字节输入流(java.io.OutputStream)

3.1、输入流write()方法

3.2、FileOutputStream文件的续写

3.3、FileOutputStream文件的换行

4、字节输入流(java.io.InputStream)

4.1、FileInputStream读取文件

4.2、字节流复制文件读取字节数组

5、字符流Reader

6、字符流Writer

6.1、Writer和Reader综合运用

7、转换流(字符流与字节流相互转换)

7.1、java.io.OutputStreamWriter 继承Writer类

7.2、java.io.InputStreamReader   继承Reader

7.3、转换流和子类的区别OutputStreamWriter  

 字符—>字节———FileWriterInputStreamReader     字节—>字符———FileReader

8、缓冲区流

8.1、字节缓冲输出流(java.io.BufferedOutputStream)

8.2、字节缓冲输入流(java.io.BufferedInputStream)

8.3、字符输出流缓冲区流(java.io.BufferedWriter)

8.4、字符输入流缓冲流(java.io.BufferedReader)

8.5、使用缓冲区流对象,复制文本文件

9、ProPerties类 

10.ObjectOutputStream/ObjectInputStream

11、打印流(PrintStream/PrintWriter)

12、对文件操作的第三方API支持(Apache)


              

1、什么是IO流?

java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作。在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。通过流的形式允许java程序使用相同的方式来访问不同的输入/输出源。

 

1.1、IO流的分类

按照流的流向可以分为:输入流和输出流

  • 输入流: 只能从中读取数据,而不能向其写入数据。
  • 输出流:只能向其写入数据,而不能向其读取数据。
  • 输入流和输出流:对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。  

按照操作单元可以为:字节流和字符流

  • 字符流:顾名思义,该流只能处理字符,但处理字符速度很快
  • 字节流:可以处理所有以bit为单位储存的文件,也就是说可以处理所有的文件,但是在处理字符上的速度不如字符流

 

1.2 字符流和字节流简单的区分与知识图

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:

  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
  • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。

2、File类(java.io.File)总结

          jdk将操作系统中的文件、目录(文件夹)、路径封装成File对象

 

2.1、File类的构造方法

包括三种重载形式:

File file = new File(String pathname)
传递路径名:可以写到文件夹,可以写到一个文件
c:\\abc    c:\\abc\\Demo.java
将路径封装File类型对象

File file = new File(String parent,String child)
传递字符串父路径和字符串子路径
好处 灵活性更高,可以单独操作父路径和子路径

File file = new File(File parent,String child)
传递File类型的父路径,String类型的子路径
好处:父路径是File类型,父路径可以直接调用File类的方法

关于路径可以分为:相对路径和绝对路径

绝对路径:在系统中具有唯一性
C:\\windows\\system32
http://www.itcast.cn

相对路径:表示的是路径之间的相对关系
D:\\develop\\Java\\jdk1.7.0\\bin
D:\\develop\\Java\\jre7
路径之间的关系
    Java  父目录D:\\develop
    Java  子目录jre7   jdk1.7.0
父目录是  唯一性
子目录是 可以多个

c:\\abc
c:\\abc\\jpg
c:\\abc\\Demo.java

Jpg 和 Demo.java是同级关系  不管jpg是文件名还是文件夹名

 

2.2、File的创建功能

创建文件功能

File的创建文件功能
File file =new File("/Users/fatah/Desktop/abc/a.txt");
boolean b = file.createNewFile();           //创建a.txt文件成功返回true,创建失败(包括文件或文件夹已存在)返回false
创建的文件或者目录,在File的构造方法中给出
如果文件已经存在就不再创建
此方法创建出来的都是文件类型,因此只能创建文件,不能创建文件夹(目录);


File创建文件夹功能

File file =new File("/Users/fatah/Desktop/abc/a");
boolean result  = file.mkdir()  只能创建单级文件夹        //注意:若已存在同名的a文件,同样也会创建a文件夹失败返回false
创建的路径也在File构造方法中给出
若文件或文件夹已经存在了,不再创建

boolean mkdirs()  创建单级或者多级文件夹(推荐使用)

最后很重要的一点:在创建之前,先要判断文件或者文件夹是否存在再创建。即判断

if(!file.exists()) {

       执行创建操作 

}

 

2.3、File的删除功能

可以删除文件或者文件夹
boolean delete()
删除的文件或者是文件夹路径,在File的构造方法中给出
删除成功返回true
删除失败返回false
删除方法不走回收站,直接从硬盘中删除
删除有风险,运行需谨慎!!!

 

2.4、File类的获取功能

String  getName()

File file =new File("/Users/fatah/Desktop/abc/newFile.java");
String name = file.getName();     //返回结果  : newFile.java   不管文件是否存在,本质只做字符串切割subString()     
返回路径中表示的文件或者文件夹名
获取路径中的最后部分名字

String getPath()  等效于file.toString()

long length()返回路径中表示的文件字节数

String getAbsolutePath()   返回此抽象路径名的绝对路径      //返回 /Users/fatah/Desktop/abc/newFile.txt
String getAbsoluteFile()     返回此抽象路径名的绝对路径    

源码实现: 

 public File getAbsoluteFile() {
        String absPath = getAbsolutePath();
        return new File(absPath, fs.prefixLength(absPath));
    }


二者只是返回类型不同  返回值相同
在eclipse环境中,如果写的是一个相对路径,返回工程的根目录
File file = new File(“src”);
File absolute =file.absoluteFile();
Syso absolute   结果是/Users/fatah/eclipse-workspace/Thread/src 

File getParentFile()获取父路径  返回File对象
String getParent()获取父路径 返回String对象

 

2.5、File类中的判断功能

boolean exists()
判断File构造方法中封装路径是否存在
存在返回true,不存在返回false

boolean isDirectory()
判断File构造方法中封装的路径是不是文件夹
如果是文件夹,返回true,不是文件夹,返回false

boolean isFile()——文件夹也返回false
判断File构造方法中封装的路径是不是文件
如果是文件,返回true,不是文件,返回false

File类中的list获取功能  相当于遍历文件夹
Sring[]    list() 返回只有文件名      //newFile.txt等文件名
File[]       listFiles()  返回全目录径或者文件的绝对路径      /Users/fatah/Desktop/abc/newFile.txt等全路径名
Static File[]     listRoots() 返回系统中所有根目录(盘符)  静态方法直接类名调用

 

2.6、File文件过滤器

遍历目录的时候,可以根据需要,只需要满足条件的文件
遍历目录方法 listFiles()重载形式
list(FileFilter filter)不能传递接口类型
则传递FileFilter接口实现类
查API发现FileFilter没有实现类
则需要自定义FileFilter接口实现类,重写抽象方法
接口实现类对象传递到遍历方法listFiles

File[] fileArr = file.listFiles(new MyFilter());
这里的listFiles()有两层作用:在遍历目录的同时,获取到了文件名全路径,调用过滤器的方法accpet,将获取到的路径传递给accept方法的参数pathname

package cn.itcats.thread.countdownlatch;

import java.io.File;
import java.io.FileFilter;
//自定义规则类
public class MyFileFilter implements FileFilter{

	//方法体申明过滤什么格式的,过滤掉的文件格式返回false即可
	//如  我们过滤后缀名为.java的文件
	public boolean accept(File pathname) {
		if(pathname.getName().endsWith(".java"))  return true;
		return false;
	}

}






package cn.itcats.Files;

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

/**
 * 使用原始方法执行几行数相加
 * 
 * @author fatah
 *
 */
public class Files {
	public static void main(String[] args) throws IOException {
		File file = new File("/Users/fatah/Desktop/abc");
		File[] files = file.listFiles(new MyFileFilter());
		for(File f : files) {
			System.out.println(f);
		}
	}
}



//遍历结果为含.java为后缀的文件

 

3、字节输入流(java.io.OutputStream)

  1. OutputStream是所有字节输出的超类(abstract)
  2. ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据
  3. ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流


3.1、输入流write()方法

作用:从Java程序写出文件
字节: 这样流  每次只操作文件中的一个字节
可以写任意文件
方法都是写入文件的方法

void write(int p) 写入一个字节
void write(byte [] b)写入一个字节数组
void write(byte[] b,int,int)写入字节数组,   第一个int  开始写入的索引   后一个int 写几个索引
close()关闭流对象,并释放与次流相关的资源

流对象 操作文件的时候,自己不做 都依赖操作系统 所以用完流之后一定要close()  

FileOutputStream 是OutputStream的子类
写入数据文件,学习父类方法,使用子类对象
FileOutputStream构造器

注意:此构造器(默认不续写),若已存在此文件,原文件内容会丢失,如需续写则看3.2章节
FileOutputStream fos  =new FileOutputStream("/Users/fatah/Desktop/abc/a.txt"); 会在指定目录下创建一个a.txt文件
//流对象的方法write写数据
//写一个字节 
fos.write(97);   a.txt内写的是a  因为文件产生的瞬间会查ASCII编码表
//写字节数组
byte[] bytes ={65,66,67,68};     //ABCD
fos.write(bytes);
//写字节数组的一部分,开始索引,长度
fos.write(bytes,1,2);                   //BC
//最后一定要关闭资源
fos.close();

 

3.2、FileOutputStream文件的续写

FileOutputStream构造方法不但可以写String也可以写File
File file =new File(“c:\\d.txt”);
FileOutputStream fos = new FileOutputStream(file,true);
//构造方法末尾加入true则实现文件的续写
fos.write(“hello”.getBytes());

 

3.3、FileOutputStream文件的换行

在文件中,写入换行,符号换行\r\n
\r\n 可以写在上一行的末尾,也可以写在下一行的开头
fos.write(“hello\r\n”.getByte());
fos.write(“world”.getByte());    
fos.close();  
输出的结果为:
hello
world

 

4、字节输入流(java.io.InputStream)

  1. InputStream是所有字节输入流的超类 (abstract)
  2. ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据
  3. ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。

作用:读取任意文件,每次只读取一个字节 
读取的方法 read()
int  read()  读取一个字节
int  read(byte [] b)读取一定量的字节,存储到数组中 

 

4.1、FileInputStream读取文件

构造方法:为这个输入流对象绑定数据源
参数      File类型对象      String类型对象   都是其数据源


输入流读取文件的步骤
1.创建字节输入流的子类对象
2.调用读取方法read读取
3.关闭资源

read()方法
read()执行一次,就会自动读取下一个字节(所以不能出现两个read() ,可以用一个变量len去接收read() )
返回值,返回的是读取到的字节,读取到结尾返回-1


输入流读取字节数组的步骤

读取方法  int read(byte[] b) 读取字节数组
数组作用 : 缓冲的作用,提高效率,但设置太高消耗内存,一般设置为1024或者是1024整数倍
read返回int,表示什么含义呢?     答:读取到多少个有效的字节数

具体代码实现:

package cn.itcats.thread.countdownlatch;

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

/**
 * 使用int read(byte [] b)输入流方法读取文件
 * @author fatah
 */
public class ByteFileInputStream {
	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream(new File("/Users/fatah/Desktop/abc/newFile.txt"));
		byte [] b =new byte [1024];
		int len = 0;
		while((len = fis.read(b)) != -1) {
			/*这里多说一句
			 * new String(byte[] bytes, int offset, int length, Charset charset) 
                           通过使用指定的 charset 解码指定的 byte 子数组,构造一个新的 String。
			 */
			System.out.println(new String(b,0,len,"UTF-8"));
		}
                        fis.close();
	}    
}

 

4.2、字节流复制文件读取字节数组

package cn.itcats.thread.countdownlatch;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 使用字节流完成文件的复制(采取字节一读一写)
 * @author fatah
 *
 */
public class CopyFileStream {
	public static void main(String[] args) throws IOException {
		//创建字节输入流(读)
		FileInputStream fis = new FileInputStream(new File("/Users/fatah/Desktop/apache-tomcat-9.0.8.tar.gz"));
		//创建字节输出流(写)
		FileOutputStream fos = new FileOutputStream(new File("/Users/fatah/Desktop/abc/apache-tomcat-9.0.8.tar.gz"));
		byte [] b = new byte[1024];
		int len = 0 ;
		while((len = fis.read(b))!=-1) {
			fos.write(b, 0, len);
		}
		if(fis != null) fis.close();
		if(fos != null) fos.close();
	}
}

 

5、字符流Reader

  1. Reader和Writer分别是字符输入流的超类和字符输出流的超类   (都是abstract)
  2. CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。
  3. BufferedReader是一个装饰器,它和其子类负责装饰其它Reader 对象。
  4. FilterReader是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。
  5. InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。

专门读取文本文件
读取方法 read()
int    read() 读取一个字符
int    read(char[] c) 读取字符数组
子类对象FileReader
构造方法 : 绑定数据源
参数: File   类型对象
String   文件名

读取文本文件,具体代码实现:

package cn.itcats.reader;

import java.io.FileReader;
import java.io.IOException;

/**
 * 使用字符输入流读取文本文件
 * @author fatah
 */
public class MyReader {
	public static void main(String[] args) throws IOException {
		FileReader reader = new FileReader("/Users/fatah/Desktop/abc/newFile.txt");
		char [] c =new char [1024];
		int len = 0;
		while( (len = reader.read(c) ) != -1) {
			System.out.println(new String(c,0,len));
		}
		reader.close();
	}
}

 

6、字符流Writer

  1. Writer 是所有的字符输出流的父类,它是一个抽象类。
  2. CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String中写入数据。PipedWriter是向与其它线程共用的管道中写入数据,
  3. BufferedWriter 是一个装饰器为Writer 提供缓冲功能。
  4. PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。
  5. OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类。

构造方法:写入的数据目的
File 类型对象
String类型对象
字符输出流写数据的时候,必须要运行一个功能.刷新功能flush()

 

6.1、Writer和Reader综合运用

   使用字符流复制文本文件,必须文本文件

具体代码实现:

package cn.itcats.copy;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 字符流复制文本文件,必须文本文件
	字符流查询本机默认的编码表,简体中文GBK
	FileReader 读取数据源
	FileWriter 写入数据目的
 * @author fatah
 */
public class CopyCharFile {
	public static void main(String[] args) throws IOException {
		//数据源
		File source = new File("/Users/fatah/Desktop/abc/newFile.txt");
		//数据目标
		File target = new File("/Users/fatah/Desktop/newFile.txt");
		//创建字符输入流
		FileReader fr = new FileReader(source);
		//创建字符输出流
		FileWriter fw = new FileWriter(target);
		
		char [] c = new char [1024];
		int len = 0 ;
		while((len = fr.read(c))!=-1) {
			fw.write(c, 0, len);
			fw.flush(); //Writer务必要flush
		}
		fr.close();
		fw.close();
	}
}

 

7、转换流(字符流与字节流相互转换)

7.1、java.io.OutputStreamWriter 继承Writer类

就是一个字符输出流写文本文件
write() 字符 字符数组 字符串

字符通向字节的桥梁,字符流转换为字节流

OutputStreamWriter使用方法
构造方法:
OutputStreamWriter(OutputStream out)接收所有字节输出流

OutputStreamWriter(OutputStream out,charsetName)
其中charsetName传递编码表名字 GBK UTF-8 不区分大小写

OutputStreamWriter只有有一个子类 (可以指定编码表)
FileWriter(不能指定编码表)

代码演示:

package cn.itcats.transform;

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

//字符流转换为字节流
public class OutputStreamWriterTest {
	public static void main(String[] args) throws IOException {
		FileOutputStream fs = new FileOutputStream("/Users/fatah/Desktop/abc/osw.txt");
		OutputStreamWriter osw = new OutputStreamWriter(fs, "utf-8");
		osw.write("你好");
		osw.flush(); //writer务必要flush
		osw.close();
	}
}

 

7.2、java.io.InputStreamReader   继承Reader

字符输入流 读取文本文件
字节流向字符的桥梁,将字节转化为字符
读取方法
read() 读取一个字符,字符数组
OutputStreamWriter(OutputStream out)所有字节输出流
InputStreamReader(InputStream in)接收所有字节输入流
可以传递字节输入流 FileIntputStream
InputStreamReader(InputStream in,String charsetName)接收所有字节输入流

具体实现同上,不做演示了。

 

7.3、转换流和子类的区别
OutputStreamWriter    字符—>字节
———FileWriter
InputStreamReader     字节—>字符
———FileReader

 

8、缓冲区流

 

8.1、字节缓冲输出流(java.io.BufferedOutputStream)

作用:提高原有输出流的写入效率
BufferedOutputStream 继承 OutputStream
方法 写入write 字节,字节数组

构造方法:
BufferedOutputStream(OutputStream out)
可以传递任意的字节输出流,传递的是哪个字节流,就对哪个字节流提高效率

package cn.itcats.io.buffer;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedOutputStreamTest {
	public static void main(String[] args) throws IOException {
		File target = new File("/Users/fatah/Desktop/abc/bos.txt");
		FileOutputStream fos = new FileOutputStream(target);
		//提高了FileOutputStream效率
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		bos.write("测试BufferedOutputStream".getBytes("utf-8"));
		bos.close();
		fos.close();
	}
}

 

8.2、字节缓冲输入流(java.io.BufferedInputStream)

继承InputStream,标准的字节输入流
读取方法   read()  单个字节, 字节数组

构造方法:
BufferdInputStream(InputStream in)
可以传递任意的字节输入流,传递是谁,就提高谁的效率
可以传递的字符输入流 FileinputStream

实现代码:

package cn.itcats.io.buffer;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class BufferedInputStreamTest {
	public static void main(String[] args) throws IOException {
		File target = new File("/Users/fatah/Desktop/abc/bos.txt");
		FileInputStream fis = new FileInputStream(target);
		//提高了FileInputStream效率
		BufferedInputStream bis = new BufferedInputStream(fis);
		byte [] b =new byte[1024];
		int len = 0;
		while((len = bis.read(b) )!= -1) {
			System.out.println(new String(b,0,len));
		}
		bis.close();
		fis.close();
	}
}

 

8.3、字符输出流缓冲区流(java.io.BufferedWriter)

java.io.BufferedWriter  继承Writer
写入方法write()  单个字符,字符数组,字符串

构造方法
BufferedWriter(Writer w)传递任意字符输出流
传递谁,就高效谁
能传递的字符输出流有 FileWriter,OutputStreamWriter等
另外  BufferedWriter 具有自己的特有方法
void newLine() 写换行
newLine()文本中换行,方法具有平台无关性    \r\n也是文本换行
Windows \r\n
Linux \n
newLine()运行结果和操作系统是相关的
JVM:安装的是Windows版本,newLine()写的是\r\n
         安装的是Linux版本,newLine()写的是\n

具体代码演示:

package cn.itcats.io.buffer;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterTest {
	public static void main(String[] args) throws IOException {
		File target = new File("/Users/fatah/Desktop/abc/bos.txt");
		FileWriter fw = new FileWriter(target,true);
		BufferedWriter bw = new BufferedWriter(fw);
		bw.write("测试BufferedWriter".toCharArray());   //写入字符数组
		//BufferedWriter特有方法 newLine()  换行
		bw.newLine();
		bw.flush();   //Writer一定要flush否则报Stream closed错误
		bw.write("写入String");
		bw.newLine();
		bw.flush();   //Writer一定要flush否则报Stream closed错误
		
		
		fw.close();     
		bw.close();
	}
}


8.4、字符输入流缓冲流(java.io.BufferedReader)

java.io.BufferedReader
继承Reader
读取功能 read()   单个字符,字符数组
构造方法:
BufferedReader(Reader r)
可以任意的字符输入流
FileReader  InputStreamReader

BufferedReader 自己的功能
String     readLine() 读取文本行  依靠的是\r\n 来确定行结束  
方法读取到末尾,返回null

 

8.5、使用缓冲区流对象,复制文本文件

数据源 BufferedReader+FileReader 读取
数据目的 BufferedWriter+FileWriter 写入
读取文本行,读一行,写一行,换一行

具体代码实现

package cn.itcats.io.buffer;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
	使用缓冲区流对象,复制文本文件
	数据源 BufferedReader+FileReader 读取
	数据目的 BufferedWriter+FileWriter 写入
	读取文本行,读一行,写一行,换一行
*/
public class Copy {
	public static void main(String[] args) throws IOException {
		File source = new File("/Users/fatah/Desktop/abc/bos.txt");
		File target = new File("/Users/fatah/Desktop/bos.txt");
		
		//输入流
		FileReader fr = new FileReader(source);
		BufferedReader br = new BufferedReader(fr);
		
		//输出流
		FileWriter fw = new FileWriter(target);
		BufferedWriter bw = new BufferedWriter(fw);
		
		String s =  null;
		
		//readLine是BuffedReader的特有方法,方法读取到末尾,返回null  注意!!!
		while(( s = br.readLine() )!=null) {
			bw.write(s);
			bw.newLine();
			bw.flush();
		}
		//关闭资源
		fr.close();  br.close();  fw.close();  bw.close();
	}
}

 

9、ProPerties类

表示一个持久的属性集。Properties可保存在流中或从流中加载。属性列表中每个键及其对应的值都是一个字符串。
特点:
1、Hashtable的子类,map集合中的方法都可以用
2、该集合没有泛型。键值都是字符串
3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备
4、有流技术相结合的方法

使用Properties集合,存储键值对
setProperty等同于Map接口中的put
setProperty(String key,String value)  Properties类中不存在泛型
通过键获取值,getProperty(String key)

Properties集合特有方法 load
load(InputStream in)
load(Reader r)

传递任意字节或者字符的输入流
流对象读取文件中的键值对,保存到集合 

把文件中的键值对加载到集合中
注销pro.properties中的某一键值对 只需要在此键值对之前添加#即可

Properties类中的特有方法
store(OutputStream out,String comments)
store(Writer w,String comments)

接收所有的字节或者字符的输出流,将集合中的键值对,写回文件中保存

 

读取文件中的键值对 

pro.txt文件内容 :

A=a
B=b
C=c
 

package cn.itcats.io.buffer;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.util.Properties;

public class PropertiesTest {
	public static void main(String[] args) throws IOException {
		Properties pro = new Properties();
		FileReader fr = new FileReader(new File("/Users/fatah/Desktop/abc/pro.txt"));
                //流对象读取文件中的键值对,保存到集合 
		pro.load(new BufferedReader(fr));   
		String value = pro.getProperty("A");
		fr.close();
	}
}

打印结果:a

 

 

同样Properties集合类中的store()方法是将集合中的键值对通过输出流输出到文件保存,此处就不演示了。

 

10.ObjectOutputStream/ObjectInputStream

ObjectOutputStream/ObjectInputStream  对象的序列化与反序列化
IO流对象,实现对象Person序列化和反序列化
ObjectOutputStream 写对象,实现序列化
ObjectInputStream 读取对象,实现反序列化


ObjectOutputStream
构造方法:ObjectOutputStream(OutputStream out)
传递任意的字节输出流
void writeObject(Object obj)  写出对象的方法
对象所在类(Person类)需要 implements Serializable

ObjectInputStream
构造方法: ObjectInputStream(InputStream in)
 传递任意的字节输入流,输入流封装文件,必须是序列化文件
 Object readObject() 读取对象

 

11、打印流(PrintStream/PrintWriter)

 

PrintWriter()  构造方法————还接收字符输出流Writer

 

打印流的特点
1.此流不负责数据源,只负责数据目的
2.为其他输出流,添加功能
3.永远不会抛出IOException
但是,可能抛出别的异常

两个打印流的方法,完全一致
但是构造方法不太一致(构造方法就是打印流的输出目的端)
PrintStream
——构造方法  就收File类型,接收字符串文件名,接收字节输出流OutputStream
PrintWriter
——构造方法  接收File类型,接收字符串文件名,接受字节输出流OutputStream,
同时还接收字符输出流Writer

方法print println 原样输出
而write方法走码表

当且仅当输出语句是char数组,打印结果是数组内元素,而不是内存地址

打印流的自动刷新功能
满足两个条件:
1.输出的数据目的必须是流对象
OutputStream,Writer
2.必须调用println,printf,format三个方法中的一种,启动自动刷新功能

 

12、对文件操作的第三方API支持(Apache)

FilenameUtils类
获取文件的后缀名                                static String           getExtension(String filename)
获取文件名                                            static String      getName(String filename)
判断文件名是否以extension结束        static boolean     isExtension(String filename , String extension)

FileUtils类
static String                  readFiletoString(File src)读取文本返回字符串
static void                     writeStringToFile(File src,String data) 写data到指定的文本文件中
static void                     copyFile(File src,File dest) 将数据源的文件拷贝到数据目的
static void                     copyDirectoryToDirectory(File src,File dest) 拷贝文件夹

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值