处理流之一:缓冲流

 为了提高数据读写的速度, 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流的应用---缓冲流、转换流以及对象流过程(附讲解和练习)相关推荐

  1. 【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流

    Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...

  2. Java中IO流,输入输出流概述与总结(转载自别先生文章)

    Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  3. Java中IO流的总结

    有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...

  4. Java中IO流体系

    转载: https://mp.weixin.qq.com/s?__biz=MzA5NzgzODI5NA==&mid=2454030958&idx=1&sn=df27aadb92 ...

  5. java 中 IO 的流的种类及BIO、NIO、AIO 有什么区别?

    文章目录 java 中 IO 流分为几种? BIO.NIO.AIO 有什么区别? java 中 IO 流分为几种? (1)按流划分,可以分为输入流和输出流: (2)按单位划分,可以分为字节流和字符流: ...

  6. Java中IO流面试题

    Java 中 IO 流分为几种? Java IO与 NIO的区别? 常用io类有那些? 字节流与字符流的区别? 说说阻塞 IO 模型? 说说非阻塞 IO 模型? 说说多路复用 IO 模型? 说说信号驱 ...

  7. java中io是什么_深入理解Java中的IO

    深入理解Java中的IO 转载自:http://blog.csdn.net/qq_25184739/article/details/51205186 本文的目录视图如下: Java IO概要 a.Ja ...

  8. 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.信号 ...

  9. Java 中数组Array和列表List的转换

    主要介绍Java中Java 中数组Array和列表List的转换. 一.数组Array转列表List 1.使用Collections.addAll()方法 使用Collections.addAll() ...

最新文章

  1. JWT(JSON Web Token)简介及实现
  2. java设置虚基类的目的_设置虚基类的目的是( )。
  3. USEARCH11新功能——OTU表抽平otutab_rare
  4. 数据结构与算法:二分查找
  5. 开发笔记:掉落系统模块设计思路
  6. 怎么配置iptv服务器信息,请配置iptv服务器信息
  7. 接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架
  8. 四十一,java中Annotation详解
  9. sql安装程序初始化_SQL Server安装程序–即时文件初始化(IFI)
  10. Flutter基础—定位对齐之对齐
  11. Android抓包方法(一) 之Fiddler代理
  12. tensorflow之成品模型
  13. redis-hmap --go
  14. Google Chrome浏览器离线安装包下载方法
  15. 一种使用16QAM的OFDM系统MATLAB仿真
  16. 面试官问:如何搭建测试环境?掌握这5种技能和知识就够了
  17. juk互粉攻略set结构体
  18. 这是我见过最秀的代码 。。。
  19. 手机端页面Html设置
  20. java 模板类 mock_mockj: 生成mock数据的利器,按照规则模板生成 mock 数据,mockjs的java实现。同时内置随机 random 一个对象的功能...

热门文章

  1. c#输出二维数组矩阵
  2. Hello,Mr.J——唠唠叨叨年终总结
  3. 数据结构课程大纲和教学设计
  4. 改进YOLO系列 | ICLR2022 | OMNI-DIMENSIONAL DYNAMIC CONVOLUTION: 全维动态卷积
  5. 《炬丰科技-半导体工艺》化学蚀刻的铜-ETP铜
  6. 珠宝erp是否能带回珠宝行业的“黄金时代”?
  7. java 手电筒_《SystemUI》限制低电量打开手电筒
  8. python绘制bbox
  9. 网络教育要考计算机和英语作文,写一篇关于远程教育的英语作文关于远程教育的优缺点、利与弊和自己的观点。...
  10. iOS 实现Cordova-Beecloud支付插件