黑马程序员_IO流二

------- android培训java培训、期待与您交流! ---------- 

 

File

1.用来将文件或者文件夹封装成对象。

2.方便对文件与文件夹的属性信息进行操作。

3.File对象可以作为参数传递给流的构造函数。

4.File类的常见方法

(1)创建

       boolean createNewFile()在指定位置创建文件,如果该文件已经存在,则不创建,返回False。和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

boolean mkdir()创建文件夹。

       boolean mkdirs()创建多级文件夹。

(2)删除

       boolean  delete()删除失败返回False。如果文件在被使用,则返回False

       void deleteOnExit()在程序退出时删除指定文件(无论出现异常只要执行完退出就删除)

(3)判断

       boolean exists()文件是否存在。

       boolean canExecute()测试应用程序是否可以执行此抽象路径表示的文件。

       isFile() 是否是文件

       isDirectory() 是否是目录

       isHidden() 是否是隐藏文件

       isAbsolute() 是否是绝对路径

(4)获取信息

       getName()获取名称

       getPath()获取路径

       getParent()获取父目录。

 

       String getAbsolutePath()获取绝对路径返回字符串。

       file  getAbsoluteFile()获取绝对路径返回对象。

       long lastModified():文件最后一次被修改的时间

       long length():文件大小

       renameTo():可以修改文件名和文件路径

 

listRoots():获取计算机的盘符。

list():返回的是指定目录下的文件或者文件夹的名称。(包含隐藏文件)

listFiles():当前文件夹下的文件以及文件夹的对象。

区别:

list 只有名称

listFiles 对象通过getName获取名称,通过lenth获取大小,通过getPath获取路径,是真实开发的首选。

 

递归

1.函数自己调用自己。

2.注意:递归时一定要明确结束条件。尽量避免内存溢出。

示例:列出指定目录下所有内容。

importjava.io.File;

classFileDemo

{

       public static void main(String[] args)

       {

              File dir = new File("d:\\jdk\\");

              showDir(dir);

       }

public static void showDir(File dir)

       {

              System.out.println(dir);

              File [] files = dir.listFiles();

              for(File f :files)

              {

                     if (f.isDirectory())

                     {

                            showDir(f);

                     }

                     else

                            System.out.println(f);

              }

}

IO包中的其他类

 

Properties

1.单独的对象Propertieshashtable的子类。也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。是集合中和IO技术相结合的集合容器。

2.对象的特点:可以用于键值对形式的配置文件。那么加载数据时,需要数据有固定格式:键=值。

示例

Properties prop = new Properties();

       FileInputStream fis = newFileInputStream("info.txt");

prop.load(fis);//将流中的数据加载进集合。

       prop.setProperty("wangwu","39");//向集合中添加元素。

打印流

1.该流提供了打印方法,可以将各种数据类型的数据都原样打印。

2.字节打印流:PrintStream

构造函数可以接收的参数类型:

(1)file对象File

(2)字符串路径.string

(3)字节输出流OutputStream

3.字符打印流:PrintWriter//非常实用

构造函数可以接收的参数类型:

(1)file对象File

(2)字符串路径.string

(3)字节输出流。OutputStream

(4)字符输出流writer

(5)能操作字符集。

序列流(SequenceInputStream)

对多个流进行合并表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

管道流

PipedInputStreampipedOutputStream

输入输出可以直接进行连接,通过结合线程使用。

示例:

PipedInputStream in = new PipedInputStream();

       PipedOutputStream out = newPipedOutputStream();

       in.connect(out); 使此管道输入流连接到管道输出流

       Read r = new Read(in);

       Write w = new Write(out);

       new Thread(r).start();

       new Thread(w).start();

注:线程中谁先执行?谁都不一定先执行,谁先谁后不重要。read()阻塞方法没有数据就得等,写完才能执行。

RandomAccessFile

1.随机访问文件,自身具备读写的方法。

2.通过skipBytes(int x):跳过指定的字节数,seek(int x):调整对象指针,来达到随机访问。

3.该类不算是IO体系中子类。而是直接继承自Object。但是它是IO包中成员。因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。

4.完成读写的原理就是内部封装了字节输入流和输出流。

5.通过构造函数可以看出,该类只能操作文件。

6.操作文件模式:只读r,读写rw等。

如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。

如果模式rw。操作的文件不存在,会自动创建。如果存则不会覆盖。

RandomAccessFileraf = new RandomAccessFile("ran.txt","r");ran.txt文件

 

操作对象

ObjectInputStreamObjectOutputStream

被操作的对象需要实现Serializable(标记接口)

操作基本数据类型

DataInputStreamDataOutputStream

可以用于操作基本数据类型的数据的流对象。

操作字节数组

ByteArrayInputStreamByteArrayOutputStream

ByteArrayInputStream:在构造的时候,需要接收数据源,而且数据源是一个字节数组。

ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。这就是数据目的地。

因为这两个流对象都操作的数组,并没有使用系统资源。所以,不用进行close关闭。

操作字符数组

       CharArrayReaderCharArrayWriter

操作字符串

       StringReaderStringWriter

示例:切割文件

publicstatic void split()throws IOException

{

       FileInputStream fi = newFileInputStream("1.mp3");

       FileOutputStream  fo = null;

       byte[] buf = new byte[1024*1024];

       int len=0,count=1;

       while ((len=fi.read(buf))!=-1)

       {

              fo=newFileOutputStream("c:\\split\\"+(count++)+".part");

              fo.write(buf,0,len);

              fo.close();

       }

       fi.close();

}

字符编码

1.字符流的出现为了方便操作字符,更重要的是加入了编码转换。

2.通过子类(InputStreamReader OutputStreamWriter)转换流来完成。

3.在两个对象进行构造的时候可以加入字符集。

4.编码表的由来:计算机只能识别二进制数据,早起以来是电信号。为了方便应用计算机,让它可以识别各个国家的文字,就将各个国家的文字用数字来表示,并一一对应,形成一张表。这就是编码表。

5.常见的编码表(ASCII美国7位)(ISO8859-1欧洲码表8位)(GB3212 GBK中国)(Unicode国际2位)(UTF-8 3位)。

转换流的编码应用

1.可以将字符以指定编码格式存储。

OutputStreamWriterosw = new OutputStreamWriter(newFileOutputStream("utf.txt"),"UTF-8");

osw.write("你好aaa");

2.可以对文本数据指定编码格式来解读。

InputStreamReaderisr = new InputStreamReader(newFileInputStream("utf.txt"),"GBK");

char[]buf = new char[10];

int len =isr.read(buf);

Stringstr = new String(buf,0,len);

System.out.println(str);

3.指定编码表的动作由构造函数完成。

编码:字符串—>字节数组

解码:字节数组—>字符串

用于加密文件。

猜数字游戏

产生随机数。获取键盘录入。将录入数据变成数字,和随机数比较。给出提示信息。重复这个过程,如果猜中,程序就结束。

注意:对于输入1~100以外的数字,,以及非数字要给出提示。

importjava.io.BufferedReader;

importjava.io.IOException;

importjava.io.InputStreamReader;

importjava.util.Random;

class  GuessNumberDemo

{

       public static void main(String[] args)

       {

              new GuessNumber().play();

       }

}

classGuessNumber

{

       private int ranNum;

       GuessNumber()

       {

              Random r = new Random();

              ranNum =r.nextInt(100)+1;//(int)Math.random()*100+1;

       }

       public void play()

       {

              System.out.println("游戏开始:输入1~100之间的数字:");

              boolean b = false;

              while(!b)

              {

                     try

                     {

                            int num = getNum();

                            if(num>=1&& num<=100)

                                   b = isLuck(num);

                            else

                                   System.out.println("数值超出范围");

                     }

                     catch (IOException e)

                     {

                            throw newRuntimeException("录入数据失败");

                     }

                     catch(NumberFormatExceptione)

                     {

                            System.out.println("输入了非法数据");

                     }

              }

       }

       //获取键盘的数字

       private int getNum()throwsIOException,NumberFormatException

       {

              BufferedReader bufr = newBufferedReader(new InputStreamReader(System.in));

              int num =Integer.parseInt(bufr.readLine());

              return num;

       }

       //和随机数比较

       private boolean isLuck(int num)

       {

              boolean b = false;

              if(num>ranNum)

                     System.out.println("大了,继续");

              else if(num<ranNum)

                     System.out.println("小了,继续");

              else

              {

                     System.out.println("中了,恭喜");

                     b = true;

              }

              return b;

       }

}

  

------- android培训java培训、期待与您交流! ---------- 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值