------- 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里面的数据
}
else
sb.append((char)ch);//将整型ch强转成char类型,存储到缓冲区
}
}
}
读取转换流
以上的代码是读取键盘录入的一行数据,由此可以想到用字符流缓冲区BufferedReader 的ReadLine()方法就可以完成,但是键盘录入System.in的是字节流,那么就考虑将字节流如何转换成字符流,再使用字符流缓冲区BufferedReader 的方法,方便操作数据,java提供了读取转换流InputStreamReaderInputStreamReader 是字节流通向字符流的桥梁:它使用指定的 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;
//将字节流转换成字符流 用到OutputStreamWriter
OutputStreamWriter 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;
//将字节流转换成字符流 用到OutputStreamWriter
OutputStreamWriter 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");//定义文件对象
//创建文件,返回布尔型,当文件存在,不会创建,返回值为false
boolean 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]);//方法中再次调用该方法,递归
}
else
System.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);
}
}