IO流
一.IO流概述
流:可以理解数据的流动,就是一个数据流。IO流最终要以对象来体现,对象都存在IO包中。
流也进行分类:
:输入流(读)和输出流(写)。
:因为处理的数据不同,分为字节流和字符流。
字节流抽象基类:
InputSteam,OutputStream
字符流抽象基类:
Reader,Writer
字符流: 为了方便于文字的解析,所以将字节流和编码表封装成对象,这个对象就是字符流。只要操作字符数据,优先考虑使用字符流体系。
如何判断是输入流,还是输出流?
以内存为参照,如果数据向内存流动,则是输入流,反之则为输出流.
二.字符流
字符流的抽象基类:
|---->Reader:字符输入流
|---->Writer:字符输出流
构造方法:
|--->FileWriter(String fileName)根据给定的文件名构造一个 FileWriter 对象。
|--->FileWriter(String fileName, boolean append)
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
可以实现文件的追加写入,第二个参数表示是否追加写入,默认是false,就会重头开始写入,如果是true,就会追加写入
常用方法:
|--->void write(String str):写入字符串。
|--->abstract void flush():刷新该流的缓冲
|--->abstract void close():关闭此流,但要先刷新它。
创建文件步骤:
// 1.创建流对象,建立数据存放文件,指定目的地
FileWriter fw = new FileWriter(“Test.txt”);
//(注:该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖)
//2.调用流对象的写入方法,将数据写入流
fw.write(“text”);
//3.刷新流对象中的缓冲中的数据,将数据刷到目的地中。
fw.flush();
//4.关闭流资源,并将流中的数据清空到文件中。
fw.close();
5.close()和flush()的区别:
flush():将缓冲区的数据刷到目的地中后,流可以使用。
close():将缓冲区的数据刷到目的地中后,流就关闭了,该方法主要用于结束调用的底层资源。这个动作一定做。
在文本后面追加操作示例:
public class FileWriterDemo2 {
public static void main(String[] args) throws IOException{
FileWriter fw = null;
try{
fw = new FileWriter("fw2.txt",true);
for (int x = 0; x < 4; x++){
fw.write(x + "hello\r\n");// 调用writer方法
}
}
catch (IOException e){
throw new RuntimeException("写入失败");
}
finally { // 释放资源
if(fw!=null){
try{
fw.close();
}
catch (IOException e2) {
throw new RuntimeException("关闭流失败");
}
}
}
}
}
public class FileWriterDemo2 {
public static void main(String[] args) throws IOException{
FileWriter fw = null;
try{
fw = new FileWriter("fw2.txt",true);
for (int x = 0; x < 4; x++){
fw.write(x + "hello\r\n");// 调用writer方法
}
}
catch (IOException e){
throw new RuntimeException("写入失败");
}
finally { // 释放资源
if(fw!=null){
try{
fw.close();
}
catch (IOException e2) {
throw new RuntimeException("关闭流失败");
}
}
}
}
}
FileReader
FileReader是Reader的一个子类,用来读取字符文件的便捷类
构造方法:
FileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
两种读取方法:
int read():读取单个字符。
int read(char[] cbuf):将字符读入数组。
读取方法示例:
FileReader fr = new FileReader("D:\\Demo\\sdfs.txt");
//创建一个文件读取流对象,和指定名称的文件相关联。
//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
int ch = 0;
while((ch = fr.read())!=-1){
System.out.print((char)ch);
}
fr.close();
FileReader fr = new FileReader("D:\\Demo\\sdfs.txt");
//创建一个文件读取流对象,和指定名称的文件相关联。
//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
int ch = 0;
while((ch = fr.read())!=-1){
System.out.print((char)ch);
}
fr.close();
注意:
1.定义文件路径时,可以用“/”或者“\\”。
2.在创建一个文件时,如果目录下有同名文 件将被覆盖。
3.在读取文件时,必须保证该文件已存在, 否则出异常。
三.字符流缓冲区
缓冲区的出现提高了对数据的读写效率。要结合流才可以使用,在流的基础上对流的功能进行了增强。
对应类:
BufferedWriter (extends Reader)
BufferedReader (extends Writer)
这两个类同样具有内部缓存机制,并可以以行为单位进行输入/输出.
BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。该缓冲区中提供了一个跨平台的换行符:newLine();
方法
close():关闭此流,但要先刷新它。
flush():刷新该流的缓冲。
newLine():写入一个行分隔符。 可跨平台使用
write(char[] cbuf, int off, int len):写入字符数组的某一部分。
write(int c):写入单个字符。
write(String s, int off, int len):写入字符串的某一部分。
特别注意:用到缓冲区,就要记得刷新。
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
该缓冲区提供了一个一次读一行的方法 readLine(),方便于对文本数据的获取。当返回null时,表示读到文件末尾。(注:readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。)
常用方法:
void close():关闭该流并释放与之关联的所有资源。
int read():读取单个字符。
int read(char[] cbuf, int off, int len):将字符读入数组的某一部分。
String readLine():读取一个文本行。
public static void read2(){
FileInputStream fis = null;
try {
fis = new FileInputStream("D:\\Demo\\demo.java");//新建字节读取的对象,明确源文件
int len = 0;
byte[] buff = new byte[1024];//定义一个字节数组,用于存储字节
while((len=fis.read(buff))!=-1){ //每次将读取到的字节存储进buff数组
System.out.println(new String(buff,0,len));//将字节数组转换成字符串输出
}
} catch (IOException e) {
e.printStackTrace();
}
finally{ //执行关闭资源的操作
if(fis!=null) {
try {
fis.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
}
fis =new FileInputStream(file);
byte [] ch =newbyte[fis.available()];
fis.read(ch);
System.out.println(new String(ch));
//但是如果文件过大,会造成内存溢出。
字节流缓冲区
public class copyMp3 {
public static void main(String[] args){
BufferedInputStream buis=null;
BufferedOutputStream buos=null;
try{
buis=new BufferedInputStream(new FileInputStream("D:\\play.mp3"));
buos=new BufferedOutputStream(new FileOutputStream("D:\\play_copy2.mp3"));
byte[] buff = new byte[1024];
int len = 0;
while((len=buis.read(buff))!=-1){
buos.write(buff,0,len);
}
}
catch(IOException e) {
throw new RuntimeException("复制失败");
}
finally{
if(buis!=null){
try { buis.close();
}catch (Exception e2) {
throw new RuntimeException();
}
}
if(buos!=null){
try { buos.close();
} catch (Exception e2) {
throw new RuntimeException();
}
}
}
}
}
File类
File类是文件和目录路径名的抽象表示形式。 是io包中唯一代表磁盘文件本身的对象,其定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建.删除.重命名文件等操作,File类是对象主要用来获取未文件本身的一些信息,如文件所在的目录、文件的长度、文件的读写权限等。File对象可以作为参数传递给流的构造函数。
Properties类
class PropertiesDemo {
public static void main(String[] args) throws IOException {
loadDemo();
}
public static void loadDemo()throws IOException{
Properties prop = new Properties();
FileInputStream fis = new FileInputStream("info.txt");
//将流中的数据加载进集合。
prop.load(fis);
prop.setProperty("wangwu","39");//并没有写入到硬盘中,只写入到流中
FileOutputStream fos = new FileOutputStream("info.txt");
prop.store(fos,"haha");//将流中的数据写入到硬盘中
prop.list(System.out);//列出目录
fos.close();
fis.close();
}
//设置和获取元素。
public static void setAndGet() {
Properties prop = new Properties();
prop.setProperty("zhangsan","30");//设置元素
prop.setProperty("lisi","39");
String value = prop.getProperty("lisi");
System.out.println(value);//打印出39
prop.setProperty("lisi",89+"");
Set<String> names = prop.stringPropertyNames();
for(String s : names){
System.out.println(s+":"+prop.getProperty(s));
}
}
}
打印流
class PrintStreamDemo{
public static void main(String[] args) throws IOException{
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));//读取键盘输入
PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);//ture代表自动刷新
String line = null;
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
out.println(line.toUpperCase());//转换成大写
//out.flush();//刷新
}
out.close();
bufr.close();
}
}
对象序列化
操作字节数组
法还可以使用,而不会抛出IOException。
class PrintStreamDemo{
public static void main(String[] args) throws IOException{
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));//读取键盘输入
PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);//ture代表自动刷新
String line = null;
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
out.println(line.toUpperCase());//转换成大写
//out.flush();//刷新
}
out.close();
bufr.close();
}
}
字符编码
创建使用指定字符集的InputStreamReader。
创建使用指定字符集的OutputStreamWriter。
IO流总结
---------------------------------------------------android培训、java培训、期待与您交流!---- --------------------------------------