第12章 输入和输出
一、流概述
流是指一组有序的数据序列,数据源和输出目标可以是文件,网络,压缩包或其他。
二、输入/输出流
所有输入流都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;所有输出流都是抽象类OutputStream(字节输出流)和抽象类Writer(字符输出流)的子类。
1、输入流
InputStream是所有字节输入流的父类,该类主要方法如下,方法出现错误时候会引发IOException异常。
(1)read():从输入流中读取数据的下一个字节,返回0~255之间的int字节值,如果已到末尾,返回-1.
(2)read(byte[] b):从输入流中读入一定长度的字节,并以整数形式返回字节数。
(3)close():关闭此输入流并释放与该数据流关联的所有系统资源。
Java中的字符是Unicode编码,为双字节,而InputStream类处理的是字节流,一般在Java中用Reader类处理字符文本。
2、输出流
OutputStream是所有字节输出流的父类,主要方法如下:
(1)write(int b):将指定的字节写入此输出流。
(2)write(byte[] b):将b.length个字节从指定的byte数组写入流
(3)close():关闭输出流。
三、File类
1、文件的创建与删除
(1)File(String pathname):参数作为路径名创建一个新File实例。
(2)File(String parent,String child):参数分别作为父路径和子路径,创建一个新File实例。
(3)File(File f,String child):f作为父路径对象,child作为子路径字符串。
1 //项目中创建FileTest类,判断D盘的mywork文件夹是否存在work.txt 2 //如果存在则删除,如果不存在则创建 3 import java.io.File; 4 public class FileTest { 5 6 public static void main(String[] args) { 7 File file=new File("D:/myword","test.txt");//创建文件对象 8 if(file.exists()){ 9 file.delete(); 10 System.out.println("文件已删除"); 11 }else{ 12 try{ 13 file.createNewFile(); 14 System.out.println("文件已创建"); 15 }catch (Exception e){ 16 e.printStackTrace(); 17 } 18 } 19 } 20 }
2、获取文件信息
File类获取文件本身信息的方法主要包括:
(1)getName():获取文件的名称。
(2)canRead():判断文件是否可读
(3)canWrite():判断文件是否可写入
(4)exists():判断文件是否存在
(5)length():获取文件以字节为单位的长度
(6)getAbsolutePath():获取文件的绝对路径
(7)getParent():获取文件的父路径
(8)isFile():判断文件是否存在(判断对象是否是一个文件?)
(9)isDirectory():判断对象是否是一个目录
(10)isHidden():判断对象是否是隐藏文件
(11)lastMOdified():获取文件最后修改时间
import java.io.File; public class FileTest { public static void main(String[] args) { File file=new File("D:/myword","test.txt");//创建文件对象 if(file.exists()){ String name=file.getName(); //获取文件名称 long length=file.length(); //获取文件长度 boolean hidden=file.isHidden(); //判断文件是否隐藏 System.out.println("文件名称为:"+name); System.out.println("文件长度为:"+length); System.out.println("文件是隐藏文件吗?"+hidden); }else{ System.out.println("文件不存在!"); } } }
//通过renameTo()重命名文件 import java.io.File; public class FileTest { public static void main(String[] args) { File file=new File("D:/myword","test.txt");//创建文件对象 if(file.exists()){ System.out.println("文件名称为:"+file.getName());//获取文件名称 System.out.println("文件长度为:"+file.length());//获取文件长度 System.out.println("文件是隐藏文件吗?"+file.isHidden());//判断文件是否隐藏 }else{ System.out.println("文件不存在!"); } File file1=new File("D:/myword","testhaha.txt"); if(file1.exists()){ System.out.println("已存在"+file1.getName()+"文件,无法重命名!!"); }else{ file.renameTo(file1); System.out.println(file.getName()+"文件名称已修改为"+file1.getName()); } } }
四、文件输入、输出流
1、如果需要将数据永久保存,可使用FileInputStream和FileOutputStream类与文件建立连接,将需要的数据永久保存到文件里。
FileInputStream是InputStream抽象类的实现类,FileOutputStream是OutputStream抽象类的实现类。
1 //使用FileOutputStream类向文件work写入信息 2 //然后通过FileinputStream类将work文件中的数据读取到控制台中 3 import java.io.*; 4 public class FileTest { 5 public static void main(String[] args){ 6 File file=new File("F:\\...\\STUDY\\lab\\java","work.txt"); //创建文件对象 7 try{ 8 FileOutputStream out=new FileOutputStream(file); //创建FileOutputStream对象 9 byte bx[]=" tslvcj ".getBytes(); //创建字节型数组 10 out.write(bx); //将数组中信息写入文件 11 out.close(); //关闭输出流 12 }catch(Exception e){ 13 e.printStackTrace(); 14 } 15 try{ 16 FileInputStream in=new FileInputStream(file); 17 byte by[]=new byte[1024]; 18 int len=in.read(by); //将文件中字节流数据读取入数组 19 System.out.println("文件中信息是:"+new String(by,0,len)); 20 in.close(); 21 }catch(Exception e){ 22 e.printStackTrace(); 23 } 24 25 } 26 27 }
2、FileInputStream和FileOutputStream是针对字节流文件的类,如果对于非单字节编码的文件,可能会出现乱码,一般对字符流文件采用FileReader和FileWriter类。
1 import java.io.*; 2 public class FileRwTest { 3 4 public static void main(String[] args) { 5 File file=new File("F:\\霜\\STUDY\\lab\\java","work.txt"); 6 try{ 7 FileWriter fwr=new FileWriter(file); 8 fwr.write("ilc!"); 9 fwr.close(); 10 }catch(Exception e){ 11 e.printStackTrace(); 12 } 13 try{ 14 FileReader fr=new FileReader(file); 15 char mystr[]=new char[1024]; 16 int len=fr.read(mystr); 17 System.out.println("文件中信息为:"+new String(mystr,0,len)); 18 fr.close(); 19 }catch(Exception e){ 20 e.printStackTrace(); 21 } 22 System.out.println("文件名称为:"+file.getName()); 23 System.out.println("文件长度为:"+file.length()+"Bytes"); 24 System.out.println("文件是否隐藏:"+file.isHidden()); 25 } 26 }
1 import java.io.*; 2 public class FileTest { 3 //显示某一文件类下所有文件的名称 4 public void showFileName(File file){ 5 if(!file.exists()){ 6 System.out.println("文件不存在!"); 7 }else{ 8 if(file.isFile()){ 9 System.out.println(file.getName()); 10 }else{ 11 File[] fd=file.listFiles(); 12 for(File fx:fd){ 13 showFileName(fx); 14 } 15 } 16 } 17 } 18 public static void main(String[] args){ 19 FileTest ft=new FileTest(); 20 File file=new File("E:\\lab"); 21 ft.showFileName(file); 22 } 23 }
1 //删除指定文件或文件夹 2 import java.io.*; 3 public class DelFile { 4 public void delF(File file){ 5 if(!file.exists()){ 6 System.out.println("文件不存在!"); 7 }else{ 8 if(file.isFile()){ 9 System.out.println("文件"+file.getName()+"已删除!"); 10 file.delete(); 11 }else{ 12 File[] fa=file.listFiles(); 13 for(File fx:fa){ 14 delF(fx); 15 } 16 17 } 18 } 19 } 20 public static void main(String[] args){ 21 DelFile delTest=new DelFile(); 22 File file=new File("E:\\lab"); 23 delTest.delF(file); 24 } 25 }
五、带缓存的输入、输出流
1、BufferedInputStream类可以对任意InputStream类进行带缓存区的包装以达到性能优化,有两种构造函数:
(1)BufferedInputStream(InputStream in):创建了32个字节的缓存流;
(2)BufferedInputStream(InputStream in,int size):按指定大小创建缓存流。
2、BufferedOutputStream类输出信息和向OutputStream类输入信息完全一样,只不过BufferedOutputStream通过flush()方法强制将缓存区的数据输出结束。其有两种构造方法:
(1)BufferedOutputStream(OutputStream in):创建一个32个字节的缓存区;
(2)BufferedOutputStream(OutputStream in,int size):按指定大小创建缓存流。
3、BufferedReader类与BufferedWriter类分别继承Reader类和Writer类
*BufferedReader类常用方法如下:
(1)read():读取单个字符;
(2)readLine():读取一个文本行,并将其返回为字符串;若无数据,返回null;
(3)writ(String s,int off,int len):写入字符串的某一部分;
(4)flush():刷新该流的缓存。