黑马 程序员——Java基础---IO(下)
黑马程序员——Java基础---IO(下)
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
一、概述
Java除了基本的字节流、字符流之外,还提供了File类、properties类、打印流、序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息。下面将对它们进行简单的介绍。
一、正文
1、File类
File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。它的特点是:用来将文件或文件夹封装成对象;方便于对文件与文件夹的属性信息进行操作;File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变;File对象可以作为参数传递给流的构造函数
通过调用File类的各种方法,能够完成创建文件、删除文件、重命名文件,判断文件的读取权限及文件是否存在,设置和查询文件的最近修改时间等操作。它的常用方法如下:
1. 创建:Boolean createNewFile(); //在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,如果文件已经存在,会覆盖。 boolean mkdir(); //创建文件夹,只能创建一级文件夹 2. 删除:boolean delete(); //删除文件或目录。文件存在,返回true;文件不存在或者正在被执行,返回false。 void deleteOnExit(); //在程序退出时删除指定文件 3. 判断:boolean canExecute(); //是否是可执行文件 boolean exists(); //文件是否存在 boolean isFile(); //是否是文件 boolean isDirectory();//是否是文件夹 boolean isHidden(); //是否是隐藏文件 boolean isAbsolute(); //文件是否是绝对路径
下面是一段代码:如果给定了一个目录,要求把此目录中的全部文件都列出来,包括子文件夹下的文件。
public class Test8 { public static void main(String[] args) { File f = new File("d:" + File.separator); print(f); } public static void print(File f) { if (f != null) { if (f.isDirectory()) { File[] files = f.listFiles(); if (files != null) { for (File file : files) { print(file); } } } else { System.out.println(f); } } } }
注意:File类是在java.io包中唯一与文件本身有关的,可以使用File类创建、删除等常见的文件操作,.在使用File类指定路径的时候一定要注意操作系统间的差异,尽量使用separator进行分割。
2、Properties类
Properties是Hashtable的子类,它具备Map集合的特点。而且它里面还有存储的键值对,都是字符串,无泛型定义。是集合中和IO技术想结合的集合容器。可用于键值对形式的配置文件,在加载时需要数据有固定的格式,常用的是:键=值
下面是它的常用方法:
1. 构造函数Properties() //创建一个无默认值的空属性列表。 2. String getProperty(String key) //获取指定键key的键值,以字符串的形式返回。 3. void load(InputString inStream) //从输入流中读取属性列表。 4. void setProperty(String key, String value) //设置对象中key的键值。 5. void store(OutputStream outStream, String comments) //根据comments写入putStream。 6. void list(PrintStream out) //将属性列表输出到指定的输出流。 7. Set<String> stringPropertyName() //返回属性列表的键集,存入Set集合
下面的一段程序演示了Properties类常用方法的使用:
public class PropertiesSample { public static void main(String args[]) throws Exception { //创建空参数对象 Properties prop = new Properties(); //创建字节输入流对象 FileInputStream fis = new FileInputStream("sample1.properties"); prop.load(fis); prop.list(System.out); String foo = prop.getProperty("foo"); String fu = prop.getProperty("fu"); System.out.println("foo = " + foo); System.out.println("fu = " + fu); FileOutputStream fos = new FileOutputStream("sample1.properties"); prop.setProperty("foo", "fooValue55"); prop.setProperty("fu", "fuValue55"); prop.put("testkey1", "testvalue"); prop.store(fos, "store properties to sample1.properties"); FileInputStream fis1 = new FileInputStream("sample1.properties"); prop.load(fis1); prop.list(System.out); } }
3、打印流
在整个IO包中,打印流是输出信息最方便的类,主要包含字节打印流(PrintStream)和字符打印流(PrintWriter).打印流提供了非常方便的打印功能,可以打印任何的数据类型。例如:小数、整数、字符串等等。
字节打印流PrintStream的构造方法中可接收的参数类型:File对象、字符串路径String和字符输出OutputStream。
字符串打印流PrintWriter的构造方法中可接受的参数类型:File对象、字符串路径String、字节输出流OutputStream和字符输出流Writer。
下面是一段示例代码:通过键盘录入数据,打印到控制台,要求使用打印流。
public class PrintStreamDemo { public static void main(String[] args) throws IOException { BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); //参数true表示是否自动flush,true为自动 PrintWriter pw = new PrintWriter(new FileWriter("haha.txt"),true); String line = null; while ((line=bufr.readLine())!=null) { if("over".equals(line)) break; //pw.write(line.toUpperCase());//不能换行 //可以用println ,能换行,而newLine是BufferedWriter的方法 pw.println(line.toUpperCase()); } bufr.close(); pw.close(); } }
4、序列流
SequenceInputStream对多个流进行合并。也被称为合并流。常见合并多个流文件步骤:
- 创建Vector集合,并将流对象添加进集合
- 用Vector的elements()创建Enumeration对象,将集合元素加入。
- 创建SequenceInputStream对象,合并流对象
- 创建写入流FileOutputStream对象关联写入文件
- 利用SequenceInputStream对象和FileOutputStream对象读数据进行反复读写操作。
下面是一段示例代码:把三个文件合并成一个文件。
class SequenceInputStreamDemo { public static void main(String[] args)throws IOException { //创建vector集合,并添加相关流对象 Vector<InputStream> vector = new Vector<InputStream>(); vector.add(new FileInputStream("book1.txt")); vector.add(new FileInputStream("book2.txt")); vector.add(new FileInputStream("book3.txt")); //创建枚举对象 Enumeration<InputStream> en = vector.elements(); SequenceInputStream sis=new SequenceInputStream(en); FileOutputStream fos=new FileOutputStream("book4.txt"); //读写操作 byte[] by=new byte[1024]; int len=0; while((len=sis.read(by))!=-1) { fos.write(by,0,len); }
//关闭流对象 sis.close(); fos.close(); } }
三、总结
本文介绍了能够操作文件和文件夹的File类,以及能够打印任何数据的打印流,还有操作键值对配置文件的Properties类,最后讲述了能够合并多个流的 SequenceInputStream,希望对大家有所帮助。