转自:http://blog.csdn.net/xiaocaidexuexibiji/article/details/17101573
什么是流:
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
流的分类:
根据数据类型:字符流,字节流
根据数据流向:输入流,输出流
字符流和字节流
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
区别:
(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件。
结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
Java流操作有关的类或接口
Java中流的类结构图
1.InputStream
InputStream 是所有的输入字节流的父类,它是一个抽象类。
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。
ObjectInputStream 和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)。意思是FileInputStream类可以通过一个String路径名创建一个对象,FileInputStream(String name)。而DataInputStream必须装饰一个类才能返回一个对象,DataInputStream(InputStream in)。如下图示:
实例:
import java.io.*; public class IOTest { public static void testFileInputStream_1(String fileName) throws Exception { File file = new File(fileName); InputStream is = new FileInputStream(file); byte[] buffer = new byte[1024]; is.read(buffer); is.close(); System.out.println(new String(buffer)); } public static void testFileInputStream_2(String fileName) throws Exception { File file = new File(fileName); InputStream is = new FileInputStream(file); byte[] buffer = new byte[1024]; int len = is.read(buffer); is.close(); System.out.println(new String(buffer, 0, len)); } public static void testFileInputStream_3(String fileName) throws Exception { File file = new File(fileName); InputStream is = new FileInputStream(file); byte[] buffer = new byte[(int) file.length()]; is.read(buffer); is.close(); System.out.println(new String(buffer)); } public static void testFileInputStream_4(String fileName) throws Exception { File file = new File(fileName); InputStream is = new FileInputStream(file); byte[] buffer = new byte[(int) file.length()]; for (int i = 0; i < buffer.length; i++) { buffer[i] = (byte) is.read(); } is.close(); System.out.println(new String(buffer)); } public static void testFileInputStream_5(String fileName) throws Exception { File file = new File(fileName); InputStream is = new FileInputStream(file); byte[] buffer = new byte[1024]; int count = 0; int temp = 0; while ((temp = is.read()) != -1) { buffer[count++] = (byte) temp; } is.close(); System.out.println(new String(buffer, 0, count)); } public static void testDataInputStream(String fileName) throws Exception { File file = new File(fileName); DataInputStream is = new DataInputStream(new FileInputStream(file)); char[] buffer = new char[1024]; int count = 0; char temp; while ((temp = is.readChar()) != '\n') { buffer[count++] = temp; } System.out.println(buffer); } public static void testPushbackInputStream(String content) throws Exception { ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes()); PushbackInputStream pis = new PushbackInputStream(bais); int len = pis.available(); System.out.println("len: " + len); int temp; while ((temp = pis.read()) != -1) { if (temp == '.') { pis.unread(temp); temp = pis.read(); System.out.println("Pushback: " + (char) temp); } else { System.out.println((char) temp); } } } }
2.OutputStream
OutputStream 是所有的输出字节流的父类,它是一个抽象类。
ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,
ObjectOutputStream 和所有FilterOutputStream的子类都是装饰流。具体例子跟InputStream是对应的。
import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class IOTest { public static void main(String[] args) throws Exception { testZipInputStream_1("E:\\temp\\2012_04_23_mr_nr.zip", "E:\\temp\\"); } public static void testZipOutputStream_1(String fileNameSrc, String fileNameZip) throws Exception { File file = new File(fileNameSrc); File zipFile = new File(fileNameZip); InputStream is = new FileInputStream(file); OutputStream os = new FileOutputStream(zipFile); ZipOutputStream zos = new ZipOutputStream(os); ZipEntry ze = new ZipEntry("注意这个地方"); zos.putNextEntry(ze); zos.setComment("zip test"); // byte[] buffer = new byte[is.available()]; is.read(buffer); // zos.write(buffer); int temp = 0; while ((temp = is.read()) != -1) { zos.write(temp); } is.close(); zos.close(); os.close(); } public static void testZipOutputStream_2(String fileNameSrc, String fileNameZip) throws Exception { File file = new File(fileNameSrc); File zipFile = new File(fileNameZip); InputStream is = null; OutputStream os = new FileOutputStream(zipFile); ZipOutputStream zos = new ZipOutputStream(os); zos.setComment("zip test"); if (file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { is = new FileInputStream(files[i]); ZipEntry ze = new ZipEntry(file.getName() + File.separator + files[i].getName()); zos.putNextEntry(ze); byte[] buffer = new byte[is.available()]; is.read(buffer); zos.write(buffer); is.close(); } zos.close(); } } public static void testZipInputStream_1(String fileNameZip, String fileNameTo) throws Exception { File file = new File(fileNameZip); File outFile = null; ZipFile zipFile = new ZipFile(file); ZipInputStream zipInput = new ZipInputStream(new FileInputStream(file)); ZipEntry entry = null; InputStream input = null; OutputStream output = null; while ((entry = zipInput.getNextEntry()) != null) { System.out.println("解压缩" + entry.getName() + "文件"); outFile = new File(fileNameTo + File.separator + entry.getName()); if (!outFile.getParentFile().exists()) { outFile.getParentFile().mkdir(); } if (!outFile.exists()) { outFile.createNewFile(); } input = zipFile.getInputStream(entry); output = new FileOutputStream(outFile); int temp = 0; while ((temp = input.read()) != -1) { output.write(temp); } input.close(); output.close(); } } public static void testZipInputStream_2(String fileNameZip) throws Exception { File file = new File(fileNameZip); File fileTo = null; ZipFile zipFile = new ZipFile(file); InputStream is = new FileInputStream(file); ZipInputStream zis = new ZipInputStream(is); ZipEntry ze = null; } public static void testDataOutputStream(String fileName, String content) throws Exception { File file = new File(fileName); DataOutputStream dos = new DataOutputStream(new FileOutputStream(file, true)); dos.write(content.getBytes()); dos.close(); } public static void testFileOutputStream_1(String fileName, String content) throws Exception { File file = new File(fileName); OutputStream os = new FileOutputStream(file); os.write(content.getBytes()); os.close(); } public static void testFileOutputStream_2(String fileName, String content) throws Exception { File file = new File(fileName); OutputStream os = new FileOutputStream(file); byte[] buffer = content.getBytes(); for (int i = 0; i < buffer.length; i++) { os.write(buffer[i]); } os.close(); } public static void testFileOutputStream_3(String fileName, String content) throws Exception { File file = new File(fileName); OutputStream os = new FileOutputStream(file, true); os.write(content.getBytes()); os.close(); } public static void testFileOutputStream_4(String fileFormName, String fileToName) throws Exception { File fileFrom = new File(fileFormName); File fileTo = new File(fileToName); FileInputStream fis = new FileInputStream(fileFrom); FileOutputStream fos = new FileOutputStream(fileTo); int temp; while ((temp = fis.read()) != -1) { fos.write(temp); } fis.close(); fos.close(); } public static void testByteArrayOutputStream(String content) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = content.getBytes(); for (int i = 0; i < buffer.length; i++) { baos.write(buffer[i]); // baos.write(Character.toUpperCase(buffer[i])); } System.out.println(baos.toString()); baos.close(); } public static void testPipedStream() throws Exception { Send send = new Send(); Receive receive = new Receive(); send.getPos().connect(receive.getPis()); new Thread(send).start(); new Thread(receive).start(); } } class Send implements Runnable { private PipedOutputStream pos = null; public Send() { this.pos = new PipedOutputStream(); } public PipedOutputStream getPos() { return this.pos; } @Override public void run() { try { pos.write("Hello world!".getBytes()); } catch (IOException e) { e.printStackTrace(); } try { pos.close(); } catch (IOException e) { e.printStackTrace(); } } } class Receive implements Runnable { private PipedInputStream pis = null; public Receive() { this.pis = new PipedInputStream(); } public PipedInputStream getPis() { return this.pis; } @Override public void run() { byte[] buffer = new byte[1024]; int len = 0; try { len = this.pis.read(buffer); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { this.pis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Received: " + new String(buffer, 0, len)); } }
3.字节流的输入与输出的对应图示
图中蓝色的为主要的对应部分,红色的部分就是不对应部分。紫色的虚线部分代表这些流一般要搭配使用。从上面的图中可以看出Java IO 中的字节流是极其对称的。哲学上讲“存在及合理”,现在我们看看这些字节流中不太对称的几个类吧!
4.几个特殊的输入流类分析
LineNumberInputStream
主要完成从流中读取数据时,会得到相应的行号,至于什么时候分行、在哪里分行是由改类主动确定的,并不是在原始中有这样一个行号。在输出部分没有对应的部分,我们完全可以自己建立一个LineNumberOutputStream,在最初写入时会有一个基准的行号,以后每次遇到换行时会在下一行添加一个行号,看起来也是可以的。好像更不入流了。
PushbackInputStream
其功能是查看最后一个字节,不满意就放入缓冲区。主要用在编译器的语法、词法分析部分。输出部分的BufferedOutputStream 几乎实现相近的功能。
StringBufferInputStream
已经被Deprecated,本身就不应该出现在InputStream部分,主要因为String 应该属于字符流的范围。已经被废弃了,当然输出部分也没有必要需要它了!还允许它存在只是为了保持版本的向下兼容而已。
SequenceInputStream
可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从IO 包中去除,还完全不影响IO 包的结构,却让其更“纯洁”――纯洁的Decorator 模式。
PrintStream
也可以认为是一个辅助工具。主要可以向其他输出流,或者FileInputStream 写入数据,本身内部实现还是带缓冲的。本质上是对其它流的综合运用的一个工具而已。一样可以踢出IO 包!System.err和System.out 就是PrintStream 的实例!
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.io.SequenceInputStream; public class IOTest { public static void testSystemIn(String fileName) throws Exception { File file = new File(fileName); InputStream is = new FileInputStream(file); System.setIn(is); byte[] buffer = new byte[is.available()]; System.in.read(buffer); System.out.println(new String(buffer)); } public static void testSystemErr_2(String fileName) throws Exception { File file = new File(fileName); System.err.println("输出到控制台"); OutputStream os = new FileOutputStream(file); PrintStream ps = new PrintStream(os); System.setErr(ps); System.err.println("重定向输出到文件err"); } public static void testSysteErr_1() throws Exception { OutputStream os = System.err; os.write("Hello world!".getBytes()); os.close(); } public static void testSystemOut_2(String fileName) throws Exception { File file = new File(fileName); System.out.println("输出到控制台"); OutputStream os = new FileOutputStream(file); PrintStream ps = new PrintStream(os); System.setOut(ps); System.out.println("重定向输出到文件"); } public static void testSysteOut_1() throws Exception { OutputStream os = System.out; os.write("Hello world!".getBytes()); os.close(); } public static void testPrintStream(String fileName) throws Exception { File file = new File(fileName); OutputStream os = new FileOutputStream(file); PrintStream ps = new PrintStream(os); ps.println("Hellow world!"); ps.append("你好!"); ps.println(); String name = "James"; int age = 20; ps.printf("This is %s, and he is %d", name, age); ps.flush(); ps.close(); os.close(); } public static void testSequenceInputStream(String fileFrom1, String fileFrom2, String fileTo) throws Exception { File file1 = new File(fileFrom1); File file2 = new File(fileFrom2); File file3 = new File(fileTo); InputStream is1 = new FileInputStream(file1); InputStream is2 = new FileInputStream(file2); OutputStream os = new FileOutputStream(file3); SequenceInputStream sis = new SequenceInputStream(is1, is2); int temp = 0; while ((temp = sis.read()) != -1) { os.write(temp); } is1.close(); is2.close(); os.close(); sis.close(); } }
5.Reader
Reader 是所有的输入字符流的父类,它是一个抽象类。
CharReader、StringReader是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。
BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。
FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。
InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。
实例:
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.Reader; import java.util.Scanner; public class ReaderTest { public static void testFileReader_1(String fileName) throws Exception { File file = new File(fileName); Reader reader = new FileReader(file); char[] buffer = new char[1024]; reader.read(buffer); System.out.println(new String(buffer)); reader.close(); } public static void testFileReader_2(String fileName) throws Exception { File file = new File(fileName); Reader reader = new FileReader(file); int temp = 0; int count = 0; char[] buffer = new char[1024]; while ((temp = reader.read()) != -1) { buffer[count++] = (char) temp; } reader.read(buffer); System.out.println(new String(buffer, 0, count)); reader.close(); } public static void testBufferedReader(String fileName) throws Exception { File file = new File(fileName); FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader); int temp = 0; int count = 0; char[] buffer = new char[1024]; while ((temp = bufferedReader.read()) != -1) { buffer[count++] = (char) temp; } System.out.println(new String(buffer, 0, count)); bufferedReader.close(); fileReader.close(); } public static void testScanner_1() throws Exception { Scanner scanner = new Scanner(System.in); int intVal = scanner.nextInt(); System.out.println(intVal); double doubleVal = scanner.nextDouble(); System.out.println(doubleVal); String next = scanner.next(); System.out.println(next); } public static void testScanner_2(String fileName) throws Exception { File file = new File(fileName); Scanner scanner = new Scanner(file); while (scanner.hasNextLine()) { System.out.println(scanner.nextLine()); } scanner.close(); } }
6.Writer
Writer 是所有的输出字符流的父类,它是一个抽象类。
CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。
PipedWriter 是向与其它线程共用的管道中写入数据,
BufferedWriter 是一个装饰器为Writer 提供缓冲功能。
PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。
OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream 极其类似,后面会有它们的对应图。
实例:
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.Writer; public class WriterTest { public static void testFileWriter(String fileName) throws Exception { File file = new File(fileName); Writer writer = new FileWriter(file, true); writer.write("Hello world!"); writer.flush(); writer.close(); } public static void testBufferedWriter(String fileName) throws Exception { File file = new File(fileName); BufferedWriter bw = new BufferedWriter(new FileWriter(file)); bw.write("你好"); bw.flush(); bw.close(); } }
7.字符流的输入与输出的对应
8.字符流与字节流转换
转换流的特点:
(1)其是字符流和字节流之间的桥梁
(2)可对读取到的字节数据经过指定编码转换成字符
(3)可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
当字节和字符之间有转换动作时;
流操作的数据需要编码或解码时。
具体的对象体现:
InputStreamReader:字节到字符的桥梁
OutputStreamWriter:字符到字节的桥梁
这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。
实例:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; public class IOTest { public static void testInputStreamReader(String fileName) throws Exception { File file = new File(fileName); FileInputStream fis = new FileInputStream(file); Reader reader = new InputStreamReader(fis); char[] buffer = new char[1024]; int len = reader.read(buffer); System.out.println(new String(buffer, 0, len)); reader.close(); fis.close(); } public static void testOutputStreamWriter(String fileName) throws Exception { File file = new File(fileName); FileOutputStream fos = new FileOutputStream(file); Writer writer = new OutputStreamWriter(fos); writer.write("Hello world!"); writer.flush(); writer.close(); } }
9.File
File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
实例:
import java.io.File; public class FileTest { public static void testFile_1() { System.out.println(File.separator); System.out.println(File.separatorChar); System.out.println(File.pathSeparator); System.out.println(File.pathSeparatorChar); } public static void testFile_2(String fileName) { File file = new File(fileName); if (file.isDirectory()) { String[] fileStrs = file.list(); for (int i = 0; i < fileStrs.length; i++) { System.out.println(i + " -> " + fileStrs[i]); } File[] fileList = file.listFiles(); for (int i = 0; i < fileList.length; i++) { System.out.println(i + " => " + fileList[i].getAbsolutePath()); } } else if (file.isFile()) { System.out.println(file.getAbsolutePath()); } } }
10.RandomAccessFile类
该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区(字符数组),通过内部的指针来操作字符数组中的数据。该对象特点:
1.该对象只能操作文件,所以构造函数接收两种类型的参数:a.字符串文件路径;b.File对象。
2.该对象既可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式(r,rw)
3.注意:该对象在实例化时,如果要操作的文件不存在,会自动创建;如果文件存在,写数据未指定位置,会从头开始写,即覆盖原有的内容。可以用于多线程下载或多个线程同时写数据到文件。
实例:
import java.io.File; import java.io.RandomAccessFile; public class FileTest { public static void testRandomAccessFile_2(String fileName) throws Exception { File file = new File(fileName); RandomAccessFile raf = new RandomAccessFile(file, "rw"); String utf = raf.readUTF(); Boolean bol = raf.readBoolean(); char c = raf.readChar(); double d = raf.readDouble(); float f = raf.readFloat(); short s = raf.readShort(); int i = raf.readInt(); long l = raf.readLong(); System.out.println(utf); System.out.println(bol); System.out.println(c); System.out.println(d); System.out.println(f); System.out.println(s); System.out.println(i); System.out.println(l); } public static void testRandomAccessFile_1(String fileName) throws Exception { File file = new File(fileName); RandomAccessFile raf = new RandomAccessFile(file, "rw"); raf.writeUTF("UTF String Test"); raf.writeBoolean(true); raf.writeChar('x'); raf.writeDouble(12.24); raf.writeFloat(33.12F); raf.writeShort(24); raf.writeInt(25); raf.writeLong(1234); raf.close(); } public static void testFile_1() { System.out.println(File.separator); System.out.println(File.separatorChar); System.out.println(File.pathSeparator); System.out.println(File.pathSeparatorChar); } public static void testFile_2(String fileName) { File file = new File(fileName); if (file.isDirectory()) { String[] fileStrs = file.list(); for (int i = 0; i < fileStrs.length; i++) { System.out.println(i + " -> " + fileStrs[i]); } File[] fileList = file.listFiles(); for (int i = 0; i < fileList.length; i++) { System.out.println(i + " => " + fileList[i].getAbsolutePath()); } } else if (file.isFile()) { System.out.println(file.getAbsolutePath()); } } }
11.ObjectInputStream,ObjectOutputStream和Serializable,Externalizable
实例
import java.io.Externalizable; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.Serializable; public class IOTest { public static void testObjectOutputStream_1(String fileName) throws Exception { File file = new File(fileName); OutputStream os = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(os); Person person = new Person("小明", 12); oos.writeObject(person); oos.flush(); oos.close(); os.close(); } public static void testObjectOutputStream_2(String fileName) throws Exception { File file = new File(fileName); OutputStream os = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(os); Animal animal = new Animal("小狗", 2); oos.writeObject(animal); oos.flush(); oos.close(); os.close(); } public static void testObjectOutputStream_3(String fileName) throws Exception { File file = new File(fileName); OutputStream os = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(os); Factory factory = new Factory("淘宝", "杭州"); oos.writeObject(factory); oos.flush(); oos.close(); os.close(); } public static void testObjectInputStream_1(String fileName) throws Exception { File file = new File(fileName); InputStream is = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(is); Object object = ois.readObject(); Person person = (Person) object; System.out.println(person); ois.close(); is.close(); } public static void testObjectInputStream_2(String fileName) throws Exception { File file = new File(fileName); InputStream is = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(is); Object object = ois.readObject(); Animal animal = (Animal) object; System.out.println(animal); ois.close(); is.close(); } public static void testObjectInputStream_3(String fileName) throws Exception { File file = new File(fileName); InputStream is = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(is); Object object = ois.readObject(); Factory factory = (Factory) object; System.out.println(factory); ois.close(); is.close(); } } class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return "name:" + this.name + ",age:" + this.age; } } class Animal implements Externalizable { private String name; private int age; public Animal() { } public Animal(String name, int age) { this.name = name; this.age = age; } public String toString() { return "name:" + this.name + ",age:" + this.age; } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(this.name); out.writeInt(this.age); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { this.name = (String) in.readObject(); this.age = in.readInt(); } } class Factory implements Serializable { private static final long serialVersionUID = 1L; private String name; private transient String address; public Factory() { } public Factory(String name, String address) { this.name = name; this.address = address; } public String toString() { return "name:" + this.name + ",address:" + this.address; } }
相关推荐
总之,Java IO是Java平台的重要组成部分,对于任何Java开发者来说,理解和掌握Java IO的结构及核心概念是至关重要的。通过熟练运用这些工具,开发者可以有效地实现数据的读取、写入、转换和传输,从而构建出功能强大...
文件夹的遍历可以使用`java.io.File`类的递归方法。同时,服务端还需要处理目录结构,确保在客户端重建相同的目录结构。 客户端则需要接收服务端发送的数据,并将其写入本地磁盘。这里,我们需要用到Socket的...
标签“JAVA”确认了这个话题与Java编程语言紧密相关,因此我们还可以期待这个项目可能涉及到Java的基础语法、类与对象、异常处理、输入/输出流、集合框架、多线程、IO流(包括文件流和网络流)等核心概念。...
为了确保聊天消息的同步,可能需要使用线程安全的数据结构,如ConcurrentHashMap来存储在线用户及其对应的Socket对象。 在“net.zip”压缩包中,可能包含了以下文件和目录: 1. Server.java:服务器端程序,包含...
学习Java IO,不仅需要理解各个类的用法,还需要熟悉流的层次结构,了解何时选择使用字节流还是字符流,以及如何利用缓冲和转换来优化性能。此外,对于网络编程,还需要掌握Socket和ServerSocket等网络I/O类。通过...
文件名"dd16b88f-d8ed-3378-b8a6-1ba319c0ea27.gif"和"eximg.jpeg"可能代表了这个Java IO结构图的图片文件,可以帮助读者直观地理解这个复杂的体系。 总之,Java IO系统为开发者提供了强大而灵活的工具来处理输入...
在本篇文章中,我们将深入探讨Java IO流的基本结构、主要类和接口,以及如何使用它们来操作文件。"IO流结构图_io_java_思维导图_" 提供了一个清晰的可视化工具,帮助开发者理解这一复杂主题。 首先,让我们了解一下...
Java中的IO(输入/输出)系统是编程中不可或缺的一部分,特别是在处理数据的读取、写入、传输和存储时。本教程将深入讲解Java IO流的基础知识,包括其概念、分类、常用类以及如何在实际编程中应用。 一、IO流的概念...
2、常用21个IO流:FileWriter、FileReader、...3、JAVA IO流经典代码示例,示例从易到难。代码功能涉及字节、字符、字符串、文本文件、图片、音频、视频。演示错误用法和经典用法。 4、代码的结构可查看README文件。
2. **层次结构**:Java IO系统采用层次化的结构设计,使得用户可以根据需求选择合适的流进行组合使用。 3. **可扩展性**:通过装饰器模式和过滤器模式,可以轻松地扩展流的功能。 4. **灵活性**:Java IO系统提供了...
在"VIP09_JavaSE_JavaIO_File_day0307-1.rar"这个压缩包中,我们可以预想它包含的是一个关于Java IO和File类的课程或教程的第三天第七节的内容。下面,我们将深入探讨Java IO和File类的相关知识点。 1. **Java IO...
这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、文件操作、对象序列化以及NIO(非阻塞IO)等多个方面进行展开。 一、Java IO体系结构 Java IO体系是Java平台中用于处理数据输入...
### 传智播客_Java培训_毕向东_Java基础[07-IO]知识点解析 #### 一、概述 本教程由传智播客的资深讲师毕向东老师讲解,主要内容涉及Java语言中的输入输出(IO)技术。这部分是Java编程的基础之一,对于初学者来说...
### Java IO 类层次结构解析 #### 一、概述 Java IO(Input/Output)系统是Java平台中的一个重要组成部分,用于处理程序与外部设备之间的数据交换。Java IO系统提供了丰富的类来支持不同类型的输入输出操作,包括...
Java IO(输入输出)是Java编程语言中处理数据输入和输出的核心部分,它提供了一系列类和接口用于在程序与外部资源之间传输数据。在Java中,IO操作涉及到文件的读写、流的处理以及网络通信等。以下是关于Java IO中的...
### Java IO详解 #### 1. 什么是IO 在计算机科学中,IO(Input/...理解Java IO的基本原理和类结构对于开发高效稳定的Java应用程序至关重要。通过合理选择和组合不同的流类,开发者可以轻松实现各种复杂的IO功能。
Java IO体系结构主要由以下几个核心部分组成: 1. **流(Streams)**:Java IO的核心概念是流,它们代表数据的源和目的地。流可以是字节流或字符流,分为输入流和输出流。字节流处理单个字节的数据,而字符流处理...
总的来说,Java的IO流体系结构复杂而强大,它提供了多种工具和策略来处理各种数据传输场景,包括文件操作、网络通信、对象序列化等。理解并熟练运用这些流可以帮助我们构建高效、可靠的Java应用程序。
Java的IO库是一个复杂而强大的系统,其设计思想和实现方式体现了多种设计模式,包括Decorator(装饰者)模式和Adapter(适配器)模式。本文将深入探讨这两个模式在Java/IO中的应用,并通过实例解释它们如何使得Java...