------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-----
一、流操作规律。
1、键盘输入输出System.in/Syste,.out和转换流InputStreamReader/OutputStreamReader。
1.1 标准键盘输入
System.in 键盘键入,输入的类型为字节。
System.out 向控制台输出字节。
1.2 InputStreamReader/OutputStreamReader
InputStreamReader是字节流通向字符流的桥梁:它使用指定的charset读取字节并将其解码为字符。其使用的字符集可以由名称指定或显示指定。
一般用法:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
OutputStreamWriter是字符流通向字节流的桥梁:它使用指定的charset将要写入的字符编码为字节。
一般用法:
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(System.out));
<示例1>标准输入输出和转换流
/* * 标准输入输出和转换流示例 */ import java.io.*; public class IoTest1 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader( (new InputStreamReader(System.in)));//将标准键盘输入字节流转换为缓冲字符流 BufferedWriter bw = new BufferedWriter( (new OutputStreamWriter(System.out)));//缓冲字符流的字符转换为字节向控制台输出 String s = null; while((s = br.readLine()) != null) { //读入从键盘输入的转换为字符流的字节流 if(s.equals("over")) break; bw.write(s.toUpperCase()); bw.newLine(); //换行 bw.flush(); //刷新 } br.close(); bw.close(); } }
Byte ---->InputStreamReader-----Char------>BufferedReader ------>BufferWriter--——Char--->OutputStreamWriter————>Byte
2、流操作规律。
1.1 规律总结:
1)两个明确:
明确流的源和目的。例子:想要将一个文件的数据打印到控制台上:源:文件 目的:控制台
2)操作的数据类型是否为纯文本。
是:字符流
不是:字节流
3)明确使用哪个具体的对象:
通过设备进行区分:
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
小练习:将键盘录入的数据存入一个文本文件中(按照特定编码表)。
思路:1、为了使操作键盘录入的数据比较方便,一般把键盘录入的字节转化为字符。BufferedReader br = new (BufferedReader(new InputStreamReader(System.in)));
2、用BufferedWriter 将接收的字节写入文本文件中。BuffereWriter bw = new BufferWriter(new FileWriter("目标文件.txt"));
3、指定编码表:把想要录入的字符数据按照特定的编码表录入(GBK / UTF-8).而FileWriter 使用的是默认的编码表,GBK.转换流 OutputStreamWriter可以传入字符集 参数。(转换流应用) 同样,FileReader只能读取GBK默认编码的文件。
<示例2>
/* * 将键盘输入的数据写入目标文件中 */ import java.io.*; public class IoTest1 { public static void main(String[] args) { BufferedReader br = null; //生命字符读取流 BufferedWriter bw = null;//声明缓冲字符流写入 String temp = null; try { br = new BufferedReader(new InputStreamReader(System.in)); //用OutputSteamWriter指定UFF-8编码,以字节形式写入文件中 bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(("d:\\喵咪咪.txt")),"utf-8")); while((temp = br.readLine()) != null) { if(temp.equals("end")) //结束标志 break; bw.write(temp); bw.newLine(); bw.flush(); } } catch(IOException e) { new RuntimeException("erro"); } finally { if(br != null) try { br.close(); } catch(IOException e) { new RuntimeException("erro"); } finally { if(bw != null) try { bw.close(); } catch(IOException e) { new RuntimeException("erro"); } } } }
1.2 System.setIn(InputStream in) ;/System.setOut(PrintStream out);:
改变标准输入输出。使不再从键盘中录入数据,不再向控制台写入。
<示例3>更改标准输出,将捕获的异常打印至文件中。
Properties ppt = System.getProperties();
ppt.list(System.out/new PrintStream("abc.txt"));
/* * 将键盘输入的数据写入目标文件中 */ import java.io.*; import java.text.*; //SimpleDateFormat import java.util.*; public class IoTest1 { public static void main(String[] args) { try { int arr[] = new int[10]; System.out.println(arr[11]); } catch(Exception e) { try { //获取系统时间,通过SimpleDateFormat sdf.format(d)方法将日期改成自定格式并传入字符串S Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String s = sdf.format(d); //建立打印流对象,作为参数传入System.Out()中,改变标准输出为D盘下的 LOG.TXT文件。 PrintStream ps = new PrintStream("D:\\LOG.txt"); ps.println(s); //ps.write(d.toString().getBytes()); System.setOut(ps); } catch(IOException e1) { new RuntimeException("找不到文件"); } e.printStackTrace(System.out); //输出异常 } } }
二、File类。
1、File简介。
1)Java中用File类抽象描述文件和文件夹,方便对文件和文件夹的属性信息进行操作。
2)弥补了流只能操作数据而不能操作文件的缺陷。
java.lang.Object
|-- java.io.File
实现接口:Serializable,Comparable<File>
Constructor:
File(String pathName)
File(String pathName ,String fileName)
获取系统分隔符方法:
<Stringng>Static sperator() (跨平台分隔符)
File a = new File("c"+File.seperator+"abc\\abc.txt")
2、常见方法。
1)创建
boolean createNewFile() throws IOException 是否创建成功,如果目录含有同名文件,创建失败,返回False.
注意:和输出流不同,输出流FileWriter("abc.txt")会覆盖同名文件。
createTempFile(String prefix,String suffix,File directory) 在指定目录中创建一个空文件,用给定的前后缀生成文件名。
boolean mkdir() 创建目录
File dir = new File("abc\\bca");
dir.mkdir();只能创建一级目录
boolean mkdirs() 创建多级目录
2)删除
boolean delete();
void deleteOnExit(); 在文件退出时删除,例如正在看视频文件无法删除该视频.avi,在视频播放结束后,自动删除。
3)判断
boolean canExecute() 文件是否可以执行
boolean canRead() boolean canWrite();
int compareTo(File pathName) 按照字母顺序比较两个抽象路径名
boolean exists() 文件是否存在
boolean isDirectory() 在判断对象是目录或是文件时候,首先要判断该对象是否存在。
boolean isFile()
boolean isHidden() 是否隐藏
boolean isAbsolute() 是否绝对路径
4)获取信息
String getName()
String getPath()
String getAbsolutePath()
String getParent() // 返回绝对路径的父目录或上级目录,前提是 new File("xxx\\xxx")
File getAbsoluteFile() 返回File对象类型的绝对路径 .toString();
long lastModified() //返回上一次文件被修改的时间 毫秒数
long length () 字节数
boolean reNameTo() //更改文件名 不同盘之间 (剪切复制)
File[] listRoots() 返回根目录
String[] list() 返回指定目录下文件和文件夹的名称。 File f = new File("c:\\"); String[] s = f.list(); for(String s : s) { sop(s)};
String[] list(FilenameFilter fnf)
File[] list()
File[] list(FilenameFilter fnf)
<示例3> 打印BaiduYunDownload目录下的文件名(过滤后):
/* * list(new FilenameFilter)方法: */ import java.io.*; public class IoTest1 { public static void main(String[] args) { printFilterFilename(); //调用过滤文件名打印函数 } public static void printFilterFilename() { File f = new File("F:\\BaiduYunDownload\\第01天"); //创建文件目录对象 FilenameFilter fnf = new FilenameFilter() { //匿名抽象类,重写accept方法,参数为目录名和文件名 public boolean accept(File dir,String name) { return name.endsWith(".avi"); } }; String[] names = f.list(fnf); //f.list方法返回过滤后的文件名 for(String name : names) { //foreach循环 System.out.println(name); } } }
3、综合运用
3.1递归调用:列出文件夹下的所有文件夹和文件。
/*思路:列出指定目录下的所有内容,目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中仍会出现目录,这时还应该调用本函数。这种表现形式称之为递归调用。
*/
<示例4>列出文件夹下的所有内容:
/* * 递归调用 */ import java.io.*; public class IoTest1 { public static void main(String[] args) { showDir(new File("E:\\CROSSGATE\\DATA"),0); } public static String getLevel(int n) { StringBuilder sb = new StringBuilder(); for(int i = 0; i < n;i++) {
sb.append("| "); } return sb.toString(); } public static void showDir(File f,int count) { System.out.println(getLevel(count)+f); count ++;
File[] fs = f.listFiles();
for(int i = 0; i < fs.length;i++ ) { //遍历 File[] 数组 if(fs[i].isDirectory()) { //如果fs[i]是文件夹,则继续调用showDir方法、 showDir(fs[i],count);
} else //一直到fs[i]是文件,打印输出。 System.out.println(getLevel(count)+ "|——"+fs[i]); } } }
//效果如图
3.2 小练习 将一个指定目录的.avi文件路径存储到一个文本文件当中。
/*思路:1、根据要求,需要操作的数据类型是 “JAVA的文件路径”,String s = f.getAbsolutePath();
因此需要得到每一个文件的文件名,这就需要一个文件数组,存放所有的文件,并且遍历这个数组,得到每一个文件的文件名。
2、要取出所有的.avi文件则需要过滤,可以用f.list(FilenameFilter),也可以通过取出的字符串的 boolean name.endsWith();来充当判断条件。
3、用BufferWriter 将这些字符串文件名中的写入目标文件。
import java.io.*; public class IoTest1 { public static void main(String[] args) throws IOException { File f = new File("F:\\BaiduYunDownload"); BufferedWriter bw = new BufferedWriter( new FileWriter("D:\\hahaavi.txt")); printtotext(f,bw); } public static void printtotext (File f ,BufferedWriter bw) throws IOException { File[] fs = f.listFiles(); //将源文件夹下的所有文件夹和文件存入数组fs中 for(File ff : fs) { //遍历数组元素 if(ff.isDirectory()) { //递归 printtotext(ff,bw); } else if(ff.getAbsolutePath().endsWith(".avi")) { //如果是文件且是avi格式文件 String s = ff.getAbsolutePath(); //则将文件绝对路径传入字符串s中。 bw.write(s); //字符输出流将字符串写入文件。 bw.newLine(); bw.flush(); } } } }
三、Properties。
1、Properties简介
Properties是Hashtable的子类,因此具备了map集合的特点,其存储的键值对都是字符串。
是集合中和IO技术相结合的集合容器。
该对象的特点:可以用于键值对形式的配置文件。
比如php.in配置文件中的配置信息就是以键值对的形式出现的“mysql.dll = on"
Properties就是这样一个可以去操作硬盘上键值对的对象。
2、常用方法:
void load(InputStream in) //从输入流中读取属性列表。
void setProperty(String s1,String s2) //调用map集合的put方法存入键值对。
String getProperty(s1) //获取键“s1”的值
Set<String> stringProrpertNames() ; //将所有键值对的键传入set集合中并返回
void store(OutputStream os ,String 注释)
<示例> 将配置文件info.txt中的键值对存入properties中。
思路: 1、建立输入流对象读取Info.txt中的字符,并转换为字符串。 用readLine();
2. 将字符串按照“=”切割后存入两个不同的字符串中。 str.split("=");
3.调用setProperty(str1,str2)存入Properties集合中。//这三步可以用porperties的load方法实现。
public class IoTest1 { public static void main(String[] args) throws IOException { //method_1(); Properties prop2 = new Properties(); prop2.load(new FileReader("info.txt")); //load方法直接读取并存储 prop2.setProperty("haha","2323"); prop2.store(new FileOutputStream("info.txt"), null); } public static void method_1() throws IOException { BufferedReader br = null ; String str = null; br = new BufferedReader(new FileReader("info.txt")); Properties prop = new Properties(); while((str = br.readLine()) != null) { String[] ss = str.split("="); //切割字符串放入两个字符串数组 prop.setProperty(ss[0], ss[1]); //存入集合中 } } }
<小练习>记录程序运行次数。
思路:1、如果用计数器的方式来计数,那么在程序运行结束后,在内存中的count变量也将被清楚,所以要用Properties的方式将运行次数以键值对的形式从硬盘存取。
2、建立配置文件“count.ini”,建立字符流对象,建立Properties对象,load()方法读取,setProperty()方法设置,load方法读取(建立OutputStream对象)。代码如下咯:
import java.io.*; import java.util.*; public class IoTest1 { public static void main(String[] args) throws IOException { Properties prop = new Properties(); File f = new File("D:\\count.ini"); if(!f.exists()) { f.createNewFile(); } BufferedReader br = new BufferedReader(new FileReader(f)); FileWriter fw = new FileWriter(f); prop.load(br); int count = 0; String value = prop.getProperty("times"); if(value != null) count = Integer.parseInt(value); count++; prop.setProperty("times", count+""); prop.store(fw, "啦啦啦德玛西亚"); fw.close(); br.close(); } }
XML文档
<persons>
<person id = 1>
<name>JOHN</name>
<age>25<age>
</person>
</persons>
dom4j : documents for java :是一个很好的工具,用于java操作 从XML文档中读取数据。