长沙外贸建站哪里好,网站开发专业术语,校园网站建设中期报告,源码下载器#xff08;全部来自“韩顺平教育”#xff09;
IO流
一、文件
是保存数据的地方
2、文件流
文件在程序中是以流的形式来操作 流#xff1a;数据在数据源#xff08;文件#xff09;和程序#xff08;内存#xff09;之间经历的路径
输入流#xff1a;数据从数据…全部来自“韩顺平教育”
IO流
一、文件
是保存数据的地方
2、文件流
文件在程序中是以流的形式来操作 流数据在数据源文件和程序内存之间经历的路径
输入流数据从数据源文件到程序内存的路径
输出流数据从程序内存到数据源文件的路径 二、常用的文件操作
1、创建文件对象相关构造器和方法 举例如下
//方式 1 new File(String pathname)Testpublic void create01() {String filePath e:\\news1.txt;File file new File(filePath);try {file.createNewFile();System.out.println(文件创建成功);} catch (IOException e) {e.printStackTrace();}}//方式 2 new File(File parent,String child) //根据父目录文件子路径构建
//e:\\news2.txtTestpublic void create02() {File parentFile new File(e:\\);String fileName news2.txt;//这里的 file 对象在 java 程序中只是一个对象//只有执行了 createNewFile 方法才会真正的在磁盘创建该文件File file new File(parentFile, fileName);try {file.createNewFile();System.out.println(创建成功~);} catch (IOException e) {e.printStackTrace();}}//方式 3 new File(String parent,String child) //根据父目录子路径构建Testpublic void create03() {//String parentPath e:\\;String parentPath e:\\;String fileName news4.txt;File file new File(parentPath, fileName);try {file.createNewFile();System.out.println(创建成功~);} catch (IOException e) {e.printStackTrace();}}
2、获取文件的相关信息
getName、getAbsolutePath、getParent、length、exists、isFile、isDirectory //获取文件的信息Testpublic void info() {//先创建文件对象File file new File(e:\\news1.txt);//调用相应的方法得到对应信息System.out.println(文件名字 file.getName());//getName、getAbsolutePath、getParent、length、exists、isFile、isDirectorySystem.out.println(文件绝对路径 file.getAbsolutePath());System.out.println(文件父级目录 file.getParent());System.out.println(文件大小(字节) file.length());System.out.println(文件是否存在 file.exists());//TSystem.out.println(是不是一个文件 file.isFile());//TSystem.out.println(是不是一个目录 file.isDirectory());//F} 3、目录的操作和文件删除
mkdir创建一级目录、mkdirs创建多级目录、delete删除空目录或文件 三、IO流原理及流的分类
1、Java IO流原理 ①I/O是Input/Output的缩写I/O技术是非常实用的技术用于处理数据传输。如读/写文件网络通讯等 ②Java程序中对于数据的输入/输出操作以“流stream)”的方式进行。 ③Java.io包下提供了各种“流”类和接口用以获取不同种类饿数据并通过方法输入或输出数据 ④输入input读取外部数据磁盘、光盘等存储设备的数据到程序内存中 ⑤输出output将程序内存数据输出到磁盘、光盘等存储设备中 2、流的分类
①按操作数据单位不同分为字节流8bit二进制文件字符流按字符文本文件
②按数据流的流向不同分为输入流输出流
③按流的角色的不同分为节点流处理流/包装流
抽象基类字节流字符流输入流InputStreamReader输出流OutputStreamWriter
注Java的IO流共涉及40多个类实际上非常规则都是从如上4个抽象基类派生的。由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。 四、IO流体系图--常用的类 1、FileInputStream介绍 使用 FileInputStream 读取 hello.txt 文件并将文件内容显示到控制台
/**
* 演示读取文件...
* 单个字节的读取效率比较低
* - 使用 read(byte[] b)
*/Testpublic void readFile01() {String filePath e:\\hello.txt;int readData 0;FileInputStream fileInputStream null;try {//创建 FileInputStream 对象用于读取 文件fileInputStream new FileInputStream(filePath);//从该输入流读取一个字节的数据。 如果没有输入可用此方法将阻止。//如果返回-1 , 表示读取完毕while ((readData fileInputStream.read()) ! -1) {System.out.print((char)readData);//转成 char 显示}} catch (IOException e) {e.printStackTrace();} finally {//关闭文件流释放资源.try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}/**
* 使用 read(byte[] b) 读取文件提高效率
*/Testpublic void readFile02() {String filePath e:\\hello.txt;//字节数组byte[] buf new byte[8]; //一次读取 8 个字节.int readLen 0;FileInputStream fileInputStream null;try {//创建 FileInputStream 对象用于读取 文件fileInputStream new FileInputStream(filePath);//从该输入流读取最多 b.length 字节的数据到字节数组。 此方法将阻塞直到某些输入可用。//如果返回-1 , 表示读取完毕//如果读取正常, 返回实际读取的字节数while ((readLen fileInputStream.read(buf)) ! -1) {System.out.print(new String(buf, 0, readLen));//显示}} catch (IOException e) {e.printStackTrace();} finally {//关闭文件流释放资源.try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}
2、FileOutPutStream介绍
使用 FileOutputStream 在 a.txt 文件中写入 “helloworld”. , 如果文件不存在会创建 文件(注意前提是目录已经存在.)
/**
* 演示使用 FileOutputStream 将数据写到文件中,
* 如果该文件不存在则创建该文件
*/Testpublic void writeFile() {//创建 FileOutputStream 对象String filePath e:\\a.txt;FileOutputStream fileOutputStream null;try {//得到 FileOutputStream 对象 对象//1. new FileOutputStream(filePath) 创建方式当写入内容是会覆盖原来的内容//2. new FileOutputStream(filePath, true) 创建方式当写入内容是是追加到文件后面fileOutputStream new FileOutputStream(filePath, true);//写入一个字节//fileOutputStream.write(H);////写入字符串String str hsp,world!;//str.getBytes() 可以把 字符串- 字节数组//fileOutputStream.write(str.getBytes());/*write(byte[] b, int off, int len) 将 len 字节从位于偏移量 off 的指定字节数组写入此文件输出流*/fileOutputStream.write(str.getBytes(), 0, 3);} catch (IOException e) {e.printStackTrace();} finally {try {fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}3、FileReader和FileWriter
①FileReader相关方法 ②FileWriter常用方法 ③举例
//1) 使用 FileReader 从 story.txt 读取内容并显示/*** 单个字符读取文件*/Testpublic void readFile01() {String filePath e:\\story.txt;FileReader fileReader null;int data 0;//1. 创建 FileReader 对象try {fileReader new FileReader(filePath);//循环读取 使用 read, 单个字符读取while ((data fileReader.read()) ! -1) {System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();} finally {try {if (fileReader ! null) {fileReader.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 字符数组读取文件*/Testpublic void readFile02() {System.out.println(~~~readFile02 ~~~);String filePath e:\\story.txt;FileReader fileReader null;int readLen 0;char[] buf new char[8];//1. 创建 FileReader 对象try {fileReader new FileReader(filePath);//循环读取 使用 read(buf), 返回的是实际读取到的字符数//如果返回-1, 说明到文件结束while ((readLen fileReader.read(buf)) ! -1) {System.out.print(new String(buf, 0, readLen));}} catch (IOException e) {e.printStackTrace();} finally {try {if (fileReader ! null) {fileReader.close();}} catch (IOException e) {e.printStackTrace();}}}//2) 使用 FileWriter 将 “风雨之后定见彩虹” 写入到 note.txt 文件中, 注意细节.public class FileWriter_ {public static void main(String[] args) {String filePath e:\\note.txt;//创建 FileWriter 对象FileWriter fileWriter null;char[] chars {a, b, c};try {fileWriter new FileWriter(filePath);//默认是覆盖写入// 3) write(int):写入单个字符fileWriter.write(H);// 4) write(char[]):写入指定数组fileWriter.write(chars);// 5) write(char[],off,len):写入指定数组的指定部分fileWriter.write(韩顺平教育.toCharArray(), 0, 3);// 6) writestring写入整个字符串fileWriter.write( 你好北京~);fileWriter.write(风雨之后定见彩虹);// 7) write(string,off,len):写入字符串的指定部分fileWriter.write(上海天津, 0, 2);//在数据量大的情况下可以使用循环操作.} catch (IOException e) {e.printStackTrace();} finally {//对应 FileWriter , 一定要关闭流或者 flush 才能真正的把数据写入到文件try {//fileWriter.flush();//关闭文件流等价 flush() 关闭fileWriter.close();} catch (IOException e) {e.printStackTrace();}}}} 五、节点流和处理流
1、基本介绍
①节点流可以从一个特定的数据源读写数据如FileReader、FileWriter ②处理流也叫包装流是“连接”在已存在的流节点流或处理流之上为程序提供更为强大的读写功能也更加灵活如BufferedReader、BufferedWriter 2、节点流和处理流一览图 3、节点流和处理流的区别和联系 ①节点流是底层流/低级流直接跟数据源相接 ②处理流包装流包装节点流既可以消除不同节点流的实现差异也可以提供更方便的方法来完成输入输出 ③处理流也叫包装流对节点流进行包装使用了 修饰器设计模式不会直接与数据源相连 4、处理流的功能主要体现在以下两个方面
①性能的提高主要以增加缓冲的方式来提高输入输出的效率
②操作的便捷处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据使用更加灵活方便
5、处理流--BufferedReader和BufferedWriter
BufferedReader和BufferedWriter属于字符流是按照字符来读取数据的关闭时处理流只需要关闭外层流即可。
public class BufferedReader_ {public static void main(String[] args) throws Exception {String filePath e:\\a.java;//创建 bufferedReaderBufferedReader bufferedReader new BufferedReader(new FileReader(filePath));//读取String line; //按行读取, 效率高//说明//1. bufferedReader.readLine() 是按行读取文件//2. 当返回 null 时表示文件读取完毕while ((line bufferedReader.readLine()) ! null) {System.out.println(line);}//关闭流, 这里注意只需要关闭 BufferedReader 因为底层会自动的去关闭节点流//FileReader。bufferedReader.close();}
}
public class BufferedWriter_ {public static void main(String[] args) throws IOException {String filePath e:\\ok.txt;//创建 BufferedWriter//说明://1. new FileWriter(filePath, true) 表示以追加的方式写入//2. new FileWriter(filePath) , 表示以覆盖的方式写入BufferedWriter bufferedWriter new BufferedWriter(new FileWriter(filePath));bufferedWriter.write(hello, 韩顺平教育!);bufferedWriter.newLine();//插入一个和系统相关的换行bufferedWriter.write(hello2, 韩顺平教育!);bufferedWriter.newLine();bufferedWriter.write(hello3, 韩顺平教育!);bufferedWriter.newLine();//说明关闭外层流即可 传入的 new FileWriter(filePath) ,会在底层关闭bufferedWriter.close();}
}
6、处理流--BufferedInputStream和BufferedOutputStream public class BufferedCopy02 {public static void main(String[] args) {String srcFilePath e:\\a.java;String destFilePath e:\\a3.java;//创建 BufferedOutputStream 对象 BufferedInputStream 对象BufferedInputStream bis null;BufferedOutputStream bos null;try {//因为 FileInputStream 是 InputStream 子类bis new BufferedInputStream(new FileInputStream(srcFilePath));bos new BufferedOutputStream(new FileOutputStream(destFilePath));//循环的读取文件并写入到 destFilePathbyte[] buff new byte[1024];int readLen 0;//当返回 -1 时就表示文件读取完毕while ((readLen bis.read(buff)) ! -1) {bos.write(buff, 0, readLen);}System.out.println(文件拷贝完毕~~~);} catch (IOException e) {e.printStackTrace();} finally {//关闭流 , 关闭外层的处理流即可底层会去关闭节点流try {if(bis ! null) {bis.close();}if(bos ! null) {bos.close();}} catch (IOException e) {e.printStackTrace();}}}
}
7、对象流--ObjectInputStream和ObjectOutputStream 序列化和反序列化 ①序列化就是在保存数据时保存数据的值和数据类型 ②反序列化就是在恢复数据时恢复数据的值和数据类型 ③需要让某个对象支持序列化机制则必须让其类是可序列化的为了让某个类是可序列化的该类必须实现如下两个接口之一 Serializable //这是一个标记接口没有方法 Externalizable //该接口有方法需要实现建议使用上面的接口 ①对象流介绍
功能提供了对基本类型或对象类型的序列化和反序列化的方法
ObjectOutputStream提供序列化功能
ObjectInputStream提供反序列化功能 ②案例1使用 ObjectOutputStream序列化基本数据类型和一个Dog对象nameage并保存到data.dat文件中
public class ObjectOutStream_ {public static void main(String[] args) throws Exception {//序列化后保存的文件格式不是存文本而是按照他的格式来保存String filePath e:\\data.dat;ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(filePath));//序列化数据到 e:\data.datoos.writeInt(100);// int - Integer (实现了 Serializable)oos.writeBoolean(true);// boolean - Boolean (实现了 Serializable)oos.writeChar(a);// char - Character (实现了 Serializable)oos.writeDouble(9.5);// double - Double (实现了 Serializable)oos.writeUTF(韩顺平教育);//String//保存一个 dog 对象oos.writeObject(new Dog(旺财, 10, 日本, 白色));oos.close();System.out.println(数据保存完毕(序列化形式));}
}
③案例2使用ObjectInputStream读取data.dat并反序列化恢复数据
// 1.创建流对象
ObjectInputStream ois new ObjectInputStream(new FileInputStream(src\\data.dat));
// 2.读取 注意顺序
System.out.println(ois.readInt());
System.out.println(ois.readBoolean());
System.out.println(ois.readChar());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
System.out.println(ois.readObject());
System.out.println(ois.readObject());
System.out.println(ois.readObject());
// 3.关闭
ois.close();
System.out.println(以反序列化的方式读取(恢复)ok~);
④注意事项 a.读写顺序要一致 b.要求序列化或反序列化对象需要实现Serializable c.序列化的类中建议添加SerialVersionUID为了提高版本的兼容性 d.序列化对象时默认将里面所有属性都进行序列化但除了static或transient修饰的成员 e.序列化对象时要求里面属性的类型也需要实现序列化接口 f.序列化具备可继承性。也就是如果某类已经实现了序列化则它的所有子类也已经默认实现了序列化 8、标准输入输出流
类型默认设备System.in标准输入InputStream键盘System.out标准输出PrintStream显示器 9、转换流--InputStreamReader和OutputStreamWriter
①基本介绍 a.InputStreamReaderReader的子类可以将InputStream字节流包装成转换Reader字符流 b.OutputStreamWriterWriter的子类实现将OutputStream字节流包装成Writer字符流 c.当处理纯文本数据时如果使用字符流效率更高并且可以有效解决中文问题所以建议将字节流转换成字符流 d.可以在使用时指定编码格式比如utf-8gbkgb2312ISO8859-1等 ②例子1将FileInputStream包装成转换成字符流InputStreamReader对文件进行读取按照utf-8/gbk格式进而在包装成BufferedReader
public class InputStreamReader_ {public static void main(String[] args) throws IOException {String filePath e:\\a.txt;//解读//1. 把 FileInputStream 转成 InputStreamReader//2. 指定编码 gbk//InputStreamReader isr new InputStreamReader(new FileInputStream(filePath), gbk);//3. 把 InputStreamReader 传入 BufferedReader//BufferedReader br new BufferedReader(isr);//将 2 和 3 合在一起BufferedReader br new BufferedReader(new InputStreamReader(new FileInputStream(filePath), gbk));//4. 读取String s br.readLine();System.out.println(读取内容 s);//5. 关闭外层流br.close();}
}
③例子2将FileOutputStream包装成转换成字符流OutputStreamWriter对文件进行写入按照gbk格式
// 1.创建流对象
OutputStreamWriter osw
new OutputStreamWriter(new FileOutputStream(d:\\a.txt), gbk);
// 2.写入
osw.write(hello,韩顺平教育~);
// 3.关闭
osw.close();
System.out.println(保存成功~);
10、打印流--PrintStream和PrintWriter
打印流只有输出流没有输入流 六、Properties类 public class Properties01 {public static void main(String[] args) throws IOException {//读取 mysql.properties 文件并得到 ip, user 和 pwdBufferedReader br new BufferedReader(new FileReader(src\\mysql.properties));String line ;while ((line br.readLine()) ! null) { //循环读取String[] split line.split();//如果我们要求指定的 ip 值if(ip.equals(split[0])) {System.out.println(split[0] 值是: split[1]);}}br.close();}
} 1、基本介绍 ①专门用于读写配置文件的集合类 配置文件的格式 键值 ②注意键值对不需要有空格值不需要用引号一起来默认类型是String ③Properties的常见方法 2、应用案例1使用Properties类完成对mysql.properties的读取
public class Properties02 {public static void main(String[] args) throws IOException {//使用 Properties 类来读取 mysql.properties 文件//1. 创建 Properties 对象Properties properties new Properties();//2. 加载指定配置文件properties.load(new FileReader(src\\mysql.properties));//3. 把 k-v 显示控制台properties.list(System.out);//4. 根据 key 获取对应的值String user properties.getProperty(user);String pwd properties.getProperty(pwd);System.out.println(用户名 user);System.out.println(密码是 pwd);}
} 3、应用案例2使用Properties类添加key-val到新文件mysql2.properties中
public class Properties03 {public static void main(String[] args) throws IOException {//使用 Properties 类来创建 配置文件, 修改配置文件内容Properties properties new Properties();//创建//1.如果该文件没有 key 就是创建//2.如果该文件有 key ,就是修改properties.setProperty(charset, utf8);properties.setProperty(user, 汤姆);//注意保存时是中文的 unicode 码值properties.setProperty(pwd, 888888);//将 k-v 存储文件中即可properties.store(new FileOutputStream(src\\mysql2.properties), null);System.out.println(保存配置文件成功~);}
}