一、 数据流的基本概念
1.数据流
在Java中把不同的数据源与程序之间的数据传输都抽象表述为“流”(stream),以实现相对统一和简单的输入/输出操作方式。传输中的数据就像流水一样,也称为数据流。
2 .I/O数据流的分类方式
数据流分为输入流和输出流两类。输入流只能读取不能写。而输出流只能写不能读。(这里站在程序的角度来确定出入方向,即将数据从程序外部传送到程序中谓之“输入”数据,将程序中的数据传送到外部谓之“输出”数据。
)
3.缓冲流(Buffered Stream)
对数据流的每次操作都是以字节为单位进行的,既可以向输出流写入一个字节,也可从输入流中读取一个字节。显然效率太低,通常使用缓冲流,即为一个流配置一个缓冲区,一个缓冲区就是专门传送数据的一块内存。
4.数据源(Data Sourcc):是指那些能够提供数据的地方,包括键盘、磁盘文件、网络接口等。
5.数据宿(Data Sink):指能够接收数据的地方,可以是磁盘文件、网络接口以及显示器、打印机等外部设备。(数据宿也可认为是数据传输的目的地)
二、节点流和处理流
根据数据流所关联的是数据源还是其他数据流,可分为节点流(Node Stream)和处理流(Processing Stream)
节点流可以从/向一个特定的地方读/写数据。
处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现增强的数据读/写功能,处理流并不直接连接到数据源。
三、 字符流
1.字符输入流Reader
Reader类为所有面向字符的输入流的超类,声明为java.io中的抽象类。
public int read():读取一个字符,返回的是读到的那个字符。如果读到流的末尾,返回-1。
public int read(char[] cbuf):将读到的字符存入指定的数组中,返回的是实际读取的字符数。如果读到流的末尾,返回-1。
public abstract int read(char[] cbuf,int off,int len):将读到的字符存入数组的指定位置(off),每次最多读len个字符,返回实际读取的字符数。如果读到流的末尾,返回-1。
close():读取字符其实用的是window系统的功能,使用完毕后,进行资源的释放。
2.字符输出流writer
Weiter类为所有面向字符的输出流的超类,声明为java.io中的抽象类。
public void write(int c):将一个字符写入到流中。
public void write(char[]):将数组中的字符依次写出。
public abstract void write(char[] bcbuf,int off,int len):将数组中下标off开始的len个字符写出。
public void write(String):将一个字符串写入到流中。
public abstract void flush():刷新流,将流中的数据刷新到目的地中,流还存在。
public abstreact void close():关闭资源,关闭前会先调用flush,刷新流中的数据去目的地,然后流关闭。
四.
File():构造函数,一般是依据文件所在的指定位置来创建文件对象。 CanWrite():返回文件是否可写。 CanRead():返回文件是否可读。 CompareTo(File pathname):检查指定文件路径间的顺序。 Delet():从文件系统内删除该文件。 DeleteOnExit():程序顺利结束时从系统中删除文件。 Equals(Object obj):检查特定对象的路径名是否相等。 Exists():判断文件夹是否存在。 GetAbsoluteFile():返回文件的完整路径。 GetAbsolutePath():返回文件的完整路径。 GetName():返回文件名称。 GetParent():返回文件父目录路径。 GetPath():返回文件的潜在相对路径。 GetParentFile():返回文件所在文件夹的路径。 HashCode():返回文件哈希码。 IsDirectory():判断该路径指示的是否是文件。 IsFile():判断该路径指示的是否是文件。 LastModified() :返回文件的最后修改时间标志。 Length():返回文件长度。 List():返回文件和目录清单。 Mkdir():生成指定的目录。 RenameTo(File dest):更名文件。 SetReadOnly():将文件设置为可读。 ToString():返回文件状态的字符串。 ToURL():将文件的路径字符串转换成URL File.GetCreationTime 读取创建时间 file.SetCreationTime 设置创建时间 File.GetLastAccessTime 读取最后访问时间 File.SetLastAccessTime 设置最后访问时间 File.GetLastWriteTime 读取最后修改时间 File.SetLastWriteTime 设置最后修改时间 File.GetAttributes 读取文件属性
File.SetAttributes 设置文件属性
4.1 判断方法
1 boolean canExecute() 判断文件是否可以执行
2 boolean canRead() 判断文件是否可读
3 boolean canWrite() 判断文件是否可写
4 boolean exist() 判断文件是否存在
5 boolean isDirectory() 判断文件是目录
6 boolean isFile() 判断是否是文件
7 boolean canHidden() 判断文件是否可见
8 boolean isAbsolute() 判断文件是否是绝对路劲 ,文件不存在也能判断
4.2获取方法
1.String getName()
2.String getPath() 3.String getAbsolutePath() 4.String getParent()//如果没有父目录返回null 5.long lastModified()//获取最后一次修改的时间 6.long length() 7.boolean renameTo(File f) 8.File[] liseRoots()//获取机器盘符9.String[] list()10.String[] list(FilenameFilter filter)
五。代码实例方法使用:
package com.rimi.week6_1;
import java.io.BufferedReader;
import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Arrays;import java.util.Date;public class Test1 {
public static void main(String[] args) { String fName="889923,txt"; //fw(fName,"afiokjh"); //fw("book.txt","abacedfawgajppjp1234569"); //fr( "book.txt"); //fr2( fName); //fd( "book.txt");// fw("s8c.txt","woaibijxjijs");
// fw("des.txt","123"); //copyContent( "s8c.txt", "des.txt"); //fw("sb.txt","w123"); //appendContent("sb.txt","woqisilile "); //tempFile(); //fw("123.txt","woaibaoxoe"); //changeDate(); //getFileSize("wqe.txt","sfwofio"); //changeName();// changeChmod(); //ifExist("weo"); //createDir("/Users/rimi/Desktop/1/2/3/4/5/6"); //delete("/Users/rimi/Desktop/1");// createDir( "/Users/rimi/Desktop/.j1702");//创建隐藏文件//isHidden("/Users/rimi/Desktop/.j1702");//判断是不是隐藏文件int index=0;
// printDirsStruct("/Users/rimi/Desktop/java1702",index); //printFile("/Users/rimi/Desktop/java1702"); //FileDemo3 (); FileDemo5 ();}public static void printFile(String fileName){ File file =new File (fileName);//返回由此抽象路径名表示的文件或目录的名称。 if(file.isDirectory()){ System.out.println(fileName+file.isDirectory()); } System.out.println(file.getName()); for (String se : file.list()) { File qu=new File(se); System.out.println("文件结构:"+qu); }}
//打印文件的目录结构public static void printDirsStruct(String fileName,int index){ File file =new File(fileName); System.out.println(fileName+file.isDirectory()); if(file.isDirectory()){ for(int i=0;i<index;i++){ System.out.print("_"); } System.out.println(file.getName()); for (String su : file.list()) { String newfile=fileName+"/"+su; File fq=new File(newfile); // System.out.println("目录结构:"+newfile); if(fq.isDirectory()){ printDirsStruct(newfile,(index+2)); } } } }
//判断是不是隐藏文件public static void isHidden(String fileName){ File file =new File (fileName); if(file.isHidden()){ System.out.println(file+"是隐藏文件吗?"+file.isHidden()); }}
//递归删除目录
public static void delete(String path){
File file=new File(path);//打开这个file文件 if(file.isDirectory()){ //2.判断这个file是不是目录 if(file.list().length>0){ //3.如果是目录,判断里面还有没有子目录 for (String fw : file.list()) { //4.如果有子目录就继续调用本方法 String arr=path+"/"+fw; System.out.println("arr"+arr); delete(arr);//调用本身的时候就停止下面的代码执行 } } } if(file.delete()){//如果 System.out.println(path+"目录删除成功"); }}//创建目录public static void createDir(String path){ File file =new File (path); //file.mkdir();创建单个目录//System.out.println("成功创建目录"+path+file.mkdirs()); if(file.mkdirs()){ System.out.println("创建目录成功"); }else{ System.out.println("创建目录失败"); }}
//判断文件和目录是否存在
//file.exists()句柄,检测文件是否存在public static void ifExist(String fileName){ try{ File file=new File(fileName); System.out.println(fileName+"文件存在吗?"+file.exists()); }catch(Exception e){ }} //设置文件只读public static void changeChmod() { try { File file=new File("sb.txt"); System.out.println("设置文件为只读成功了吗?"+file.setReadOnly()); System.out.println("文件可以写入吗?"+file.canWrite()); }catch(Exception e){ }}//文件的重命名
public static void changeName() { try { File oldName = new File("123.txt"); File newName=new File("wer.txt"); if(oldName.renameTo(newName)) { System.out.println("已 重命名"); }else { System.out.println("Error"); } }catch(Exception e) { }}//获取文件的大小//fw.isFile()测试此抽象路径名表示的文件是否是一个标准文件//fw.exists()判断这个文件存不存在public static void getFileSize(String fileName,String content) { try { File fw=new File(fileName); FileWriter fm=new FileWriter(fw); fm.write(content); fm.close(); if(!fw.exists()||!fw.isFile() ){ System.out.println("文件不存在"); } System.out.println(fileName+"的大小是:"+fw.length()); }catch(Exception e) { }}
//修改文件最后的修改日期
public static void changeDate(){ try { File fl = new File("sb.txt"); // fl.createNewFile(); Date filetime = new Date(fl.lastModified());//获取最后修改时间 System.out.println("修改之前"+filetime.toString()); //输出时间 //设置最后修改时间 System.out.println("修改时间是否成功"+fl.setLastModified(System.currentTimeMillis()+1000000)); filetime = new Date(fl.lastModified());//获取最后修改后的最后修改时间 System.out.println("修改之后:"+filetime.toString()); } catch (Exception e) { // TODO: handle exception }}//创建临时文件
//file.exists()表示判断文件是否存在public static void tempFile() { File file=new File("tempTest.txt"); if(file.exists()) { System.out.println("文件已经存在"); }else { System.out.println("文件不存在"); try { FileWriter fw=new FileWriter(file); fw.write("dfhiowjf"); fw.close(); file.createNewFile(); System.out.println("创建临时文件成功"); file.deleteOnExit();//文件在程序退出的时候被删除 Thread.sleep(10000);//文件显示停留10秒, }catch(Exception e) { } }}//追加文件内容public static void appendContent(String fileName,String content) { try { BufferedWriter bw = new BufferedWriter(new FileWriter(fileName)); bw.write("w123"); bw.close(); bw=new BufferedWriter(new FileWriter(fileName,true)); bw.write(content); bw.close(); }catch(Exception e){ }}
//文件内容的复制 src 要被复制的文件, des 接收复制内容的文件
public static void copyContent(String src,String des) { try { // 源文件 InputStream in =new FileInputStream(new File(src)); // 目标文件 OutputStream out=new FileOutputStream(new File(des)); //1.创建每次读取的大小 byte[]buf=new byte[100]; int len; //读写 while((len =in.read(buf))>0) { out.write(buf,0,len); } in.close(); out.close(); }catch(Exception e) { }} //删除文件//File 文件句柄public static void fd(String fName) { try{ // 获取文件句柄 File f=new File(fName); //判断是否被删除 if(f.delete()) { System.out.println("文件删除成功"); }else { System.out.println("文件删除失败"); } }catch(Exception e) { }} /*读取文件里面的内容 * readLine()读取一个文本行。 BufferedReader 获取文件读取句柄,读取文件内容() */public static void fr2(String fName) { try { FileReader fr=new FileReader(fName); BufferedReader br =new BufferedReader(fr); String str; while ((str=br.readLine())!=null){ System.out.println(str); } br.close();//关流 fr.close(); }catch(IOException e) { }}
//读取文件里面的内容
//FileReader 文件读句柄//fr.read(ca,0,15)ca 表示读取的数组名0表示从什么位置开始读取15表示读取的长度//“IoException“(流异常,通常用在文件读取中)是”Exception”(用在所有的异常处理中)的一个分支,//也就是说“Exception”的范围更大public static void fr(String fName) { try { FileReader fr=new FileReader(fName); char[]ca=new char[14]; fr.read(ca, 4, 10); System.out.println("ca==="+Arrays.toString(ca)); fr.close(); }catch(Exception e) { e.printStackTrace(); }}
//创建文件名为rtuw.txt内容为afiokjh
public static void fw(String fName, String content) { try { FileWriter fw =new FileWriter(fName); fw.write(content); fw.close(); }catch(IOException e) { }}// 列出磁盘下的文件和文件夹
public static void FileDemo3 (){ File[] files =File.listRoots(); for(File file:files){ System.out.println(file); if(file.length()>0){ String[] filenames =file.list(); for(String filename:filenames){ System.out.println(filename); } } } }// 利用递归列出所有文件public static void FileDemo5 (){ File f =new File("/Users/rimi/Desktop"); showDir(f); } public static void showDir(File dir){ System.out.println(dir); File[] files =dir.listFiles(); for(File file:files){ if(file.isDirectory()) showDir(file); else System.out.println(file); } }public
static void FileDemo4() {
File[] files =File.listRoots();
for
(File file:files){
System.out.println(file);
if
(file.length()>
0
){
String[] filenames =file.list(
new
FilenameFilter(){
//file 过滤目录 name 文件名
public
boolean
accept(File file,String filename){
return
filename.endsWith(
".mp3"
);
}
});
for
(String filename:filenames){
System.out.println(filename);
}
}
}
}
}
六。file 文档流综合应用
package com.rimi.week6_1;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.util.Scanner;/* * 基于文件系统存储的 ATM 用户系统 * 功能: 注册,登陆,存钱,取钱,注销 * 1.每一个用户账户创建一个文件 * 2。文件名使用用户名定义 * 3.密码为6位 * 4.最多只能存100万,超过提示钱太多了 * 5.注销的时候要注意,账户里面没有钱 * 6.注册的时候要注意,密码必须为6位 * 7.判断账号是否重复 * 8.取钱要注意余额够不够 * 9.所有操作都可以循环进行 * */public class NewAtm { public static void main(String[] args) throws Exception { System.out.println("********欢迎使用花旗银行*********"); System.out.println("请输入选项:1.注册 2.登陆 "); Scanner in=new Scanner(System.in); int function=in.nextInt(); if(function==1){ register(); } if(function==2){ login(); }}//************注册账号*******************public static void register()throws Exception{ System.out.println("请输入注册的账号(账号长度为9位数):"); Scanner in=new Scanner(System.in); String account=in.next(); if(account.length()==9){ File file =new File(account); if(!file.exists()){ a1: while(true){ System.out.println("请输入账户密码(密码的长度为6位):"); String password=in.next(); if(password.length()==6){ System.out.println("请再次输入账户密码:"); String password1=in.next(); if(password.equals(password1)){ System.out.println("请输入开户金额:"); String Money=in.next(); if(!ifCharacter(Money)){ FileWriter fw = new FileWriter(account); BufferedWriter bw = new BufferedWriter(new FileWriter(account,true)); String account1=account+password+Money; bw.write(account1); fw.close(); bw.close(); System.out.println("恭喜你账号注册成功"); System.out.println("你的账户信息为:"); System.out.println("账号为"+account+"\n"+"密码为:"+password+"\n"+"账户余额为:"+Money+"元"+"\n"); login(); return; }else { System.out.println("你输入的不是有效数字!请重新输入:"); register(); System.out.println("请选择:1. 退出系统"); int b=in.nextInt(); if(b==1) { return; } } }else{ System.out.println("两次输入的密码不一样"); continue a1; } }else{ System.out.println("你输入的账号长度不正确,请重新输入"); continue a1; } } }else{ System.out.println("你输入的账号已经存在!请选择:1.重新输入 2.登录账号"); int v=in.nextInt(); switch(v) { case 1: register(); break; case 2:login(); break; } } } else{ System.out.println("你输入的账号长度不正确,请重新输入!"); register(); } }//**********登录页面****************public static void login() throws Exception{ System.out.println("请输入账号:"); Scanner in=new Scanner(System.in); String account=in.next(); File file =new File(account); if(file.exists()){ System.out.println("账号存在"); System.out.println("请输入你的密码:"); String newpassword=in.next(); FileReader fr = new FileReader(account); // BufferedReader 创建一个文件内容读取句柄 BufferedReader br = new BufferedReader(fr); String str = br.readLine(); String s =str.substring(9,15); fr.close(); if(s.equals(newpassword)){ System.out.println("密码验证成功"); longin1(account); }else{ System.out.println("密码验证失败"); System.out.println("你的账号不存在!1.注册新账号 2.重新输入"); int function=in.nextInt(); if(function==1){ register(); } if(function==2){ login(); } } }else{ System.out.println("账号不存在!1.注册新账号 2.退出"); int Options=in.nextInt(); if(Options==1){ register(); } if(Options==2){ System.out.println("欢迎使用花旗银行!"); return; } } }//************登录页面1************public static void longin1(String account) throws Exception{ System.out.println("请输入选项:1.查询 2.存钱 3.取钱 4.注销账号 5.修改密码 6.退出系统"); Scanner in=new Scanner(System.in); int function1=in.nextInt(); if(function1==1){ Inquiry(account); } if(function1==2){ saveMoney(account); } if(function1==3){ drawMoney(account); } if(function1==4){ writeOff(account); } if(function1==5){ ChangePassword( account ); } if(function1==6) { System.out.println("欢迎使用花旗银行!"); return; }} //*************查询*********** public static void Inquiry(String account) throws Exception{ FileReader fr = new FileReader(account); // BufferedReader 创建一个文件内容读取句柄 BufferedReader br = new BufferedReader(fr); String str = br.readLine(); String s =str.substring(15,str.length()); System.out.println("账户余额为:"+s); fr.close(); System.out.println("请选择: 1.返回 2.退出系统"); Scanner in=new Scanner (System.in ); int Options1=in.nextInt(); if(Options1==1){ longin1( account); } if(Options1==2){ System.out.println("欢迎使用花旗银行!"); }} //***********存钱******************public static void saveMoney( String account) throws Exception{ Scanner in=new Scanner(System.in); System.out.println("请存入金额(最多存入100万):"); String newMoney=in.next(); if(!ifCharacter(newMoney)){ Double cMoney = Double.valueOf(newMoney); if(cMoney>1000000){ System.out.println("对不起!你输入的金额已经超限!"); System.out.println("请选择:1.重新输入 2.返回"); int b=in.nextInt(); switch(b){ case 1:saveMoney( account); break; case 2: longin1(account); break; } }else{ cMoney = Double.valueOf(newMoney); FileReader fr = new FileReader(account); // BufferedReader 创建一个文件内容读取句柄 BufferedReader br = new BufferedReader(fr); String str = br.readLine(); String s2 =str.substring(0,15); String s =str.substring(15,str.length()); fr.close(); try { Double b = Double.valueOf(s); Double Money1=cMoney+b; String Money2 = String.valueOf(Money1); BufferedWriter bv = new BufferedWriter(new FileWriter(account)); bv.write(s2+Money2); bv.close(); System.out.println("存钱已经完成!"); System.out.println("账户余额为:"+Money1); fr.close(); System.out.println("请选择:1.返回 2.退出系统"); int u=in.nextInt(); if(u==1){ longin1(account); } if(u==2){ System.out.println("欢迎使用花旗银行!"); } } catch (NumberFormatException e) { e.printStackTrace(); } } }else{ System.out.println("你输入的不是有效数字,请重新输入!"); saveMoney(account); } }//*************取款******************public static void drawMoney(String account) throws Exception{ Scanner in=new Scanner(System.in); System.out.println("请输入取款金额:"); String newMoney1=in.next(); if(!ifCharacter(newMoney1)){ Double cMoney1 = Double.valueOf(newMoney1); FileReader fr = new FileReader(account); // BufferedReader 创建一个文件内容读取句柄 BufferedReader br = new BufferedReader(fr); String str = br.readLine(); String s2 =str.substring(0,15); String q =str.substring(15,str.length()); fr.close(); br.close(); Double OldMoney = Double.valueOf(q); if(cMoney1>OldMoney){ System.out.println("对不起!你金额不足!"); System.out.println("请选择:1.重新输入 2.返回"); int b=in.nextInt(); switch(b){ case 1: drawMoney( account); break; case 2: longin1(account); break; } }else{ try { Double Money1=OldMoney-cMoney1; String Money2 = String.valueOf(Money1); BufferedWriter bv = new BufferedWriter(new FileWriter(account)); bv.write(s2+Money2); bv.close(); System.out.println("取款已经完成!"); System.out.println("账户余额为:"+Money1); fr.close(); System.out.println("请选择:1.返回 2.退出系统"); int u=in.nextInt(); if(u==1){ longin1(account); } if(u==2){ System.out.println("欢迎使用花旗银行!"); } } catch (NumberFormatException e) { e.printStackTrace(); } } }else{ System.out.println("你输入的不是有效数字,请重新输入!"); saveMoney(account); } }//***************注销*************public static void writeOff(String account) throws Exception{ FileReader fr = new FileReader(account); BufferedReader br = new BufferedReader(fr); String str = br.readLine(); String q =str.substring(15,str.length()); fr.close(); br.close(); Double OldMoney = Double.valueOf(q); if(OldMoney>0) { System.out.println("你的账户中有余额,不能注销!"); System.out.println("请选择:1.返回 2.退出系统"); Scanner in=new Scanner(System.in); int b=in.nextInt(); if(b==1){ longin1(account); } if(b==2){ System.out.println("欢迎使用花旗银行!"); } }else { try { File f=new File(account); if(f.delete()) { System.out.println("账户注销成功!"); return; }else { System.out.println("账户注销失败!"); return; } }catch(Exception e) { } }}public static void ChangePassword(String account ) throws Exception{ System.out.println("请输入原始密码:"); Scanner in=new Scanner (System.in); String oldPassword=in.next(); FileReader f =new FileReader(account); BufferedReader bn=new BufferedReader(f); String mb =bn.readLine(); String vn=mb.substring(9,15); String vn1=mb.substring(0, 9); String vn2=mb.substring(15,mb.length()); f.close(); bn.close(); if(oldPassword.equals(vn)){ System.out.println("请输入新密码:"); String newpass1=in.next(); System.out.println("请再次输入新密码:"); String newpass2=in.next(); if(newpass1.equals(newpass2)){ File file=new File(account); FileWriter xin=new FileWriter(file); xin.write(vn1+newpass1+vn2); xin.close(); System.out.println("恭喜你密码已修改成功!"); System.out.println("请选择:1.返回上一层 2.退出系统"); int xu1=in.nextInt(); if(xu1==1){ longin1(account); } if(xu1==2){ System.out.println("欢迎您使用花旗银行!"); return; } }else{ System.out.println("你两次输入的密码不一样!"); System.out.println("请选择:1.重新输入 2.返回上一层"); int xu=in.nextInt(); if(xu==1){ ChangePassword( account ); } if(xu==2){ longin1(account); } } }else{ System.out.println("你输入的原始密码有误!请重新输入:"); ChangePassword(account ); } }public static boolean ifCharacter(String sw){ for(int i=0;i