25.java中IO流的应用---缓冲流、转换流以及对象流过程(附讲解和练习)
处理流之一:缓冲流
为了提高数据读写的速度, Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。
缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:
》BufferedInputStream 和 BufferedOutputStream
》BufferedReader 和 BufferedWriter
当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区
当使用BufferedInputStream读取字节文件时, BufferedInputStream会一次性从文件中读取8192个(8Kb), 存在缓冲区中, 直到缓冲区装满了, 才重新从文件中读取下一个8192个字节数组。
向流中写入字节时, 不会直接写到文件, 先写到缓冲区中直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区的内容全部写入输出流
关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可, 关闭最外层流也会相应关闭内层节点流
flush()方法的使用:手动将buffer中内容写入文件
如果是带缓冲区的流对象的close()方法, 不但会关闭流, 还会在关闭流之前刷新缓冲区, 关闭后不能再写出
1.缓冲流:
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWriter
2.作用:提供流的读取、写入的速度
提高读写速度的原因:内部提供了一个缓冲区
3.处理流,就是“套接”在已有的流的基础上。
下面展示一些 实现非文本文件的复制
。
/*实现非文本文件的复制*/@Testpublic void BufferedStreamTest() throws FileNotFoundException {BufferedInputStream bis = null;BufferedOutputStream bos = null;try {//1.造文件File srcFile = new File("爱情与友情.jpg");File destFile = new File("爱情与友情3.jpg");//2.造流//2.1 造节点流FileInputStream fis = new FileInputStream((srcFile));FileOutputStream fos = new FileOutputStream(destFile);//2.2 造缓冲流bis = new BufferedInputStream(fis);bos = new BufferedOutputStream(fos);//3.复制的细节:读取、写入byte[] buffer = new byte[10];int len;while((len = bis.read(buffer)) != -1){bos.write(buffer,0,len);// bos.flush();//刷新缓冲区}} catch (IOException e) {e.printStackTrace();} finally {//4.资源关闭//要求:先关闭外层的流,再关闭内层的流if(bos != null){try {bos.close();} catch (IOException e) {e.printStackTrace();}}if(bis != null){try {bis.close();} catch (IOException e) {e.printStackTrace();}}//说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略.
// fos.close();
// fis.close();}}
下面展示一些 实现文件复制的方法(绝对路径),调整字节处理速度
。
//实现文件复制的方法public void copyFileWithBuffered(String srcPath,String destPath){BufferedInputStream bis = null;BufferedOutputStream bos = null;try {//1.造文件File srcFile = new File(srcPath);File destFile = new File(destPath);//2.造流//2.1 造节点流FileInputStream fis = new FileInputStream((srcFile));FileOutputStream fos = new FileOutputStream(destFile);//2.2 造缓冲流bis = new BufferedInputStream(fis);bos = new BufferedOutputStream(fos);//3.复制的细节:读取、写入byte[] buffer = new byte[1024];int len;while((len = bis.read(buffer)) != -1){bos.write(buffer,0,len);}} catch (IOException e) {e.printStackTrace();} finally {//4.资源关闭//要求:先关闭外层的流,再关闭内层的流if(bos != null){try {bos.close();} catch (IOException e) {e.printStackTrace();}}if(bis != null){try {bis.close();} catch (IOException e) {e.printStackTrace();}}//说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略.
// fos.close();
// fis.close();}}@Testpublic void testCopyFileWithBuffered(){long start = System.currentTimeMillis();String srcPath = "C:\\Users\\Administrator\\Desktop\\01-视频.avi";String destPath = "C:\\Users\\Administrator\\Desktop\\03-视频.avi";copyFileWithBuffered(srcPath,destPath);long end = System.currentTimeMillis();System.out.println("复制操作花费的时间为:" + (end - start));//618 - 176}
下面展示一些 使用BufferedReader和BufferedWriter实现文本文件的复制
。
/*使用BufferedReader和BufferedWriter实现文本文件的复制*/@Testpublic void testBufferedReaderBufferedWriter(){BufferedReader br = null;BufferedWriter bw = null;try {//创建文件和相应的流br = new BufferedReader(new FileReader(new File("dbcp.txt")));bw = new BufferedWriter(new FileWriter(new File("dbcp1.txt")));//读写操作//方式一:使用char[]数组
// char[] cbuf = new char[1024];
// int len;
// while((len = br.read(cbuf)) != -1){
// bw.write(cbuf,0,len);
// // bw.flush();
// }//方式二:使用StringString data;while((data = br.readLine()) != null){//方法一:
// bw.write(data + "\n");//data中不包含换行符//方法二:bw.write(data);//data中不包含换行符bw.newLine();//提供换行的操作}} catch (IOException e) {e.printStackTrace();} finally {//关闭资源if(bw != null){try {bw.close();} catch (IOException e) {e.printStackTrace();}}if(br != null){try {br.close();} catch (IOException e) {e.printStackTrace();}}}}
下面展示一些 实现图片加密与解密操作
。
public class PicTest {//图片的加密@Testpublic void test1() {FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream("爱情与友情.jpg");fos = new FileOutputStream("爱情与友情secret.jpg");byte[] buffer = new byte[20];int len;while ((len = fis.read(buffer)) != -1) {//字节数组进行修改//错误的// for(byte b : buffer){// b = (byte) (b ^ 5);// }//正确的for (int i = 0; i < len; i++) {buffer[i] = (byte) (buffer[i] ^ 5);}fos.write(buffer, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}//图片的解密@Testpublic void test2() {FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream("爱情与友情secret.jpg");fos = new FileOutputStream("爱情与友情4.jpg");byte[] buffer = new byte[20];int len;while ((len = fis.read(buffer)) != -1) {//字节数组进行修改//错误的// for(byte b : buffer){// b = (byte) (b ^ 5);// }//正确的for (int i = 0; i < len; i++) {buffer[i] = (byte) (buffer[i] ^ 5);}fos.write(buffer, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
}
处理流之二:转换流(属于字符流)
转换流提供了在字节流和字符流之间的转换
Java API提供了两个转换流:
》InputStreamReader:将InputStream转换为Reader
》OutputStreamWriter:将Writer转换为OutputStream
字节流中的数据都是字符时,转成字符流操作更高效。
很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能
解码:字节、字节数组 —>字符数组、字符串
编码:字符数组、字符串 —> 字节、字节数组
InputStreamReader
实现将字节的输入流按指定字符集转换为字符的输入流。
需要和InputStream“套接”。
构造器
public InputStreamReader(InputStream in)
public InputSreamReader(InputStream in,String charsetName)
下面展示一些 InputStreamReader的使用,实现字节的输入流到字符的输入流的转换
。
/*此时处理异常的话,仍然应该使用try-catch-finallyInputStreamReader的使用,实现字节的输入流到字符的输入流的转换*/@Testpublic void test1() throws IOException {FileInputStream fis = new FileInputStream("dbcp.txt");
// InputStreamReader isr = new InputStreamReader(fis);//使用系统默认的字符集//参数2指明了字符集,具体使用哪个字符集,取决于文件dbcp.txt保存时使用的字符集InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//使用系统默认的字符集char[] cbuf = new char[20];int len;while((len = isr.read(cbuf)) != -1){String str = new String(cbuf,0,len);System.out.print(str);}isr.close();}
OutputStreamWriter
实现将字符的输出流按指定字符集转换为字节的输出流。
需要和OutputStream“套接”。
构造器
public OutputStreamWriter(OutputStream out)
public OutputSreamWriter(OutputStream out,String charsetName)
下面展示一些 综合使用InputStreamReader和OutputStreamWriter
。
/*此时处理异常的话,仍然应该使用try-catch-finally综合使用InputStreamReader和OutputStreamWriter*/@Testpublic void test2() throws Exception {//1.造文件、造流File file1 = new File("dbcp.txt");File file2 = new File("dbcp_gbk.txt");FileInputStream fis = new FileInputStream(file1);FileOutputStream fos = new FileOutputStream(file2);InputStreamReader isr = new InputStreamReader(fis,"utf-8");OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");//2.读写过程char[] cbuf = new char[20];int len;while((len = isr.read(cbuf)) != -1){osw.write(cbuf,0,len);}//3.关闭资源isr.close();osw.close();}
常见的编码表
ASCII: 美国标准信息交换码。 用一个字节的7位可以表示。
ISO8859-1: 拉丁码表。欧洲码表 ,用一个字节的8位表示。
GB2312: 中国的中文编码表。最多两个字节编码所有字符
GBK: 中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码
Unicode: 国际标准码, 融合了目前人类使用的所有字符。为每个字符分配唯一的字符码。所有的文字都用两个字节来表示。
UTF-8: 变长的编码方式,可用1-4个字节来表示一个字符。
处理流之三:对象流
ObjectInputStream和OjbectOutputSteam
用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
序列化: 用ObjectOutputStream类保存基本类型数据或对象的机制
反序列化: 用ObjectInputStream类读取基本类型数据或对象的机制
ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
下面展示一些 对象流的序列化和反序列化
。
public class ObjectInputOutputStreamTest {/*序列化过程:将内存中的java对象保存到磁盘中或通过网络传输出去使用ObjectOutputStream实现*/@Testpublic void testObjectOutputStream(){ObjectOutputStream oos = null;try {//1.oos = new ObjectOutputStream(new FileOutputStream("object.dat"));//2.oos.writeObject(new String("我爱北京天安门"));oos.flush();//刷新操作oos.writeObject(new Person("王铭",23));oos.flush();oos.writeObject(new Person("张学良",23,1001,new Account(5000)));oos.flush();} catch (IOException e) {e.printStackTrace();} finally {if(oos != null){//3.try {oos.close();} catch (IOException e) {e.printStackTrace();}}}}/*反序列化:将磁盘文件中的对象还原为内存中的一个java对象使用ObjectInputStream来实现*/@Testpublic void testObjectInputStream(){ObjectInputStream ois = null;try {ois = new ObjectInputStream(new FileInputStream("object.dat"));Object obj = ois.readObject();String str = (String) obj;Person p = (Person) ois.readObject();Person p1 = (Person) ois.readObject();System.out.println(str);System.out.println(p);System.out.println(p1);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} finally {if(ois != null){try {ois.close();} catch (IOException e) {e.printStackTrace();}}}}}
3.要想一个java对象是可序列化的,需要满足相应的要求。(String中包含接口Serializable)
对象需要满足如下的要求,方可序列化
1.需要实现接口:Serializable或Externalizable
2.当前类提供一个全局常量:serialVersionUID
public static final long serialVersionUID = 475463534532L;
3.除了当前Person类需要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的。(默认情况下,基本数据类型可序列化,String也可序列化)
- 补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
下面展示一些 java对象满足序列化的要求
。
public class Person implements Serializable{public static final long serialVersionUID = 475463534532L;private String name;private int age;private int id;private Account acct;public Person(String name, int age, int id) {this.name = name;this.age = age;this.id = id;}public Person(String name, int age, int id, Account acct) {this.name = name;this.age = age;this.id = id;this.acct = acct;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", id=" + id +", acct=" + acct +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person(String name, int age) {this.name = name;this.age = age;}public Person() {}
}class Account implements Serializable{public static final long serialVersionUID = 4754534532L;private double balance;@Overridepublic String toString() {return "Account{" +"balance=" + balance +'}';}public double getBalance() {return balance;}public void setBalance(double balance) {this.balance = balance;}public Account(double balance) {this.balance = balance;}
}
序列化机制:
对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种 二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。 当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。
处理流之四:随机存取文件流
RandomAccessFile 声明在java.io包下,但直接继承于java.lang.Object类。 并且它实现DataInput、 DataOutput这两个接口,也就意味着这个类既可以读也可以写。
RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件
》支持只访问文件的部分内容
》可以向已存在的文件后追加内容
RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。
RandomAccessFile 类对象可以自由移动记录指针:
》long getFilePointer(): 获取文件记录指针的当前位置
》void seek(long pos): 将文件记录指针定位到 pos 位置
构造器
》public RandomAccessFile(File file, String mode)
》public RandomAccessFile(String name, String mode)
创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 RandomAccessFile 的访问模式:
》r: 以只读方式打开
》rw:打开以便读取和写入
》rwd:打开以便读取和写入;同步文件内容的更新
》rws:打开以便读取和写入; 同步文件内容和元数据的更新
如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 如果模式为rw读写。如果文件不存在则会去创建文件,如果存在则不会创建。
RandomAccessFile的使用
1.RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
下面展示一些 RandomAccessFile的使用
。
@Testpublic void test1() {RandomAccessFile raf1 = null;RandomAccessFile raf2 = null;try {//1.raf1 = new RandomAccessFile(new File("爱情与友情.jpg"),"r");raf2 = new RandomAccessFile(new File("爱情与友情1.jpg"),"rw");//2.byte[] buffer = new byte[1024];int len;while((len = raf1.read(buffer)) != -1){raf2.write(buffer,0,len);}} catch (IOException e) {e.printStackTrace();} finally {//3.if(raf1 != null){try {raf1.close();} catch (IOException e) {e.printStackTrace();}}if(raf2 != null){try {raf2.close();} catch (IOException e) {e.printStackTrace();}}}}
2.RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
3.如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。
如果写出到的文件存在,则会对原有文件内容进行覆盖。(默认情况下,从头覆盖)
下面展示一些 RandomAccessFile对原文件内容进行从头开始的复写
。
@Testpublic void test2() throws IOException {RandomAccessFile raf1 = new RandomAccessFile("hello.txt","rw");raf1.seek(3);//将指针调到角标为3的位置raf1.write("xyz".getBytes());//raf1.close();}
4.可以通过相关的操作,实现RandomAccessFile“插入”数据的效果
下面展示一些 使用RandomAccessFile实现数据的插入效果
。
/*使用RandomAccessFile实现数据的插入效果*/@Testpublic void test3() throws IOException {RandomAccessFile raf1 = new RandomAccessFile("hello.txt","rw");raf1.seek(3);//将指针调到角标为3的位置//保存指针3后面的所有数据到StringBuilder中StringBuilder builder = new StringBuilder((int) new File("hello.txt").length());byte[] buffer = new byte[20];int len;while((len = raf1.read(buffer)) != -1){builder.append(new String(buffer,0,len)) ;}//调回指针,写入“xyz”raf1.seek(3);raf1.write("xyz".getBytes());//将StringBuilder中的数据写入到文件中raf1.write(builder.toString().getBytes());raf1.close();//思考:将StringBuilder替换为ByteArrayOutputStream}
处理流:标准输入输出流、打印流、数据流(了解)
1.标准的输入、输出流
1.1
System.in:标准的输入流,默认从键盘输入
System.out:标准的输出流,默认从控制台输出
1.2
System类的setIn(InputStream is) / setOut(PrintStream ps)方式重新指定输入和输出的流。
1.3练习:
从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后继续进行输入操作,
直至当输入“e”或者“exit”时,退出程序。
方法一:使用Scanner实现,调用next()返回一个字符串
方法二:使用System.in实现。System.in —> 转换流 —> BufferedReader的readLine()
下面展示一些 标准的输入、输出流
。
public static void main(String[] args) {BufferedReader br = null;try {InputStreamReader isr = new InputStreamReader(System.in);br = new BufferedReader(isr);while (true) {System.out.println("请输入字符串:");String data = br.readLine();if ("e".equalsIgnoreCase(data) || "exit".equalsIgnoreCase(data)) {System.out.println("程序结束");break;}String upperCase = data.toUpperCase();System.out.println(upperCase);}} catch (IOException e) {e.printStackTrace();} finally {if (br != null) {try {br.close();} catch (IOException e) {e.printStackTrace();}}}}
2.打印流:PrintStream 和PrintWriter
提供了一系列重载的print() 和 println()
下面展示一些 打印流
。
@Testpublic void test2() {PrintStream ps = null;try {FileOutputStream fos = new FileOutputStream(new File("D:\\IO\\text.txt"));// 创建打印输出流,设置为自动刷新模式(写入换行符或字节 '\n' 时都会刷新输出缓冲区)ps = new PrintStream(fos, true);if (ps != null) {// 把标准输出流(控制台输出)改成文件System.setOut(ps);}for (int i = 0; i <= 255; i++) { // 输出ASCII字符System.out.print((char) i);if (i % 50 == 0) { // 每50个数据一行System.out.println(); // 换行}}} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (ps != null) {ps.close();}}}
3.数据流
3.1 DataInputStream 和 DataOutputStream
3.2 作用:用于读取或写出基本数据类型的变量或字符串
练习:将内存中的字符串、基本数据类型的变量写出到文件中。
注意:处理异常的话,仍然应该使用try-catch-finally.
数据流有两个类: (用于读取和写出基本数据类型、 String类的数据)
DataInputStream 和 DataOutputStream
分别“套接”在 InputStream 和 OutputStream 子类的流上
DataInputStream中的方法
boolean readBoolean()-------------------- byte readByte()
char readChar() ------------------------float readFloat()
double readDouble()------------------- short readShort()
long readLong() -------------------------int readInt()
String readUTF() ----------------------void readFully(byte[] b)
DataOutputStream中的方法
将上述的方法的read改为相应的write即可。
将文件中存储的基本数据类型变量和字符串读取到内存中,保存在变量中。
注意点:读取不同类型的数据的顺序要与当初写入文件时,保存的数据的顺序一致!
下面展示一些 数据流的写入和读取
。
@Testpublic void test3() throws IOException {//1.DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));//2.dos.writeUTF("刘建辰");dos.flush();//刷新操作,将内存中的数据写入文件dos.writeInt(23);dos.flush();dos.writeBoolean(true);dos.flush();//3.dos.close();}@Testpublic void test4() throws IOException {//1.DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));//2.String name = dis.readUTF();int age = dis.readInt();boolean isMale = dis.readBoolean();System.out.println("name = " + name);System.out.println("age = " + age);System.out.println("isMale = " + isMale);//3.dis.close();}
NIO.2中Path、 Paths、Files类的使用(了解)
1.jdk 7.0 时,引入了 Path、Paths、Files三个类。
2.此三个类声明在:java.nio.file包下。
3.Path可以看做是java.io.File类的升级版本。也可以表示文件或文件目录,与平台无关
4.如何实例化Path:使用Paths.
- static Path get(String first, String … more) : 用于将多个字符串串连成路径
- static Path get(URI uri): 返回指定uri对应的Path路径
下面展示一些 Path类的使用
。
public class PathTest {//如何使用Paths实例化Path@Testpublic void test1() {Path path1 = Paths.get("d:\\nio\\hello.txt");//new File(String filepath)Path path2 = Paths.get("d:\\", "nio\\hello.txt");//new File(String parent,String filename);System.out.println(path1);System.out.println(path2);Path path3 = Paths.get("d:\\", "nio");System.out.println(path3);}//Path中的常用方法@Testpublic void test2() {Path path1 = Paths.get("d:\\", "nio\\nio1\\nio2\\hello.txt");Path path2 = Paths.get("hello.txt");// String toString() : 返回调用 Path 对象的字符串表示形式System.out.println(path1);// boolean startsWith(String path) : 判断是否以 path 路径开始System.out.println(path1.startsWith("d:\\nio"));
// boolean endsWith(String path) : 判断是否以 path 路径结束System.out.println(path1.endsWith("hello.txt"));
// boolean isAbsolute() : 判断是否是绝对路径System.out.println(path1.isAbsolute() + "~");System.out.println(path2.isAbsolute() + "~");
// Path getParent() :返回Path对象包含整个路径,不包含 Path 对象指定的文件路径System.out.println(path1.getParent());System.out.println(path2.getParent());
// Path getRoot() :返回调用 Path 对象的根路径System.out.println(path1.getRoot());System.out.println(path2.getRoot());
// Path getFileName() : 返回与调用 Path 对象关联的文件名System.out.println(path1.getFileName() + "~");System.out.println(path2.getFileName() + "~");
// int getNameCount() : 返回Path 根目录后面元素的数量
// Path getName(int idx) : 返回指定索引位置 idx 的路径名称for (int i = 0; i < path1.getNameCount(); i++) {System.out.println(path1.getName(i) + "*****");}// Path toAbsolutePath() : 作为绝对路径返回调用 Path 对象System.out.println(path1.toAbsolutePath());System.out.println(path2.toAbsolutePath());
// Path resolve(Path p) :合并两个路径,返回合并后的路径对应的Path对象Path path3 = Paths.get("d:\\", "nio");Path path4 = Paths.get("nioo\\hi.txt");path3 = path3.resolve(path4);System.out.println(path3);// File toFile(): 将Path转化为File类的对象File file = path1.toFile();//Path--->File的转换Path newPath = file.toPath();//File--->Path的转换}}
下面展示一些 Files工具类的使用:操作文件或目录的工具类
。
public class FilesTest {@Testpublic void test1() throws IOException{Path path1 = Paths.get("d:\\nio", "hello.txt");Path path2 = Paths.get("atguigu.txt");// Path copy(Path src, Path dest, CopyOption … how) : 文件的复制//要想复制成功,要求path1对应的物理上的文件存在。path1对应的文件没有要求。
// Files.copy(path1, path2, StandardCopyOption.REPLACE_EXISTING);// Path createDirectory(Path path, FileAttribute<?> … attr) : 创建一个目录//要想执行成功,要求path对应的物理上的文件目录不存在。一旦存在,抛出异常。Path path3 = Paths.get("d:\\nio\\nio1");
// Files.createDirectory(path3);// Path createFile(Path path, FileAttribute<?> … arr) : 创建一个文件//要想执行成功,要求path对应的物理上的文件不存在。一旦存在,抛出异常。Path path4 = Paths.get("d:\\nio\\hi.txt");
// Files.createFile(path4);// void delete(Path path) : 删除一个文件/目录,如果不存在,执行报错
// Files.delete(path4);// void deleteIfExists(Path path) : Path对应的文件/目录如果存在,执行删除.如果不存在,正常执行结束Files.deleteIfExists(path3);// Path move(Path src, Path dest, CopyOption…how) : 将 src 移动到 dest 位置//要想执行成功,src对应的物理上的文件需要存在,dest对应的文件没有要求。
// Files.move(path1, path2, StandardCopyOption.ATOMIC_MOVE);// long size(Path path) : 返回 path 指定文件的大小long size = Files.size(path2);System.out.println(size);}@Testpublic void test2() throws IOException{Path path1 = Paths.get("d:\\nio", "hello.txt");Path path2 = Paths.get("atguigu.txt");
// boolean exists(Path path, LinkOption … opts) : 判断文件是否存在System.out.println(Files.exists(path2, LinkOption.NOFOLLOW_LINKS));// boolean isDirectory(Path path, LinkOption … opts) : 判断是否是目录//不要求此path对应的物理文件存在。System.out.println(Files.isDirectory(path1, LinkOption.NOFOLLOW_LINKS));// boolean isRegularFile(Path path, LinkOption … opts) : 判断是否是文件// boolean isHidden(Path path) : 判断是否是隐藏文件//要求此path对应的物理上的文件需要存在。才可判断是否隐藏。否则,抛异常。
// System.out.println(Files.isHidden(path1));// boolean isReadable(Path path) : 判断文件是否可读System.out.println(Files.isReadable(path1));
// boolean isWritable(Path path) : 判断文件是否可写System.out.println(Files.isWritable(path1));
// boolean notExists(Path path, LinkOption … opts) : 判断文件是否不存在System.out.println(Files.notExists(path1, LinkOption.NOFOLLOW_LINKS));}/*** StandardOpenOption.READ:表示对应的Channel是可读的。* StandardOpenOption.WRITE:表示对应的Channel是可写的。* StandardOpenOption.CREATE:如果要写出的文件不存在,则创建。如果存在,忽略* StandardOpenOption.CREATE_NEW:如果要写出的文件不存在,则创建。如果存在,抛异常** @author shkstart 邮箱:shkstart@126.com* @throws IOException*/@Testpublic void test3() throws IOException{Path path1 = Paths.get("d:\\nio", "hello.txt");// InputStream newInputStream(Path path, OpenOption…how):获取 InputStream 对象InputStream inputStream = Files.newInputStream(path1, StandardOpenOption.READ);// OutputStream newOutputStream(Path path, OpenOption…how) : 获取 OutputStream 对象OutputStream outputStream = Files.newOutputStream(path1, StandardOpenOption.WRITE,StandardOpenOption.CREATE);// SeekableByteChannel newByteChannel(Path path, OpenOption…how) : 获取与指定文件的连接,how 指定打开方式。SeekableByteChannel channel = Files.newByteChannel(path1, StandardOpenOption.READ,StandardOpenOption.WRITE,StandardOpenOption.CREATE);// DirectoryStream<Path> newDirectoryStream(Path path) : 打开 path 指定的目录Path path2 = Paths.get("e:\\teach");DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path2);Iterator<Path> iterator = directoryStream.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}
}
25.java中IO流的应用---缓冲流、转换流以及对象流过程(附讲解和练习)相关推荐
- 【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流
Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...
- Java中IO流,输入输出流概述与总结(转载自别先生文章)
Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...
- Java中IO流的总结
有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...
- Java中IO流体系
转载: https://mp.weixin.qq.com/s?__biz=MzA5NzgzODI5NA==&mid=2454030958&idx=1&sn=df27aadb92 ...
- java 中 IO 的流的种类及BIO、NIO、AIO 有什么区别?
文章目录 java 中 IO 流分为几种? BIO.NIO.AIO 有什么区别? java 中 IO 流分为几种? (1)按流划分,可以分为输入流和输出流: (2)按单位划分,可以分为字节流和字符流: ...
- Java中IO流面试题
Java 中 IO 流分为几种? Java IO与 NIO的区别? 常用io类有那些? 字节流与字符流的区别? 说说阻塞 IO 模型? 说说非阻塞 IO 模型? 说说多路复用 IO 模型? 说说信号驱 ...
- java中io是什么_深入理解Java中的IO
深入理解Java中的IO 转载自:http://blog.csdn.net/qq_25184739/article/details/51205186 本文的目录视图如下: Java IO概要 a.Ja ...
- Linux网络IO模型及JAVA中IO模型
文章目录 1.概述 2.Linux网络IO模型 2.1.阻塞IO模型 2.2.非阻塞IO模型 2.3.IO复用模型 2.3.1.select 2.3.2.poll 2.3.3.epoll 2.4.信号 ...
- Java 中数组Array和列表List的转换
主要介绍Java中Java 中数组Array和列表List的转换. 一.数组Array转列表List 1.使用Collections.addAll()方法 使用Collections.addAll() ...
最新文章
- JWT(JSON Web Token)简介及实现
- java设置虚基类的目的_设置虚基类的目的是( )。
- USEARCH11新功能——OTU表抽平otutab_rare
- 数据结构与算法:二分查找
- 开发笔记:掉落系统模块设计思路
- 怎么配置iptv服务器信息,请配置iptv服务器信息
- 接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架
- 四十一,java中Annotation详解
- sql安装程序初始化_SQL Server安装程序–即时文件初始化(IFI)
- Flutter基础—定位对齐之对齐
- Android抓包方法(一) 之Fiddler代理
- tensorflow之成品模型
- redis-hmap --go
- Google Chrome浏览器离线安装包下载方法
- 一种使用16QAM的OFDM系统MATLAB仿真
- 面试官问:如何搭建测试环境?掌握这5种技能和知识就够了
- juk互粉攻略set结构体
- 这是我见过最秀的代码 。。。
- 手机端页面Html设置
- java 模板类 mock_mockj: 生成mock数据的利器,按照规则模板生成 mock 数据,mockjs的java实现。同时内置随机 random 一个对象的功能...
热门文章
- c#输出二维数组矩阵
- Hello,Mr.J——唠唠叨叨年终总结
- 数据结构课程大纲和教学设计
- 改进YOLO系列 | ICLR2022 | OMNI-DIMENSIONAL DYNAMIC CONVOLUTION: 全维动态卷积
- 《炬丰科技-半导体工艺》化学蚀刻的铜-ETP铜
- 珠宝erp是否能带回珠宝行业的“黄金时代”?
- java 手电筒_《SystemUI》限制低电量打开手电筒
- python绘制bbox
- 网络教育要考计算机和英语作文,写一篇关于远程教育的英语作文关于远程教育的优缺点、利与弊和自己的观点。...
- iOS 实现Cordova-Beecloud支付插件