黑马程序员_IO流(二)

来源:互联网 发布:中序线索树的递归算法 编辑:程序博客网 时间:2024/04/30 08:46

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

读取键盘录入

读取键盘录入通常会用到:

System.out:标准输出流,对应的是标准的输出设备(默认控制台),是PrintStream类型

System.in:标准输入流,对应标准的输入设备(默认键盘),是字节读取流对象

代码示例:

/*

需求:通过键盘录入数据,当录入一行数据后就将该行数据打印,如果录入的是over就停止录入

思路:1,通过System.in 标准输入流,读取键盘输入的数据,

    2,创建一个缓冲区缓冲区,将循环读取的数据存入缓冲区中,用回车符\r\n判定读取一行的结尾

    3,将存储进缓冲区中的一行数据转换成字符串打印,清空缓冲区,以待下次录入

    4,当读取到over循环停止

*/

import java.io.*; class  ReadIn{public static void main(String[] args)  throws IOException{InputStream in=System.in;//in是字段不是方法StringBuilder sb=new StringBuilder();//创建一个容器,用来存储键盘录入的数据while (true)//循环录入{int ch=in.read();//读取键盘录入if(ch=='\r')//如果读取到的字符==\r,循环继续continue;if(ch=='\n')//如果读取到的字符==\n,{String s=sb.toString();//将缓冲区的字符转换成字符串if("over".equals (s))//字符串的equals 方法 比较两个字符串的内容break;System.out.println(s);sb.delete(0,sb.length());//删除sb里面的数据}elsesb.append((char)ch);//将整型ch强转成char类型,存储到缓冲区}}}

读取转换流

以上的代码是读取键盘录入的一行数据,由此可以想到用字符流缓冲区BufferedReader 的ReadLine()方法就可以完成,但是键盘录入System.in的是字节流,那么就考虑将字节流如何转换成字符流,再使用字符流缓冲区BufferedReader 的方法,方便操作数据,java提供了读取转换流InputStreamReader

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符

构造方法

InputStreamReader(InputStream in)
          创建一个使用默认字符集的 InputStreamReader

InputStreamReader(InputStream in,String charsetName)
          创建使用指定字符集的 InputStreamReader。

//获取键盘输入对象InputStream in=System.in;//将字节流对象转换成字符流对象InputStreamReader isr=new InputStreamReader(in);
写入转换流

将字节转流转换成字符流方便读取数据,同时java也提供了相对应的写入转换流OutputStreamWriter

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节

构造方法

OutputStreamWriter(OutputStream out) 
          创建使用默认字符编码的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, String charsetName) 
          创建使用指定字符集的 OutputStreamWriter。

//System.out 是PrintStream类型,PrintStream 是 OutputStream的子类OutputStream out=System.out;//将字节流转换成字符流 用到OutputStreamWriterOutputStreamWriter osw=new OutputStreamWriter(out);
代码示例:

需求:将键盘录入的数据打印到控制台上,当输入“over”时停止录入

import java.io.*;class ReadIn2 {public static void main(String[] args) throws IOException{//获取键盘输入对象InputStream in=System.in;//将字节流对象转换成字符流对象InputStreamReader isr=new InputStreamReader(in);//使用缓冲区技术提高效率BufferedReader br=new BufferedReader(isr);//字节流转换成字符流输出//System.out 是PrintStream类型,PrintStream 是 OutputStream的子类OutputStream out=System.out;//将字节流转换成字符流 用到OutputStreamWriterOutputStreamWriter osw=new OutputStreamWriter(out);//使用缓冲区  这样可以使用缓冲区跨平台的换行方法 BufferedWriter bw=new BufferedWriter(osw);String line=null;while((line=br.readLine())!=null){if("over".equals(line))break;bw.write(line.toUpperCase());bw.newLine();bw.flush();}//记得关闭流资源!!!br.close();bw.close();}}
需要记住,以上代码中键盘录入和控制台输出常常简写成以下形式

//键盘录入 和输出 最简洁写法,必须要记住//键盘录入BufferedReader in=new BufferedReader(new InputStreamReader(System.in));//输出BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out));
流操作基本规律

流的对象有很多,在实际开发应用中该选择哪个对象?通过三个明确来确定使用的流对象

1,明确源和目的

源:输入流 InputStream   和Reader

目的:输出流  OutputStream 和Writer

2,操作的对象是否是纯文本

是纯文本 ,用字符流

不是纯文本,用字节流

3,当体系明确后,再明确具体使用哪个对象,通过设备来区分

源设备:内存,硬盘,键盘

目的设备:内存,硬盘,控制台

代码示例:

需求:将文本数据打印到控制台上,按照三个明确

1,明确源和目的

源:InputStream 和Reader

目的:OutputStream 和Writer


2,明确是否为纯文本 

源:是纯文本 用 Reader

目的:不是纯文本 用OutStream


3,明确使用的具体对象

源:硬盘文件,确定了用FileReader,提高效率要用BufferedReader 

目的:控制台,确定了用System.out 输出流对象,需要用到OutputStreamWriter 转成字符流对象,提高效率用到BufferedWriter

import java.io.*;class  InputOutputTest2{public static void main(String[] args) throws IOException{BufferedReader in=new BufferedReader(new FileReader("iodemo.txt"));//创建字符输入流读取硬盘上的文件BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out));//创建字符输出流将读取的文件数据打印到控制台String line=null;while ((line=in.readLine())!=null){out.write(line);out.newLine();out.flush();//记得刷新}//关闭资源in.close();out.close();}}
File类

File 类是IO 包中比较重要的一个类,流操作的只有数据,而数据最常见的表现形式就是文件,文件包含了很对属性和行为信息,为了方便对文件和文件夹的属性进行操作,将文件和文件夹封装成对象 。File 对象可以作为参数传递给流的构造函数。

常用三种构造方法

File(String pathname)
          通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 

File(String parent,String child)
          根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

File(File parent,String child)
          根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

                //将“a.txt”文件封装成对象,可以是已有文件或文件夹也可以是不存在的File f1=new File("a.txt");//参数为父目录和文件名File f2=new File("c:\\abc","b.txt");//第三种构造函数File d=new File("c:\\abc");//文件夹封装成对象。父目录File f3=new File(d,"c.txt");
File类的常见方法

1,创建

boolean createNewFile() //在指定位置创建一个新的文件,如果文件存在,则不创建
返回false,和输出流不一样,输出流对象建立文件如果文件存在则原文件被覆盖 
boolean mkdir()//创建一级目录
boolean mkdirs()//创建多级目录

代码示例

public static void method_1()  throws IOException{File f1=new File("f1.txt");//定义文件对象//创建文件,返回布尔型,当文件存在,不会创建,返回值为falseboolean n1=f1.createNewFile();//创建一级目录File dir=new File("abc");//创建多级目录File dir2=new File("abc\\JDIWO\\DJIWQOJI\\HDWIUQHDdhwiu\\djwiqow");}

2,删除

boolean delete()//删除文件
boolean deleteOnExit();//在程序退出时删除文件

代码示例

public static void method_2() throws IOException{File f2=new File("f2.txt");boolean n2=f1.delete();//删除文件//boolean n2=fi.deleteOnExit()//在程序退出时删除}

3,判断
boolean canExecute();//判断程序是否可以执行
boolean canRead()//判断是否可以读取
boolean canWrite()//判断是否可以修改
int compareTo(File parthname)//比较
boolean exists();//重点,判断文件是否存在
boolean isDirectory();//判断是否为目录
boolean isFile();//判断是否为文件
boolean isHidden()//是否是隐藏的,不要访问隐藏文件
boolean isAbsolute()//判断此抽象路径名是否为绝对路径名

代码示例

public static void method_3()throws IOException{File f3=new File("abc");f3.isDirectory();//是否是目录(必须先判断文件是否存在)f3.isFile();//判断文件是否为文件(必须先判断文件是否存在)f3.isAbsolute();//不管文件是否存在,都可判断路径f3.exists();//对封装的对象判断是否是目录或者文件,必须判断对象是否存在用exists()判断f3.canExecute();//是否可执行f3.isHidden();//程序是否可是隐藏的f3.exists()//文件是否存在}


4,获取

String getName()//获取获取文件或目录的名称
String parent()//获取父目录路径,如果没有明确指出返回空
String path()//获取路径
String getAbsolutePath()//获取绝对路径
File getAbsoluteFile();//绝对抽象路径名
long lastModified//返回此抽象路径名表示的文件最后一次被修改的时间
long length()//返回由此抽象路径名表示的文件的长度
boolean renameTo()//重命名

代码示例

public static void method_4()throws IOException{File f4=new File("c:\\can\\c.txt");f4.getName()//获取文件名f4.getPath();//获取路径f4.getAbsolutePath();//获取绝对路径f4.length();//获取长度f4.renameTo("c:\\can\\l.txt")//重命名}

文件列表

当操作文件时,我们要将文件创建到机器上有效的盘符上,或者将文件存放到指定的盘符上,因此需要获取机器上的盘符,File类提供了获取盘符的方法listRoots()。

File[] listRoots()列出可用的文件系统根

public static void listRootsDemo() throws IOException{File[] file=File.listRoots();for (File f:file)//for的高级循环 遍历File数组中的元素 f是元素{System.out.println(f);}}
当需要遍历指定目录下的文件和文件夹时,用File 类的list()方法,当被指定的对象时目录时,返回该目录下的所有文件和文件夹包括隐藏文件,当指定的对象是文件时,会抛出NullPointerException,因此调用list方法的对象必须是目录,该目录必须存在

String list()    返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

public static void listDemo() throws IOException{File f=new File("c:\\");//调用list方法的对象必须是封装了一个目录String[] name =f.list();//遍历name数组中所有的元素,元素是String型,用s作参数 即遍历c盘目录下所有文件及目录for(String s:name){System.out.println(s);}}}
遍历指定目录下所有的内容,用File类的listFile() 方法,该方法返回的是File对象数组,可以用File 类的方法对数组中的File对象进行操作,当列出目录中的内容时,因为目录中还有目录只要用列出目录的功能即可,在列出的过程中出现的还是目录的话,还可以再次调用本功能这种表现形式或者编程手法,称为递归。

在使用递归时注意:
1,限定条件
2,限定递归次数,尽量避免溢出

代码示例

/*列出目录下的所有文件和文件夹,包括子目录
也就是遍历目录下的所有内容*/

import java.io.*;class  FileDemo4{public static void main(String[] args) {File f=new File("f:\\javawork");showDir(f);}public static void showDir(File dir){File[] arr=dir.listFiles();//用listFiles 返回目录下的所有文件对象for(int x=0;x<arr.length;x++)//遍历对象列出包括子目录下的所有内容,递归{if (arr[x].isDirectory()){showDir(arr[x]);//方法中再次调用该方法,递归}elseSystem.out.println(arr[x]);}}}
Properties

Properties 简述
Properties 是HashTable 的子类也就是具备Map集合的特点,对象中存储的都是键值对,而且里面存储的键值对都是字符串,不需要泛型
Properties 是集合中和IO 技术相结合集合的容器
该对象的特点:可以用于键值对形式的配置文件

为了能够使应用程序在下次运行时还保留上次的使用的配置,就将配置信息存储到文件中在文件执行时调用程序的配置信息。配置信息一般都是以键值对的形式存储的,当我们想要获取配置信息就要找到配置信息文件,就要用到IO流技术,而Properties 是和IO技术相结合的对象,它不仅可以操作键值对还可以操作硬盘上的键值对,并且还可以通过load()方法操作流中的信息,这就是Properties 的由来。

Properties 的应用
setProperty(String key,String value)//调用 Hashtable 的方法 put,设置键值对
getProperty(String key)//用指定的键在此属性列表中搜索属性值(方法名称的写法要记清,不是复数形式)
Set<String> stringPropertyNames()//返回属性列表中的键集,其中该键及其对应值是字符串(1.6版本出现的)

代码示例

public static void setAndGet(){Properties p=new Properties();p.setProperty("zhangsan","30");//设置Property 方法写法不是复数形式p.setProperty("lisi","28");//设置键和值//System.out.println(p);//打印Properties 集合String value=p.getProperty("lisi");//根据键获取值System.out.println(value);//打印值Set<String > name=p.stringPropertyNames();//返回键的集合,也就是所有的姓名的集合System.out.println(name);//取出姓名集合中的元素 可以不用迭代器,用循环for (String n:name ){//System.out.println(n);//打印键System.out.println(n+":"+p.getProperty(n));//打印键和值}                                                                                                                                                 }

Properties 存取配置文件

Properties  在加载数据时,数据要有固定的格式:键=值(键值对格式)

需求:将info.txt文件中键值数据存储到集合中

思路:

1,用流将info.txt 关联
2,读取一行数据将改行数据用“=”作切割点获取键和值
3,将切割到的键和值存入到Properties 集合中

从输入流中获取属性列表用到的方法

load(InputStream inStream)
load(Reader reader) JDK 1.6 才出现
将属性列表输出到指定输出流
list(PrintStream)//System.out是这个类型
list(PrintWriter)

class  PropertiesDemo2{public static void main(String[] args) throws IOException{loadDemo();}public static void loadDemo()  throws IOException{Properties p=new Properties();FileInputStream  fis=new FileInputStream("info.txt");//用FileInputStream关联文件文件内容是“键=值”型p.load(fis);//读取流中的内容//System.out.println(p);p.list(System.out);//将属性列表中的内容输出到控制台(System.out 是PrintStream 类型的)//当文件的数据信息错误,需要修改 这时直接修改集合中的信息即可p.setProperty("xixi","28");//设置要修改的信息,修改的信息还在内存中//定义输出流对象FileOutputStream  fos=new FileOutputStream("info.txt");p.store(fos,"hahaha");//将属性列表写入输出流,输出流以参数形式传入,注释信息“haha”传入p.list(System.out);}}


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

0 0
原创粉丝点击