Java基础(IOl流——File类、Properties类、打印流、序列流)

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 00:12   11   0

File

一、什么是File类?
File类就是Java中对文件这类事物的描述,Field类对象可以代表一个路径,该路径可以是文件也可以是文件夹,该类方法可以对这个路径进行各种操作
二、创建Field对象的格式
给Field类的构造函数传一个String类型的路径就可以创建Field对象 File f = new File("file.txt");
File对象的路径:
1、绝对路径:从 盘符开始,是一个固定路径
2、相对路径:不从盘符开始,相对于某个位置,在 Eclipse中如果使用相对路径,则相当于工程根目录,cmd中则相当于当前目录
常用方法:
<span style="font-size:14px;">/*
创建:
*****createNewFile()        创建文件
*****mkdir();               创建文件夹(仅一级)
*****mkdirs();              创建文件夹(父级不存在也创建)

判断:
*****boolean exists()       判断是否存在
boolean isAbsolute();       是否是绝对路径
*****boolean isDirectory(); 是否是文件夹
*****boolean isFile();      是否是文件
boolean isHidden();         是否是隐藏文件
canRead();                  是否可读
canWrite();                 是否可写
canExecute();               是否可执行

获取:
getAbsolutePath();          获取绝对路径
*****getParent());          获取父级路径
*****getName());            获取文件或文件夹名
*****length()               文件大小
*****lastModified();        获取文件的最后修改时间
getFreeSpace();             获取当前盘符剩余空间
getTotalSpace();            获取当前盘符总空间
getUsableSpace();           获取当前盘符可用空间 

设置:
setReadable(false);         设置是否可读
setWritable(false);         设置是否可写
setExecutable(false);       设置是否可执行
setLastModified();          设置文件的最后修改时间

删除:
*****delete()               删除, 文件可以直接删除, 文件夹只能删空的

剪切:
**renameTo();               改名, 可以移动文件

比较特殊的方法:
File[] listRoots()   列出计算机中所有的盘符
String[] list()    返回指定目录下的所有文件及目录,包含隐藏文件
*****File[] listFiles()     返回指定目录下的所有文件及目录
*/</span>
演示:
<span style="font-size:14px;">class FileDemo
{
 public static void main(String [] args){
  showRoots();
 }
 //列出计算机下所有盘符
 public static void showRoots(){
  File [] f = File.listRoots();
  for(File file:f)
   System.out.println(f);
 }
 //列出指定目录下所有文件
 public static void showList(){
  File file = new File("D:");
  String [] str = file.list();
  for(String s:str)
   System.out.println(s);
 }
 //返回指定目录下的所有文件及目录
 public static void showlistFiles(){
  File file = new File("D:");
  File [] fi = file.listFiles();
  for(File f:fi){
   //如果后罪名为 .Java
   if(f.getName.endsWith(".java"))
    System.out.println(f);
  }
 }
}</span>
练习一、列出指定目录下的所有文件
<span style="font-size:14px;">/*
列出指定目录下文件或者文件夹,包含子目录中的内容。
也就是列出指定目录下所有内容。
*/
import java.io.*;
import java.util.*;
class  FileDemo1
{
 public static void main(String[] args) 
 {
  File file = new File("D:\\a");
  if(file.exists()){
   if(file.isDirectory())
    show(file);
  }
 }
 public static void show(File file){
  File [] fi = file.listFiles();
  System.out.println(file);
  for(File f:fi){
   if(f.isDirectory()){
    show(f);
   }
   else
    System.out.println(f);
  }
 }
}
</span>
练习二、将文件路径存放到一个文件中
<span style="font-size:14px;">/*
将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。
建立一个java文件列表文件。
*/
import java.io.*;
import java.util.*;
class  FileDemo2
{
 public static void main(String[] args) 
 {
  //要列出的根目录
  File file = new File("D:\\S1\\教程\\JAVA教程\\Step1----J2SE部分\\毕向东Java基础");
  //用于存放路径
  List<File> list = new ArrayList<File>();
  //判断根目录
  if(file.exists()){
   if(file.isDirectory())
    //把根目录下的文件及目录路径存入集合
    fileToList(file,list);
  }
  File write = new File(file,"file.txt");
  listToFile(list,write);

 }
 public static void fileToList(File file,List<File> list){
  //获取指定路径下的所有文件
  File [] files = file.listFiles();
  list.add(file);
  for(File f:files){
   //判断当前文件是否是目录
   if(f.isDirectory())
    //递归
    fileToList(f,list);
   else
    //将路径添加进集合
    list.add(f);
  }
 }
 public static void listToFile(List<File> list,File file){
  BufferedWriter bufw = null;
  try
  {
   bufw = new BufferedWriter(new FileWriter(file));
   //遍历集合,每遍历一次写出一次
   for(File f:list){
    bufw.write(f.getAbsolutePath());
    bufw.newLine();
    bufw.flush();
   }
  }
  catch (IOException e)
  {
   throw new RuntimeException("路径不存在");
  }
  finally{
   try
   {
    if(bufw!=null)
     bufw.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("缓冲关闭失败");
   }
   
  }
 }
}
</span>
练习三、删除一个带内容的目录
/*
删除一个带内容的目录
思路:
*/
import java.io.*;
class  FileDemo3
{
 public static void main(String[] args) 
 {
  File file = new File("D:\\a");
  if(file.exists())
  {
   if(file.isDirectory())
    delFiles(file);
  }
 }
 public static void delFiles(File file){
  File [] files = file.listFiles();
  for(File f:files){
   if(f.isDirectory())
    delFiles(f);
   else
    System.out.println(f.getPath()+"...删除文件..."+f.delete());
  }
  System.out.println(file.getPath()+"...删除目录..."file.delete());
 }
}
Properties
一、概述
Properties是HashTable的子类,它具备Map集合的特点,而且里面存储的是字符串类型的键值对,没有泛型定义(其实就是String,String),它是集合和IO技术相结合的集合容器
二、作用
主要用于键值对形式的配置文件
三、常用方法
1、String getProperty(String key); 返回指定键上的值 相当于Map集合中的 getKey();
2、void load(InputStream inStream) 从输入流中读取属性列表(键和元素对)。(加载流中的数据到集合中)
3、void list(PrintStream out) 将属性列表输出到指定的输出流。
4、Object setProperty(String key,String value) 为指定键添加

5、void store(OutputStream, String) 将集合的数据写入到文件中,String使用来添加注释的,不会被解析
6、Set stringPropertyNames() 返回集合中的键集 相当于Map集合中的keySet练习一:从硬盘中读取键值对数据存储到集合中进行操作
import java.io.*;
import java.util.*;
class  PropertiesDemo
{
 public static void main(String[] args) 
 {
  File file = new File("D:\\Properties.txt");
  if(file.exists())
   show(file);
 }
 public static void show(File file){
  BufferedReader bufr = null;
  String line = "";
  Properties pro = new Properties();
  try
  {
   //创建读取流与指定文件关联
   bufr = new BufferedReader(new FileReader(file));
   while((line=bufr.readLine())!=null){
    //把读取到的字符串以“=”分割
    String [] str = line.split("=");
    //把分割后的字符串分别作为键和值存入Properties集合
    pro.setProperty(str[0],str[1]);
   }
   //打印集合
   System.out.println(pro);
  }
  catch (IOException e)
  {
   throw new RuntimeException();
  }
  finally{
   try
   {
    if(bufr!=null)
     bufr.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException();
   }
  }
 }
}
练习二、限制程序运行次数。当运行次数到达5次时,给出,请您注册的提示。并不再让该程序执行。
/*
练习二、限制程序运行次数。当运行次数到达5次时,给出,请您注册的提示。并不再让该程序执行。
用于记录应用程序运行次数。
如果使用次数已到,那么给出注册提示。

很容易想到的是:计数器。
可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增。
可是随着该应用程序的退出,该计数器也在内存中消失了。

下一次在启动该程序,又重新开始从0计数。
这样不是我们想要的。

程序即使结束,该计数器的值也存在。
下次程序启动在会先加载该计数器的值并加1后在重新存储起来。

所以要建立一个配置文件。用于记录该软件的使用次数。

该配置文件使用键值对的形式。
这样便于阅读数据,并操作数据。

键值对数据是map集合。
数据是以文件形式存储,使用io技术。
那么map+io -->properties.

配置文件可以实现应用程序数据的共享。

*/
import java.io.*;
import java.util.*;
class  PropertiesDemo1
{
 public static void main(String[] args) throws Exception
 {
  File file = new File("count.properties");
  //如果文件不存在,则新建文件
  if(!file.exists())
   file.createNewFile();
  runNum(file);
 }
 public static void runNum(File file)throws Exception{
  //定义一个持久属性集
  Properties pro = new Properties();
  BufferedReader bufr = null;
  BufferedWriter bufw = null;
  try
  {
   //定义读取流并与文件关联
   bufr = new BufferedReader(new FileReader(file));
   //定义输出流并与文件关联
   bufw = new BufferedWriter(new FileWriter(file));
   //将流中的数据加载进集合
   pro.load(bufr);
   //获取用户登录次数
   String countValue = pro.getProperty("count");
   int count = (countValue==null)?1:((Integer.parseInt(countValue)));
   //判断
   if(countValue==null){
    System.out.println("首次使用本程序,信誉度+1");
   }
   else
    if(count<5)
     System.out.println("这是您第"+count+"次使用本程序,您还剩余"+(5-count)+"次机会");
    else{
     System.out.println("您的使用次数已达上限,请登录XXX重新注册");
     return;
    }
   count++;
   //根据键修改次数
   pro.setProperty("count",count+"");
   //把新数据写入文件
   pro.store(bufw,"使用次数已更改");
  }
  catch (IOException e)
  {
   throw new RuntimeException();
  }
  finally{
   try
   {
    if(bufr!=null)
     bufr.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException();
   }
   finally{
    try
    {
     if(bufw!=null)
      bufw.close();
    }
    catch (IOException e)
    {
     throw new RuntimeException();
    }
   }
  }
 }
}


打印流
一、概述
该流提供了打印方法,可以将各种数据都原样打印
二、分类
1、字节打印流
PrintStream
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
2、字符打印流
PrintWriter
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4、字符输出流 Writer
练习:使用打印流实现键盘录入
import java.io.*;
class  PrintDemo
{
 public static void main(String[] args) 
 {
  show();
 }
 public static void show(){
  BufferedReader bufr = null;
  PrintWriter print = null;
  try
  {
   //创建字符读取流,与键盘输入相关联
   bufr = new BufferedReader(new InputStreamReader(System.in));
   //创建打印流,与输出到控制台,并设置自动刷新PrintWriter(Writer,true)
   print =new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)),true);
   String line = "";
   while((line=bufr.readLine())!=null){
    if("over".equals(line))
     return;
    //使用println方法直接打印,不用刷新
    print.println(line.toUpperCase());
   }
  }
  catch (IOException e)
  {
   throw new RuntimeException();
  }
  finally{
   try
   {
    if(bufr!=null)
     bufr.close();
    //这里不捕捉异常,因为PrintWriter并不抛出异常
    if(print!=null)
     print.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException();
   }
  }
 }
}
SequenceInputStream

一、概述

1SequenceInputStream对多个流进行合并。也被称为合并流。

2、常用构造函数

SequenceInputStream(Enumeration<?extends FileInputStream> e)

二、合并流

1、创建集合,并将流对象添加进集合

2、创建Enumeration对象,将集合元素加入。

3、创建SequenceInputStream对象,合并流对象

4、创建写入流对象,FileOutputStream关联写入文件

5、利用SequenceInputStream对象和FileOutputStream对象读数据进行反复读写操作。

/*合并流
 1、创建集合,并将流对象添加进集合

        2、创建Enumeration对象,将集合元素加入。

        3、创建SequenceInputStream对象,合并流对象

        4、创建写入流对象,FileOutputStream关联写入文件

        5、利用SequenceInputStream对象和FileOutputStream对象读数据进行反复读写操作。
*/
import java.io.*;
import java.util.*;
class  SequenceInputStreamDemo
{
 public static void main(String[] args) throws IOException
 {
  File file = new File("D:\\5.txt"); 
  show(file);
 }
 public static void show(File file)throws IOException{
  //创建list集合,并指定FileInputStream类型,存储需要合并的流对象
  List<FileInputStream> list = new ArrayList<FileInputStream>();
  list.add(new FileInputStream("D:\\1.txt"));
  list.add(new FileInputStream("D:\\2.txt"));
  list.add(new FileInputStream("D:\\3.txt"));
  list.add(new FileInputStream("D:\\4.txt"));
  //通过使用迭代取出集合中的元素
  Iterator<FileInputStream> it = list.iterator();
  //因为SequenceInputStream的构造函数参数类型必须是Enumeration<? extends InputStream> 
  //而list是没有返回值类型是Enumeration,所以我们要自己建一个Emumeration
  //因此可以使用匿名内部类,通过 new Enumeration建立子类对象,并覆盖Enumeration中的方法
  //注:Enumeration的泛型必须是InputStream或其子类
  Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){
   public boolean hasMoreElements(){
    //因为Enumeration的原理和迭代的原理是一致的,所以这里返回it.hasNext()就行了
    return it.hasNext();
   }
   public FileInputStream nextElement(){
    //注意,这里返回值类型必须和Enumeration定义的泛型一致,而且Enumeration的泛型必须是InputStream或其子类
    return it.next();
   }
  };
  //创建合并流对象,并把en作为实际参数传递
  SequenceInputStream se = new SequenceInputStream(en);
  BufferedOutputStream buf = null;
  //创建输出流对象 ,这里也可以使用PrintStream打印流
  buf = new BufferedOutputStream(new FileOutputStream(file));
  byte [] bys = new byte[1024];
  int by = 0;
  while((by=se.read(bys))!=-1){
   buf.write(bys,0,by);
  }
  se.close();
  buf.close();
 }
}
三、切割流
/*
切割流

*/

import java.io.*;
import java.util.*;
class  SequenceInputStreamDemo1
{
 public static void main(String[] args) 
 {
  //要分割的文件
  File file = new File("D:\\KuGou\\陈奕迅 - 斗战神.mp3");
  //判断文件是否存在
  if(file.exists())
   sqlitMp3(file);
  File outFile = new File("D:\\KuGou\\陈奕迅 - 斗战神_SequenceInputStream.mp3");
  show(file,outFile);
 }
 //分割文件
 public static void sqlitMp3(File file){
  BufferedInputStream bufr = null;
  BufferedOutputStream bufo = null;
  int count = 1;
  try
  {
   //创建字节读取流对象,关联文件
   bufr = new BufferedInputStream(new FileInputStream(file));
   //创建一个2M大小的数组,以数组大小对文件进行分割
   byte [] bys = new byte[1024*1024*2];
   int by = 0;
   //没读取的字节达到2M就写出一次
   while((by=bufr.read(bys))!=-1){
    //使用count自增来保存分割的文件
    bufo = new BufferedOutputStream(new FileOutputStream("D:\\KuGou\\陈奕迅_斗战神"+(count++)+".part"));
    //写出碎片文件
    bufo.write(bys,0,by);
    //每写出一次,都要关流
    bufo.close();
   }
  }
  catch (IOException e)
  {
   throw new RuntimeException();
  }
  finally{
   try
   {
    if(bufr!=null)
     bufr.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException();
   }
   finally{
    try
    {
     if(bufo!=null)
      bufo.close();
    }
    catch (IOException e)
    {
     throw new RuntimeException();
    }
   }
  }
 }
 //合并流
 public static void show(File file,File outFile){
  FileInputStream fi = null;
  BufferedOutputStream  bufo = null;
  SequenceInputStream se = null;
  //创建集合,用于存储被分割的文件
  List<InputStream> list = new ArrayList<InputStream>();
  try
  {
   //创建字节读取流,并于文件关联
   fi = new FileInputStream(file);
   //获取文件被分割的个数,fi.available得到文件大小除以2M得到文件被分割个数
   int num =(int) Math.ceil(fi.available()/1024/1024/2.0);
   for(int i=1;i<=num;i++){
    list.add(new FileInputStream("D:\\KuGou\\陈奕迅_斗战神"+i+".part"));
   }
   //通过遍历集合,得到集合中的碎片文件
   Iterator<InputStream> it = list.iterator();
   //创建Enumeration对象,使用匿名对象,通过new Enumeration创建其子类对象
   Enumeration<InputStream> en = new Enumeration<InputStream>(){
    //覆盖抽象Enumeration类中的抽象方法
    public boolean hasMoreElements(){
     return it.hasNext();
    }
    public InputStream nextElement(){
     return it.next();
    }
   };
   //创建SequenceInputStream对象,将多个流合并成一个流
   se = new SequenceInputStream(en);
   //创建字节输出流,输出把合并后的文件打印
   bufo = new BufferedOutputStream(new FileOutputStream(outFile));
   //创建缓冲区,一次读取1M
   byte [] bys = new byte[1024*1024];
   int by = 0;
   while((by=se.read(bys))!=-1){
    bufo.write(bys,0,by);
   }
  }
  catch (IOException e)
  {
   throw new RuntimeException();
  }
  finally{
   try
   {
    if(fi!=null)
     fi.close();
    if(bufo!=null)
     bufo.close();
    if(se!=null)
     se.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException();
   }
  }
 }
}





分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP