`

java编程思想笔记(十二)I/O

 
阅读更多

1.输入和输出

java中流是个抽象的概念,它代表有能力输出和输入的对象,流封装了其功能的底层实现,IO分为输入流和输出流,输入流和输出流各自有字节流和字符流.

 

(1)InpuStream

 

输入流InputStream负责从各种数据/文件源产生输入,输入源包括:数组,字符串,文件,管道,一系列其他类型的流,以及网络连接产生的流等等。

常用字节输入流的主要类型:

(1).ByteArrayInputStream字节数组输入流:

主要功能:允许内存缓存作为输入流。

ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪read()方法要提供的下一个字节。

注意:关闭ByteArrayInputStream无效,该类中的方法在关闭此流之后仍可被调用,而不会产生任何的IOException。

(2).FileInputStream文件输入流:

主要功能:从文件系统中的某个文件获得输入字节,用于读取诸如图像数据子类的原始字节流。若要读取字符流,请使用FileReader。

(3).PipedInputStream管道输入流:

主要功能:和管道输出流一起构成一个输入输出的管道,是管道的数据输入端。

管道输入流应该连接到管道输出流,管道输入流提供要写入管道输出流的所有数据字节。通常,这些数据有某个线程从PipedInputStream对象中读取,并有其他线程将其写入到相应的PipedOutputStream对象中。

注意:不建议PipedInputStream和PipedOutputStream对象使用单线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可以在缓冲区限定范围内将读操作和写操作分离开,如果先连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。

(4).SequenceInputStream顺序输入流:

重要功能:将两个或多个输入流对象转换为一个单个输入流对象。

SequenceInputStream表示其他输入流的逻辑串联关系,它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,以此类推,直到到达包含的最后一个输入流的文件末尾为止。

(5).FilterInputStream过滤输入流:

主要功能:包含其他一些输入流,将这些被包含的输入流用作其基本数据源,它可以直接传输数据或者提供一些额外的功能。

常用的FilterInputStream是DataInputStream数据输入流,主要用于允许程序以与机器无关的方式从底层输入流中读取java基本数据类型。其常用的方法有readInt(),readBoolean(),readChar()等等。

 

 

(2)OutputStream

 

和字节输入流相对应,字节输出流负责字节类型数据想目标文件或设备的输出。常见的字节输出流如下:

(1).ByteArrayOutputStream字节数组输出流:

主要功能:在内存中创建一个缓冲区,将接收到的数据放入该内存缓冲区中。

ByteArrayOutputStream实现了一个输出流,其中的数据被写入一个byte数组中。缓冲区会随着数据的不断写入而自动增长,可使用toByteArray()和toString()方法获取数据。

注意:和ByteArrayInputStream类似,关闭ByteArrayOutputStream也是无效的,此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。

(2).FileOutputStream文件输出流:

主要功能:将数据写入到指定文件中。

文件输出流是用于将数据写入File或FIleDescriptor的输出流,用于写入诸如图像数据之类的原始字节流,若要写入字符流,请使用FileWriter。

(3).PipedOutputStream管道输出流:

主要功能:连接管道输入流用来创建通信管道,管道输出流是管道数据输出端。

(4).FilterOutputStream过滤输出流:

主要功能:用于将已存在的输出流作为其基本数据接收器,可以直接传输数据或提供一些额外的处理。

常用的FIlterOutputStream是DataOutputStream数据输出流,它允许程序以适当的方式将java基本数据类型写入输出流中。其常用方法有writeInt(intV),writeChar(int v),writeByte(String s)等等

 

2.字符流:

Java中得字节流只能针对字节类型数据,即支持处理8位的数据类型,由于java中的是Unicode码,即两个字节代表一个字符,于是在JDK1.1之后提供了字符流Reader和Writer。

字符流相关常用接口如下:

(1).Reader:

用于读取字符串流的抽象类,子类必须实现的方法只有reader(char[],int, int)和close()。

(2).InputStreamReader:

是将字节输入流转换为字符输入流的转换器,它使用指定的字符集读取字节并将其解码为字符。即:字节——>字符。

它使用的字符集可以有名称指定或显式给定,也可以使用平台默认的字符集。

(3).Writer:

用于写入字符流的抽象类,子类必须实现的方法只有write(char[],int, int)和close()。

(4).OutputStreamWriter:

是将字符输出流转换为字节输出流的转换器,它使用指定的字符集将要写入流的字符编码成字节。即:字符——>字节。

 

 

3.综合使用Java IO各种流:

java IO中的各种流,很少单独使用,经常结合起来综合使用,既可以满足特定需求,又高效。例子如下:

 

(1).使用缓冲流读取文件

 

import java.io.*;  
  
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(“BufferedInputFile.java”));  
}  
}  
 

 

 

 

(2).读取内存中的字符串:

import java.io.*;  
  
public class MemoryInput{  
    public static void main(String[] args) throws IOException{  
        //将字符串包装为字符输入流  
        StringReader in = new StringReader(  
  BufferedInputFile.read(“BufferedInputFile.java”));  
        int c;  
        //读取字符输入流中的字符  
        while((c == in.read()) != -1){  
    System.out.println((char)c);  
}  
}  
} 

  

 

(3).数据输入/输出流:

import java.io.*;  
  
public class DataInputOutput{  
    public static void main(String[] args) thows 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 FileOutputStream(“Data.txt”)));  
        System.out.println(in.readDouble());  
        System.out.println(in.readUTF());  
System.out.println(in.readDouble());  
        System.out.println(in.readUTF());  
}  
}  

 

 

输出结果:

3.14159

That was pi

1.41413

Square root of 2

(4).文本文件输出流:

import java.io.*;  
  
public class TextFileOutput{  
    //输出文件名  
    static String file = “BasicFileOutput.out”;  
    public static void main(String[] args) throws IOException{  
        //将字符串先包装成字符串输入流,然后将字符串输入流再包装成缓冲字符输入流  
    BufferedReader in = new BufferedReader(new StringReader  
(BufferedInputFile.read(“TextFileOutput.java”)));  
        //字符输出流  
        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file)));  
        int lineCount = 1;  
        String s;  
        While((s = in.readLine()) != null){  
    out.println(lineCount++ + “: ” + s);  
}  
out.close();  
}  
}  

 

 

 

(5).二进制文件读写:

import java.io.*;  
  
public class BinaryFileOutput{  
    //输出文件名  
    static String file = “BinaryFileOutput.out”;  
    public static void main(String[] args) throws IOException{  
        //将字符串先包装成字符串输入流,然后将字符串输入流再包装成缓冲字符输入流  
    BufferedInputStream in = new BufferedInputStream(  
new FileInputStream(“TestFile.png”)));  
        //字符输出流  
        BufferedOutputStream out = new BufferedOutputStream (  
new FileOutputStream(file));  
        byte[] buf = new byte[1024];  
        int n;  
        While((n = in.read(buf)) > 0){  
    out.write(buf, 0, n);  
}  
out.close();  
}  
}  

 

 

 3.标准I/O

 标准I/O概念就是“程序所使用的单一信息流”,根据标准I/O模型,java提供System.in,System.out,System.err,其中System.out和System.err已经包装成printStream,System.in未经包装,属于InputStream类型,要使用的话得包装使用。

 

import java.io.*;

public class Echo {
	public static void main(String[] args) throws IOException {
                //把System.in包装进InputStreamReader
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s2;

		while ((s2 = br.readLine()) != null && s2.length() != 0)
			System.out.println(s2);
	}
}

 

PrintWriter包装System.out

import java.io.*;

public class ChangeSystemOut {
	public static void main(String[] args) {
		PrintWriter out = new PrintWriter(System.out, true);
		out.println("Hello, world");
		
	}
}

 

java的System提供了一些静态方法,可以设置标准输入输出和标准错误I/O进行重定向

//关键代码如下:
System.setIn(in);// *
System.setOut(out);// *
System.setErr(out);// *
import java.io.*;

public class Redirecting {
	public static void main(String[] args) throws IOException {
		PrintStream console = System.out;
		BufferedInputStream in = new BufferedInputStream(new FileInputStream(
				"src\\io\\Redirecting.java"));
		PrintStream out = new PrintStream(new BufferedOutputStream(
				new FileOutputStream("test2.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);

	}
}

 

 

0
1
分享到:
评论

相关推荐

    java编程思想读书笔记

    ### Java编程思想读书笔记 #### 一、Java与C++的区别及内存管理 在学习Java的过程中,我们常常会拿它与C++进行比较。这两门语言虽然有着相似之处,但也有许多不同点。 1. **内存管理:** - C++提供了更为底层的...

    java编程思想笔记

    《Java编程思想笔记》是基于 Bruce Eckel 的经典著作 "Thinking in Java" 所做的学习总结,这本书深入浅出地介绍了Java语言的核心概念和技术。在本文中,我们将围绕Java编程的一些关键知识点进行深入探讨,包括但不...

    Java编程思想学习笔记

    在讨论Java编程思想学习笔记时,首先需要了解的是Java语言的平台无关性,而这一特性正是通过Java虚拟机(JVM)得以实现的。JVM作为Java程序设计的关键组成部分,对于Java开发人员来说是必须掌握的基础知识。在该学习...

    Java编程思想笔记(全)

    ### Java编程思想笔记知识点概述 #### 第 1 章 对象导论 在这一章节中,主要介绍了Java中的基本概念——对象。对象是面向对象编程的核心,它封装了数据和行为。本章首先解释了对象的概念,接着讨论了如何创建对象...

    java编程思想读书笔记.rar

    《Java编程思想》是 Bruce Eckel 的经典之作,这本书深入浅出地介绍了Java语言的核心概念和技术,对于初学者和有经验的程序员来说都是极好的学习资源。以下是对书中的主要知识点进行的详细解读: 1. **Java语言基础...

    java学习资料/笔记整理(一)

    本文将深入探讨“java学习资料/笔记整理(一)”中涉及的重要知识点,包括Java编程思想、类型协变、查询手册以及数据结构与算法。 首先,Java编程思想是理解Java核心概念的关键。这通常涉及到面向对象编程(OOP)...

    达内Java_笔记整理.rar_Java 达内笔记_Java笔记_java 笔记_笔记_达内

    面向对象编程思想是Java的灵魂,它使得代码更易于理解和维护。 接着,文件I/O、异常处理和集合框架也是Java的重要部分。这部分笔记可能涉及File类、IOException、try-catch-finally语句以及ArrayList、LinkedList、...

    非常好的java笔记适合初学者

    此外,文件输入/输出(I/O)操作也是Java编程中不可或缺的一部分。笔记会教授如何使用InputStream和OutputStream类进行基本的文件读写,以及高级的FileReader/Writer、BufferedReader/Writer等类,以提高效率和灵活性...

    JAVA学习笔记

    总的来说,这个JAVA学习笔记集是一个全面的学习资源,可以帮助初学者逐步建立起扎实的JAVA基础,理解并掌握编程思想、多线程、网络编程以及高效I/O操作等核心技能。通过深入学习和实践这些内容,读者将能够更好地...

    王者归来之Thinking in java读书笔记

    《王者归来之经典-Java编程思想读书笔记》会介绍如何有效地使用异常处理机制,防止程序因未预期的错误而崩溃。 函数和方法是代码复用的关键。Java支持方法重载和重写,这使得代码更加灵活且易于维护。书中会详细...

    java学习笔记(全)

    Java学习笔记全集是针对Java编程语言的一份详尽的学习资料,它涵盖了从基础到进阶的各个层面,旨在帮助初学者系统地学习Java,并为有一定经验的开发者提供复习和巩固知识的平台。这份笔记主要关注Java语言的核心概念...

    Java JDK 6学习笔记——ppt简体版

    Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...

    java学习笔记JDK6.0课件和代码

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。JDK(Java Development Kit)是Java...随着Java技术的不断发展,虽然JDK 6.0已经过时,但它仍然是初学者理解和掌握Java编程思想的宝贵资源。

    JAVA笔记(根据马士兵的java视频整理).pdf

    这些知识点构成了JAVA编程的基石,也是学习者必须首先攻克的难关。 在马士兵的JAVA视频教程中,他不仅详细讲解了JAVA的基础知识,比如变量、循环、分支结构、数组、常用类等,还对I/O Stream、Collection/Generic、...

    B站java狂神说笔记

    这份笔记的PDF版本详细讲解了Java的基础概念、进阶特性和实战应用,旨在帮助读者全面理解和掌握Java编程。 一、Java基础 Java基础部分包括了Java环境的搭建、基本语法、数据类型、控制结构(如if语句、switch语句、...

    全套达内学习笔记(java)

    【CoreJava.zip】:核心Java是Java编程的基础,可能包括了Java SE(标准版)中的核心概念和技术,如IO流、NIO(非阻塞I/O)、多线程、并发编程、集合框架的深入探讨、泛型、枚举、Lambda表达式、Stream API等。...

    java黑马笔记.rar

    Java编程语言是当今软件开发领域中的重要工具,尤其在...这些知识点构成了Java编程的基础,也是"java黑马笔记"可能涵盖的内容。学习Java,不仅要理解语法,更要掌握其核心思想和最佳实践,以便在实际项目中灵活运用。

    java私塾学习笔记整理

    ### Java私塾学习笔记整理 #### 第一章:Java入门 ...以上内容涵盖了Java基础知识的重要方面,从语言基础到高级特性,以及常见的开发技术和工具,帮助读者全面了解Java编程的基础知识和技术要点。

    良葛格java学习笔记

    【良葛格java学习笔记】是一份专为新手设计的Java编程学习资料,旨在帮助初学者从零开始了解和掌握Java这门...通过系统学习这份笔记,新手可以逐步熟悉Java编程环境,理解面向对象编程思想,并具备解决实际问题的能力。

Global site tag (gtag.js) - Google Analytics