`
benson76
  • 浏览: 34559 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java I/O系统 笔记[1]

    博客分类:
  • JAVA
 
阅读更多

2.输入和输出

public abstract class InputStream extends Object implements Closeable

此抽象类是表示字节输入流的所有类的超类。

直接已知子类:AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream

 

public abstract class OutputStream extends Object implements Closeable, Flushable

此抽象类是表示输出字节流的所有类的超类。

直接已知子类:ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

 3.添加属性和有用的借口

      Java I/O类库需要多种不同功能的组合,这正是装饰器模式的理由所在。这也是Java I/O类库里存在filter类的原因所在原因抽象类filter是所有装饰器类的基类。装饰器必须具有和它所装饰的对象相同的接口,但它也可以扩展接口。

      Java I/O类库操作不便的原因在于:我们必须创建许多类----“核心”I/O类型加上所有的装饰器,才能得到我们所希望的单个I/O对象。

public class FilterInputStream extends InputStream

直接已知子类:BufferedInputStream, CheckedInputStream, CipherInputStream, DataInputStream, DeflaterInputStream, DigestInputStream, InflaterInputStream, LineNumberInputStream, ProgressMonitorInputStream, PushbackInputStream

 

public class DataInputStream extends FilterInputStream implements DataInput

DataInputStream允许我们读取不同的基本类型数据以及String对象(所有方法都以“read”开头,readInt()等)。搭配相应的DataOutputStream,就可以通过数据“流”将基本类型的数据从一个地方迁移到另一个地方。

 

public interface DataInput

DataInput接口用于从二进制流中读取字节,并根据所有Java 基本类型数据进行重构。

 

public interface DataOutput

DataOutput接口用于将数据从任意Java基本类型转换为一系列字节,并将这些字节写入二进制流。

 

public class FilterOutputStream extends OutputStream

直接已知子类:BufferedOutputStream, CheckedOutputStream, CipherOutputStream, DataOutputStream, DeflaterOutputStream, DigestOutputStream, InflaterOutputStream, PrintStream

4.Reader和Writer

       InputStream和OutputStream在以面向字节形式的I/O提供极有价值的功能,Reader和Writer则提供兼容Unicode与面向字符的I/O功能。

public abstract class Reader extends Object implements Readable, Closeable

用于读取字符流的抽象类。

直接已知子类:BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

 

public abstract class Writer extends Object implements Appendable, Closeable, Flushable

写入字符流的抽象类。

直接已知子类:BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter

 

public class FileReader extends InputStreamReader

 

      有时我们必须把来自于“字节”层次结构中的类和“字符”层次结构中的类结合起来使用。为了实现这个目的,要用到“适配器”类:InputStreamReader可以把InputStream转换为Reader,而OutputStreamWriter可以把OutputStream转换为Writer。

      设计Reader和Writer继承层次结构主要是为了国际化。老的I/O流继承层次结构仅支持8位字节流,并且不能很好地处理16位的Unicode字符。由于Unicode用于字符国际化(Java本身的char也是16位的Unicode),所以添加Reader和Writer继承层次结构就是为了在所有的I/O操作中都支持Unicode。

      对于InputStream和OutputStream来说,我们会使用FilterInputStream和FilterOutputStream的装饰器子类来修改“流”以满足特殊需要。Reader和Writer的类继承层次结构继续沿用相同的思想---但是并不完全相同。尽管BufferedInputStream是FilterInputStream的子类,但是BufferedReader并不是FilterWriter的子类。

public class BufferedReader extends Reader

public class BufferedWriter extends Writer

5.自我独立的类:RandomAccessFile

RandomAccessFile适用于由大小已知的记录组成的文件,所以可以使用seek()将记录从一处转移到另一处。

 

public class RandomAccessFile extends Object implements DataOutput, DataInput, Closeable

RansomAccessFile不是InputStream或者OutputStream继承层次结构中的一部分。getFilePointer(),seek(),length()。

另外,其构造器还需要第二个参数,用来指示是“随机读”(r)还是“既读又写”(rw)。它并不支持只写文件。

6.I/O流的典型使用方式

 

//缓冲输入文件
public class BufferedInputFile {
	public static String read(String filename) throws IOException{
		BufferedReader in = new BufferedReader(new FileReader(filename));
		String s;
		StringBuilder sb = new StringBuilder();
		while((s=in.readLine()) != null){
			sb.append(s+"\n");
		}
		in.close();
		return sb.toString();
	}
	public static void main(String[] args) throws IOException{
		System.out.println(read(System.getProperty("user.dir") + "\\src\\BufferedInputFile.java"));
	}
}

 

//从内存输入
public class MemoryInput {
	public static void main(String[] args) throws IOException {
		StringReader sr = new StringReader(BufferedInputFile.read("src\\BufferedInputFile.java"));
		int c;
		while((c=sr.read()) != -1){
			System.out.println((char)c);
		}
	}
}

 

//格式化的内存输入
public class FormattedMemoryInput {   
	public static void main(String[] args) {   
		try {   
			//DataInputStream数据输入流允许应用程序以与机器无关方式从基础输入流中读取基本 Java 数据类型。   
			//ByteArrayInputStream 包含一个内部缓冲区,该缓冲区存储从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。   
			DataInputStream in = new DataInputStream(new ByteArrayInputStream(BufferedInputFile.read("src/FormattedMemoryInput.java").getBytes()));   
			while(true){   
				System.out.print((char)in.readByte());   
			}   
		} catch (IOException e) {   
		}   
	}   
}

 

//基本的文件输出
public class BasicFileOutput {
	static String filename = "BasicFileOutput.out";   
    public static void main(String[] args) throws IOException {   
        BufferedReader in = new BufferedReader(new StringReader(BufferedInputFile.read("src/FormattedMemoryInput.java")));   
        //BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。    
        //PrintWriter向文本输出流打印对象的格式化表示形式   
        BufferedWriter pw = new BufferedWriter(new FileWriter(filename));   
        int lineCount=1;   
        String s;   
        while((s=in.readLine())!=null){   
            pw.write(lineCount++ + ":    " + s + "\n");   
        }   
        pw.close();
        System.out.println(BufferedInputFile.read(filename));   
    }   
}

 如果不为所有的输出文件调用close(),就会发现缓冲区内容不会被刷新清空,那么它们就不完整。

//存储和恢复数据
public class StoringAndRecoveringData {
  public static void main(String[] args) throws IOException {
    DataOutputStream out = new DataOutputStream(
      new BufferedOutputStream(
        new FileOutputStream("Data.txt")));
    out.writeDouble(3.14159);
    out.writeUTF("That was pi");
    out.writeDouble(1.41413);
    out.writeUTF("Square root of 2");
    out.close();
    DataInputStream in = new DataInputStream(
      new BufferedInputStream(
        new FileInputStream("Data.txt")));
    System.out.println(in.readDouble());
    // Only readUTF() will recover the
    // Java-UTF String properly:
    System.out.println(in.readUTF());
    System.out.println(in.readDouble());
    System.out.println(in.readUTF());
  }
}

8.标准I/O

按照标准I/O模型,Java提供了System.in、System.out和System.err。

System.out和System.err已经实现被包装成了PrintStream(FilterOutputStream子类),但System.in却是一个没有被包装过的未经加工的InputStream。这意味着可以立即使用System.out和System.err,但是在读取System.in之前必须对其进行包装。

//从标准输入中读取
public class Echo {
  static void main(String[] args) throws IOException {
    System.out.println(123);
    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    String s;
    while((s=stdin.readLine()) != null && s.length() != 0){
      System.out.println(s);
    }
  }
}

 

//标准I/O重定向
//I/O重定向操纵的是字节流,而不是字符流;因此我们使用的是InputStream和OutputStream,而不是Reader和Writer
public class Redirecting {
  public static void main(String[] args)
  throws IOException {
    PrintStream console = System.out;
    BufferedInputStream in = new BufferedInputStream(
        new FileInputStream("src/Redirecting.java"));
    PrintStream out = new PrintStream(
        new BufferedOutputStream(
            new FileOutputStream("test.out")));
    System.setIn(in);
    System.setOut(out);
    System.setErr(out);
    BufferedReader br = new BufferedReader(
        new InputStreamReader(System.in));
    String s;
    while((s = br.readLine()) != null)
      System.out.println(s);
    out.close(); // Remember this!
    System.setOut(console);
  }
}

 

 

 

  • 大小: 3.7 KB
分享到:
评论

相关推荐

    Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O

    Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...

    Java I/O详细笔记

    ### Java I/O详细笔记 #### 一、流的分类 Java I/O系统主要涉及四种基本的流分类方式:根据数据流动的方向、数据处理的类型、流处理的源以及是否使用了缓冲机制。 **1. 按数据流动方向** - **输入流(Input ...

    java_I/O流的教程

    本教程详细讲解了这些知识点,并配以代码示例和笔记,旨在帮助学习者逐步掌握Java I/O流的使用,无论你是初学者还是有一定经验的开发者,都能从中受益。通过深入学习和实践,你将能够熟练地处理各种数据输入输出场景...

    Java学习笔记.zip

    Java学习笔记是一个包含了Java编程语言基础、面向对象编程、异常处理、集合框架、I/O操作、多线程编程、网络编程、数据库连接、JVM原理、高级特性以及开发技巧等多方面知识的综合性学习资料。这些内容相互关联,共同...

    java读书笔记笔记笔记笔记笔记笔记

    笔记通常涵盖了语言的基础概念、核心特性、类与对象、内存管理、多线程、异常处理、输入/输出(I/O)系统等方面的内容。 【描述】"别下别下别下别下别下别下别下别下别下别下别下别下别下别下别下别下别下别下别下" ...

    JAVA JDK学习笔记i\o部分

    ### JAVA JDK 学习笔记 i/o 部分 #### 输入/输出 (I/O) 概述 在程序设计中,输入/输出(Input/Output,简称I/O)是指计算机程序与外部设备(如硬盘、视频设备、网络主机等)之间进行数据交换的过程。由于涉及的...

    Java/JavaEE 学习笔记

    第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础知识.....96 第三章 泛型...........101 第四章 ...

    java学习笔记--PrintStream分享.pdf

    通过对PrintStream和PrintWriter的分析,我们可以看到,Java I/O流是一个非常复杂的系统,但是了解每个组件的作用和使用场景,可以帮助我们更好地使用Java I/O流。 在实际应用中,我们可以使用PrintStream和...

    java_I\O学习笔记

    java_I\O学习笔记 主要讲的是字节流以及缓冲流的操作

    java超强笔记

    文件I/O操作是任何编程语言都不可或缺的部分,Java也不例外。笔记会讲解如何在Java中读写文件,理解流的概念,以及文件的复制、追加等操作。 在面向对象高级特性的部分,笔记可能包含抽象类、接口、内部类、匿名类...

    Java_IO操作总结

    在实际开发中,Java I/O还涉及字符编码问题,如ASCII、ISO-8859-1、UTF-8等。理解字符编码对于正确处理文本数据至关重要,尤其是在处理多国语言时。 此外,Java集合框架和JDBC(Java Database Connectivity)也是...

    Java学习笔记PPT

    总的来说,这份"Java学习笔记PPT"是初学者和进阶者学习Java的理想资料,覆盖了语言基础、面向对象、集合框架、异常处理、I/O系统、多线程等多个方面,旨在帮助读者系统地掌握Java编程技能,并能灵活运用到实际项目中...

    《java学习》-java学习笔记.zip

    此外,NIO(非阻塞I/O)和文件操作也是这部分的重要内容。了解并熟练运用各种流类,能有效地处理文件读写、网络通信等问题。 4. **SQL(SQL.md)**: 虽然SQL不是Java语言的一部分,但Java开发者经常需要与数据库...

    李兴华java笔记

    笔记会讲解流的分类、缓冲流、字符流与字节流的区别,以及NIO(非阻塞I/O)的相关知识。 5. **多线程**:Java支持多线程编程,使得程序能同时执行多个任务。笔记将介绍线程的创建方式、同步机制(如synchronized...

    JavaIO:OReilly.Java.I.O.2nd.Edition中文翻译和学习笔记

    O'Reilly的《Java I/O》第二版是一本深入探讨这一主题的经典书籍,它详尽地介绍了Java IO系统的设计、工作原理以及如何有效地使用这些工具。中文翻译和学习笔记的出现,为中文读者提供了极大的便利,能够帮助他们更...

    java全套笔记 来自狂神说java笔录.zip

    11. **Java IO/NIO**:深入理解流的分类,学习非阻塞I/O模型NIO(New Input/Output)。 12. **Java 8及更高版本新特性**:包括Lambda表达式、Stream API、Optional类、日期时间API的改进等。 这些笔记内容全面覆盖...

    韩顺平_循序渐进学Java零基础【完整笔记】1

    【标题】:“韩顺平_循序渐进学Java零基础【完整笔记】1” 【描述】:这个课程是为初学者设计的,旨在通过系统的学习帮助学生掌握Java编程的基础。课程分为三个阶段,详细讲解了Java语言的核心概念、就业前景以及在...

    java学习笔记markdown

    Java的I/O流系统用于读写数据,包括字符流和字节流。文件输入输出、网络通信和数据转换都依赖于I/O流。这部分笔记可能详细介绍了`InputStream`、`OutputStream`、`Reader`、`Writer`及其子类,以及缓冲流和转换流的...

    java笔记本功能实现

    - 文件I/O操作:使用`java.io`包,如`FileWriter`和`BufferedReader`,将笔记内容写入和读取文件。可能需要JSON或XML序列化技术来保存额外的元数据,如撤销历史。 - 文件对话框:`JFileChooser`类提供了一种让用户...

    java笔记资源-java语言教程

    本资源集合了Java语言的核心教程和笔记,涵盖了多个Java学习的重要领域,包括但不限于Java基础、Java I/O、Java并发、Java容器以及Java虚拟机(JVM)。 Java基础部分通常包括了Java语言的基本语法、数据类型、控制...

Global site tag (gtag.js) - Google Analytics