File类
java.io.File
类:文件和文件目录路径的抽象表示形式,与平台无关
File 能新建、删除、重命名文件和目录,但 File不能访问文件内容本身。 如果需要访问文件内容本身,则需要使用输入/输出流。
想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
File对象可以作为参数传递给流的构造器,指明读取或写入的"终点"。
Java路径:
相对路径:相较于某个路径下,指明的路径。在某个Module下代码内的相对路径默认相对于当前Module
绝对路径:包含盘符在内的文件或文件目录的路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 public class FileTest { @Test public void test1 () { File file1 = new File("hello.txt" ); File file2 = new File("D:\\workspace_idea1\\JavaSenior\\day08\\he.txt" ); System.out.println(file1); System.out.println(file2); File file3 = new File("D:\\workspace_idea1" ,"JavaSenior" ); System.out.println(file3); File file4 = new File(file3,"hi.txt" ); System.out.println(file4); } @Test public void test2 () { File file1 = new File("hello.txt" ); File file2 = new File("d:\\io\\hi.txt" ); System.out.println(file1.getAbsolutePath()); System.out.println(file1.getPath()); System.out.println(file1.getName()); System.out.println(file1.getParent()); System.out.println(file1.length()); System.out.println(new Date(file1.lastModified())); System.out.println(); System.out.println(file2.getAbsolutePath()); System.out.println(file2.getPath()); System.out.println(file2.getName()); System.out.println(file2.getParent()); System.out.println(file2.length()); System.out.println(file2.lastModified()); } @Test public void test3 () { File file = new File("D:\\workspace_idea1\\JavaSenior" ); String[] list = file.list(); for (String s : list){ System.out.println(s); } System.out.println(); File[] files = file.listFiles(); for (File f : files){ System.out.println(f); } } @Test public void test4 () { File file1 = new File("hello.txt" ); File file2 = new File("D:\\io\\hi.txt" ); boolean renameTo = file2.renameTo(file1); System.out.println(renameTo); } @Test public void test5 () { File file1 = new File("hello.txt" ); file1 = new File("hello1.txt" ); System.out.println(file1.isDirectory()); System.out.println(file1.isFile()); System.out.println(file1.exists()); System.out.println(file1.canRead()); System.out.println(file1.canWrite()); System.out.println(file1.isHidden()); System.out.println(); File file2 = new File("d:\\io" ); file2 = new File("d:\\io1" ); System.out.println(file2.isDirectory()); System.out.println(file2.isFile()); System.out.println(file2.exists()); System.out.println(file2.canRead()); System.out.println(file2.canWrite()); System.out.println(file2.isHidden()); } @Test public void test6 () throws IOException { File file1 = new File("hi.txt" ); if (!file1.exists()){ file1.createNewFile(); System.out.println("创建成功" ); }else { file1.delete(); System.out.println("删除成功" ); } } @Test public void test7 () { File file1 = new File("d:\\io\\io1\\io3" ); boolean mkdir = file1.mkdir(); if (mkdir){ System.out.println("创建成功1" ); } File file2 = new File("d:\\io\\io1\\io4" ); boolean mkdir1 = file2.mkdirs(); if (mkdir1){ System.out.println("创建成功2" ); } File file3 = new File("D:\\io\\io1\\io4" ); file3 = new File("D:\\io\\io1" ); System.out.println(file3.delete()); } }
IO流原理及流的分类
IO流原理
I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行。
java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
流的分类
按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
按数据流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流,处理流
IO流类型示意图
节点流和处理流
节点流 :直接从数据源或目的地读写数据。
处理流 :不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
IO流体系
抽象基类
节点流(或文件流)
缓冲流(处理流的一种)
InputStream
FileInputStream read(byte[] buffer)
BufferedInputStream read(byte[] buffer)
OutputStream
FileOutputStream write(byte[] buffer,0,len)
BufferedOutputStream write(byte[] buffer,0,len) / flush()
Reader
FileReader read(char[] cbuf)
BufferedReader read(char[] cbuf) / readLine()
Writer
FileWriter write(char[] cbuf,0,len)
BufferedWriter write(char[] cbuf,0,len) / flush()
对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,…),使用字节流处理
FileReader和FileWriter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 public class FileReaderWriterTest { public static void main (String[] args) { File file = new File("hello.txt" ); System.out.println(file.getAbsolutePath()); File file1 = new File("day09\\hello.txt" ); System.out.println(file1.getAbsolutePath()); } @Test public void testFileReader () { FileReader fr = null ; try { File file = new File("hello.txt" ); fr = new FileReader(file); int data; while ((data = fr.read()) != -1 ){ System.out.print((char )data); } } catch (IOException e) { e.printStackTrace(); } finally { if (fr != null ){ try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public void testFileReader1 () { FileReader fr = null ; try { File file = new File("hello.txt" ); fr = new FileReader(file); char [] cbuf = new char [5 ]; int len; while ((len = fr.read(cbuf)) != -1 ){ String str = new String(cbuf,0 ,len); System.out.print(str); } } catch (IOException e) { e.printStackTrace(); } finally { if (fr != null ){ try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public void testFileWriter () { FileWriter fw = null ; try { File file = new File("hello1.txt" ); fw = new FileWriter(file,false ); fw.write("I have a dream!\n" ); fw.write("you need to have a dream!" ); } catch (IOException e) { e.printStackTrace(); } finally { if (fw != null ){ try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public void testFileReaderFileWriter () { FileReader fr = null ; FileWriter fw = null ; try { File srcFile = new File("hello.txt" ); File destFile = new File("hello2.txt" ); fr = new FileReader(srcFile); fw = new FileWriter(destFile); char [] cbuf = new char [5 ]; int len; while ((len = fr.read(cbuf)) != -1 ){ fw.write(cbuf,0 ,len); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (fw != null ) fw.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fr != null ) fr.close(); } catch (IOException e) { e.printStackTrace(); } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 public class FileInputOutputStreamTest { @Test public void testFileInputStream () { FileInputStream fis = null ; try { File file = new File("hello.txt" ); fis = new FileInputStream(file); byte [] buffer = new byte [5 ]; int len; while ((len = fis.read(buffer)) != -1 ){ String str = new String(buffer,0 ,len); System.out.print(str); } } catch (IOException e) { e.printStackTrace(); } finally { if (fis != null ){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public void testFileInputOutputStream () { FileInputStream fis = null ; FileOutputStream fos = null ; try { File srcFile = new File("爱情与友情.jpg" ); File destFile = new File("爱情与友情2.jpg" ); fis = new FileInputStream(srcFile); fos = new FileOutputStream(destFile); byte [] buffer = new byte [5 ]; int len; while ((len = fis.read(buffer)) != -1 ){ 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(); } } } } public void copyFile (String srcPath,String destPath) { FileInputStream fis = null ; FileOutputStream fos = null ; try { File srcFile = new File(srcPath); File destFile = new File(destPath); fis = new FileInputStream(srcFile); fos = new FileOutputStream(destFile); byte [] buffer = new byte [1024 ]; int len; while ((len = fis.read(buffer)) != -1 ){ 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(); } } } } }
缓冲流
处理流,就是“套接”在已有的流的基础上。缓冲流能提高读写速度,原因:内部提供了一个缓冲区 ,读写时先将内存中的数据存放在缓冲区内,当缓冲区内容满了再统一对硬盘进行读写,节省了大量向硬盘读写所耗费的时间。
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
**创建缓冲流时,需要将对应的节点流对象作为构造器参数传入。**关闭外部流(缓冲流)后,其内部流(节点流)会自动关闭,不需要再close
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 public class BufferedTest { @Test public void BufferedStreamTest () throws FileNotFoundException { BufferedInputStream bis = null ; BufferedOutputStream bos = null ; try { File srcFile = new File("爱情与友情.jpg" ); File destFile = new File("爱情与友情3.jpg" ); FileInputStream fis = new FileInputStream((srcFile)); FileOutputStream fos = new FileOutputStream(destFile); bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); byte [] buffer = new byte [10 ]; int len; while ((len = bis.read(buffer)) != -1 ){ bos.write(buffer,0 ,len); } } catch (IOException e) { e.printStackTrace(); } finally { if (bos != null ){ try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if (bis != null ){ try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void copyFileWithBuffered (String srcPath,String destPath) { BufferedInputStream bis = null ; BufferedOutputStream bos = null ; try { File srcFile = new File(srcPath); File destFile = new File(destPath); FileInputStream fis = new FileInputStream((srcFile)); FileOutputStream fos = new FileOutputStream(destFile); bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); byte [] buffer = new byte [1024 ]; int len; while ((len = bis.read(buffer)) != -1 ){ bos.write(buffer,0 ,len); } } catch (IOException e) { e.printStackTrace(); } finally { if (bos != null ){ try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if (bis != null ){ try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public 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)); } @Test public 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" ))); String data; while ((data = br.readLine()) != null ){ bw.write(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(); } } } } }
转换流
转换流:属于字符流 。因为其后缀为Reader
和Writer
。
InputStreamReader
:将一个字节输入流转换为字符输入流
OutputStreamWriter
:将一个字符输出流转换为字节输出流
作用:提供字节流与字符流之间的转换。可指定使用不同的字符集编码方式读取同一段文本数据。
解码:字节、字节数组 —> 字符数组、字符串
编码:字符数组、字符串 —> 字节、字节数组
字符集
ASCII:美国标准信息交换码。用一个字节的7位可以表示。
ISO8859-1:拉丁码表(欧洲码表)。用一个字节的8位表示。
GB2312:中国的中文编码表。多两个字节编码所有字符
GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码
Unicode:国际标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的字符码。所有的文字都用两个字节来表示。
UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public class InputStreamReaderTest { @Test public void test () throws Exception { 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" ); char [] cbuf = new char [20 ]; int len; while ((len = isr.read(cbuf)) != -1 ){ osw.write(cbuf,0 ,len); } isr.close(); osw.close(); } }
序列化
序列化机制:
对象序列化机制允许把内存 中的Java对象转换成平台无关的二进制流 ,从而允许把这种二进制流持久地保存在磁盘 上,或通过网络 将这种二进制流传输到另一个网络节点。
当其它程序获取了这种二进制流,就可以恢复成原来的Java对象(反序列化)
Java的序列化机制是通过在运行时判断类的serialVersionUID
来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID
与本地相应实体类的serialVersionUID
进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException
)
若不提供serialVersionUID
,则JVM会为该类生成一个默认的serialVersionUID
,这样的缺陷在于,若后续该类进行了改动,重新编译出的class文件将会拥有另一个默认的serialVersionUID
,二者不会相同,此时将不再能进行反序列化。
谈谈你对java.io.Serializable
接口的理解,我们知道它用于序列化, 是空方法接口 ,还有其它认识吗?
Serializable
接口是给JVM参考的,JVM看到该接口后,会为该类自动生成一个序列化版本号 :serialVersionUID
,其用于唯一标识该对象在数据源中的位置。
实现了Serializable
接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异 。换句话说,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。不必关心数据在不同机器上如何表示,也不必关心字节的顺序或者其他任何细节。由于大部分作为参数的类如String
、Integer
等都实现了java.io.Serializable
的接口,也可以利用多态的性质,作为参数使接口更灵活。
对象流
ObjectInputStream
和OjbectOutputSteam
作用:用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
要想一个java对象是可序列化 的,需要满足的要求:
需要实现接口:Serializable
当前类提供一个全局常量:serialVersionUID
,其用于唯一标识该对象在数据源中的位置
除了当前类需要实现Serializable
接口之外,还必须保证其内部所有属性也必须是可序列化的。(默认情况下,基本数据类型可序列化)
补充:ObjectOutputStream
和ObjectInputStream
不能序列化static
和transient
(表示游离,不参与序列化)修饰的成员变量。可以一次序列化多个对象(用集合存放多个对象一起传给ObjectOutputStream
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 public class ObjectInputOutputStreamTest { @Test public void testObjectOutputStream () { ObjectOutputStream oos = null ; try { oos = new ObjectOutputStream(new FileOutputStream("object.dat" )); 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 ){ try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public 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(); } } } } }
RandomAccessFile
RandomAccessFile
直接继承于java.lang.Object
类,实现了DataInput
和DataOutput
接口
RandomAccessFile
既可以作为一个输入流,又可以作为一个输出流
如果RandomAccessFile
作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。如果写出到的文件存在,则会对原有文件内容进行覆盖。(默认情况下,从头覆盖)可以通过相关的操作,实现RandomAccessFile
“插入”数据的效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 public class RandomAccessFileTest { @Test public void test1 () { RandomAccessFile raf1 = null ; RandomAccessFile raf2 = null ; try { raf1 = new RandomAccessFile(new File("爱情与友情.jpg" ),"r" ); raf2 = new RandomAccessFile(new File("爱情与友情1.jpg" ),"rw" ); byte [] buffer = new byte [1024 ]; int len; while ((len = raf1.read(buffer)) != -1 ){ raf2.write(buffer,0 ,len); } } catch (IOException e) { e.printStackTrace(); } finally { if (raf1 != null ){ try { raf1.close(); } catch (IOException e) { e.printStackTrace(); } } if (raf2 != null ){ try { raf2.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public void test2 () throws IOException { RandomAccessFile raf1 = new RandomAccessFile("hello.txt" ,"rw" ); raf1.seek(3 ); raf1.write("xyz" .getBytes()); raf1.close(); } @Test public void test3 () throws IOException { RandomAccessFile raf1 = new RandomAccessFile("hello.txt" ,"rw" ); raf1.seek(3 ); 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)) ; } raf1.seek(3 ); raf1.write("xyz" .getBytes()); raf1.write(builder.toString().getBytes()); raf1.close(); } }
其他流
标准的输入、输出流:System.in 、System.out
打印流:PrintStream、PrintWriter
数据流:DataInputStream、DataOutputStream。作用:用于读取或写出基本数据类型的变量或字符串
打印流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 @Test public void test2 () { PrintStream ps = null ; try { FileOutputStream fos = new FileOutputStream(new File("D:\\IO\\text.txt" )); ps = new PrintStream(fos, true ); if (ps != null ) { System.setOut(ps); } for (int i = 0 ; i <= 255 ; i++) { System.out.print((char ) i); if (i % 50 == 0 ) { System.out.println(); } } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (ps != null ) { ps.close(); } } }
数据流
将文件中存储的基本数据类型变量和字符串读取到内存中,保存在变量中。 注意点:读取不同类型的数据的顺序要与当初写入文件时,保存的数据的顺序一致!
将内存中的字符串、基本数据类型的变量写出到文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 @Test public void test3 () throws IOException { DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt" )); dos.writeUTF("张三" ); dos.flush(); dos.writeInt(23 ); dos.flush(); dos.writeBoolean(true ); dos.flush(); dos.close(); } @Test public void test4 () throws IOException { DataInputStream dis = new DataInputStream(new FileInputStream("data.txt" )); 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); dis.close(); }