`

Java IO中---字节流与字符流

    博客分类:
  • Java
阅读更多

 

前面我主要是对IO进行了一个整体上的认识和对File类的相关操作进行了简单的说明。下面主要再来说说Java IO中的字节流和字符流;

在整个IO包中,流的操作包括了两种-----字符流和字节流;

字节流:

字节输入流(InputStream):

public abstract class InputStream extends Object implements Closeable

字节输出流(OutputStream):

public abstract class OutputStream extends Object implements Closeable, Flushable    

      

字符流:(一个字符为两个字节)

字符输入流(Reader):

public abstract class Reader extends Object implements Readable, Closeable

字符输出流(Writer):

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

 

Java中使用IO操作的步骤:

使用File找到一个文件;

使用字符流或字节流的子类为OutputStreamInputStreamWriterReader进行实例化操作;

进行读或写操作;

关闭(Close()),在流的操作中必须进行关闭,但BufferedReader例外,我试过;

 

范例:OutputStream 通过输出流写入内容

 

package com.iflytek.io02;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

/**
 * @author xudongwang 2012-1-8
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class OutputStreamDemo01 {

	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt");// 要操作的文件
		OutputStream out = null;// 声明字节输出流
		// out = new FileOutputStream(file);// 通过子类实例化
		out = new FileOutputStream(file, true);// 表示可以追加j
		String str = "王旭东\r\n";// 要输出的信息
		byte b[] = str.getBytes();// 将String变为byte数组
		out.write(b);// 写入数据
		// for (int i = 0; i < b.length; i++) {
		// out.write(b[i]);
		// }// 通过循环一个个写入
		out.close();
	}
} 

 

范例:InputStream 通过输入流来读取内容

package com.iflytek.io02;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * @author xudongwang 2012-1-8
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class InputStreamDemo01 {

	public static void main(String args[]) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt");// 要操作的文件
		InputStream input = null;// 声明字节输入流
		input = new FileInputStream(file);// 通过子类进行实例化操作
		byte b[] = new byte[1024];// 开辟空间存储读取的内容
		int len = input.read(b);// 将内容读取到byte数组中
		System.out.println(new String(b, 0, len));// 输出内容
		input.close();
	}
} 

  但是读取是一种常见的读取方式,但是上面的代码读取受到开辟空间的限制,所以如果现在想动态的开辟数组空间,则可以根据文件的大小来决定,采用read()方法一个个的读取数据;

 

范例:read()

package com.iflytek.io02;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * @author xudongwang 2012-1-8
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class InputStreamDemo02 {
	public static void main(String args[]) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt");
		InputStream input = new FileInputStream(file);
		byte b[] = new byte[(int) file.length()];// 开辟空间接收读取的内容
		for (int i = 0; i < b.length; i++) {
			b[i] = (byte) input.read();// 一个个的读取数据
		}
		System.out.println(new String(b));// 输入内容,直接转换
		input.close();// 关闭
	}
}

 

范例:Writer

package com.iflytek.io02;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class WriterDemo {
	public static void main(String args[]) throws IOException {
		File file = new File("d:" + File.separator + "demo.txt");
		Writer out = null;// 声明字符输出流
//		out = new FileWriter(file);// 通过子类实例化
		out = new FileWriter(file,true);//表示可以追加
		String str = "王旭东\r\n";// 要输出的信息
		out.write(str);// 写入数据
		out.close();
	}
}

 

 范例:Reader

package com.iflytek.io02;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/**
 * @author xudongwang 2012-1-8
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class ReaderDemo {
	public static void main(String args[]) throws IOException {
		File file = new File("d:" + File.separator + "demo.txt");
		Reader input = null;
		input = new FileReader(file);
		char c[] = new char[1024];
		int len = input.read(c);
		System.out.println(new String(c, 0, len));
		input.close();
	}
}

 

 或者通过一个个读取:

package com.iflytek.io02;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class ReaderDemo02 {
	public static void main(String args[]) throws IOException {
		File file = new File("d:" + File.separator + "demo.txt");
		Reader input = null;
		input = new FileReader(file);
		char c[] = new char[(int) file.length()];
		for (int i = 0; i < c.length; i++) {
			c[i] = (char) input.read();// 一个个读取
		}
		System.out.println(new String(c));
		input.close();
	}
}

 下面我们来通过一组实例来观察字节流与字符流的区别:此程序就是向文件中保存内容

 

范例:字节流OutputStream实现:

package com.iflytek.io02;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class OutputStreamDemo {
	public static void main(String args[]) throws IOException {
		File file = new File("d:" + File.separator + "demo.txt");
		OutputStream out = new FileOutputStream(file);
		String str = "java";
		byte b[] = str.getBytes();
		out.write(b);
	}
}

 注意:以上的操作并没有进行关闭操作,发现内容却可以正常的输出;

 

范例:字符流Writer实现

package com.iflytek.io02;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class WriterDemo02 {
	public static void main(String args[]) throws IOException{
		File file = new File("d:" + File.separator + "demo.txt");
		Writer out = new FileWriter(file);
		String str = "java";
		out.write(str);
	}
}

 此时,字符流中也没有进行流的关闭操作,但与字节流不同的是,字符流并没有将内容成功的写入进去。如果此时在字符流操作的最后加入out.flush()操作,则可以成功的写入;

此时来看可以知道因为早期只有字节流,换而言之,也就是说早期是没有刷新操作的,但是因为使用了关闭,所以表示会强制刷新,注意的是其中刷新的是缓冲区(内存),但是这里我认为任何流只要初始化了最后都将其关闭了,这是一种习惯,注此处除了BufferedReader

此时可以得到这样的一个结论:

字节流在操作的时候是直接与文件本身进行关联的,不使用缓冲区

              · 字节文件  字节流直接实现底层的IO操作;

       字符流在操作的时候是通过缓冲区与文件进行操作的,使用缓冲区

              · 字符缓冲文件

       综上比较来说,在传输或者在硬盘上保存的内容都是以字节的形式存在,所以字节流操作较多,但是在操作文件的时候字符流比较好使

 

内存操作流

其主要是保存临时文件,通过内存操作流输入输出的目标是内存。使用ByteArrayInputStream(从程序向内存写入)和ByteArrayOutputStream(从内存向程序输出)完成内存的操作流。在内存操作流中所有的输入和输出都是以内存为操作源头的;

范例:通过内存流完成字符串小写变为大写的操作;

package com.iflytek.io02;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class ByteArrayInputStreamDemo {
	public static void main(String args[]) {
		String str = "hello world!";
		ByteArrayInputStream bis = null;// 内存输入流,从程序向内存写入
		ByteArrayOutputStream bos = null;// 内存输出流
		bis = new ByteArrayInputStream(str.getBytes());// 将内存保存在内存中
		bos = new ByteArrayOutputStream();
		int temp = 0;
		while ((temp = bis.read()) != -1) {// 依次读取
			char c = (char) temp;
			bos.write(Character.toUpperCase(c));// 输出
		}
		String newStr = bos.toString();// 取出内存输出的内容
		System.out.println(newStr);
	}
}

 注意,虽然内存流在J2EE阶段没什么感觉,但是在Java WEB中的Ajax技术中会结合XML解析和JavaScriptAjax完成一些动态效果;

 

管道流:

管道流就是进行两个线程间通讯,使用PipedInputStreamPipedOutputStream两个类完成,这两个类在使用上基本上跟InputStreamOutputStream类似,唯一的区别在于连接管道的操作上public void connect(PipedOutputStream src) throws IOException,此处就暂时不举例了;

 

打印流:

PrintStreamPrintWriter

public class PrintStream extends FilterOutputStream implements Appendable, Closeable

从上面可知,PrintStreamOutputStream的子类,而实际上,PrintStream类属于装饰,也就是说根据实例化PrintStream类对象的不同,输出的位置也不同;

范例:使用PrintStream向文件输出

package com.iflytek.io02;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class PrintStreamDemo {
	public static void main(String args[]) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt");
		PrintStream ps = new PrintStream(new FileOutputStream(file));
		ps.print("hello");
		ps.print("world");
		ps.print(10);
		ps.print(10.0);
		ps.close();
	}
}

 此处,发现使用打印流输出比较方便,所以建议以后都使用打印流完成输出;

JDK1.5之后打印流可以使用格式化输出

public PrintStream format(String format,Object... args)

package com.iflytek.io02;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class PrintStreamFormatDemo {
	public static void main(String args[]) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt");
		PrintStream out = new PrintStream(new FileOutputStream(file));	
		String name = "王旭东";
		int age = 21;
		float score = 99.0f;
		char sex = 'N';
		out.printf("姓名:%s;年龄:%d;成绩:%5.2f;性别:%c。",name,age,score,sex);
		out.close();
	}
}

 这里需要注意,在打印流中始终记住一下原则:

       · 根据实例化其子类的不同,完成的打印输出功能也不同

 

SystemIO的支持:

System.in:它是PrintStream的实例,常用的方法就是向屏幕上打印信息,当然如果使用System.out的话也可为OutputStream实例化

System.err:表示错误的输出

package com.iflytek.io02;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class SystemerrDemo {
	public static void main(String args[]) {
		try {
			Integer.parseInt("hello");
		} catch (Exception e) {
			System.out.println(e);//e打印出来是黑字
			System.err.println(e);//e打印出来是红字
		}
	}
}

 其区别只能从概念上讲:

       System.out:一般的信息是愿意展示给用户看见的;

       System.err:一般的信息是不愿意展示给用户看见的;

       System.in:表示键盘的输入;

 

package com.iflytek.io02;

import java.io.InputStream;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class SystemInDemo {
	public static void main(String args[]) throws Exception {
		InputStream input = System.in;
		System.out.println("请输入内容:");
		int temp = 0;
		StringBuilder bud = new StringBuilder();
		while ((temp = input.read()) != -1) {
			char c = (char) temp;
			if (c == '\n') {
				break;
			}
			bud.append(c);
		}
		System.out.println("输入的内容是:" + bud);
	}
}

 虽然此时读取时没有长度但此处注意的是每次读取的是字节,所以在输入中文时会出现错误,只能通过后面的BufferedReader来实现;

 

重定向问题:

· System.outSystem.err都有固定的输出目标,都是屏幕。而System.in有固定的输入目标,都是键盘;但是在System类中提供了一系列的输入输出重定向,可以改变System.outSystem.erSystem.in的输入输出位置。

       · System. out重定向:public static void setOut(PrintStream out)

       · System.err重定向:public static void setErr(PrintStream err)

       · System.in重定向:public static void setIn(InputStream in)

 

BufferedReader

实际上表示缓冲区读取,可以一次性的将内容全部读取出来

其构造方法:public BufferedReader(Reader in)

       注意:在Java中提供了两个专门的类,去实现字节流与字符流的转换:

              · InputStreamReader:将字节的输入流变为字符输入流;

文件字节流(输入流)字符流(输入流)控制台   

              · OutputStreamWriter:将字符的输出流变为字节的输出流;

程序字符流(输出流)字节流(输出流)文件      

通过public String readLine()throws IOException来读取数据,表示一次性读取一行数据,而且这里需要注意的是如果返回的内容是String是最好的操作;

 

1
2
分享到:
评论

相关推荐

    Java IO 字节流 字符流

    Java IO系统分为两大类:字节流和字符流。字节流主要用于处理任何类型的原始数据,如图片、音频文件或者二进制文件,而字符流则专注于处理基于文本的数据。本文将深入探讨这两类流的原理、用途以及它们之间的关联。 ...

    Java IO commons-io-2.5.jar

    Java IO 包含了许多类,如InputStream、OutputStream、Reader、Writer等,它们分别用于处理字节流和字符流。字节流适用于二进制数据,而字符流适用于文本数据。Java IO 还包括Filter流,可以用来装饰其他流,添加...

    Java IO字符流和字节流

    ### Java IO字符流和字节流详解 #### 一、引言 在Java编程中,输入输出(简称IO)操作是十分重要的一个方面。通过IO操作,我们可以读取文件、网络数据、用户输入等,也可以将数据写入到文件、网络、控制台等。Java...

    Java IO 体系.md

    - 字节流与字符流的转换 - 新潮的 NIO - 缓冲区(Buffer) - 通道(Channel) - 示例:文件拷贝案例 - BIO 和 NIO 拷贝文件的区别 - 操作系统的零拷贝 - 选择器(Selectors) - 选择键(SelectionKey) - ...

    JAVA IO流缓冲字节流缓冲字符流等流经典代码示例加注释总结.rar

    2、常用21个IO流:FileWriter、FileReader、...3、JAVA IO流经典代码示例,示例从易到难。代码功能涉及字节、字符、字符串、文本文件、图片、音频、视频。演示错误用法和经典用法。 4、代码的结构可查看README文件。

    Java-Io流,练习

    1. 字节流:Java的`java.io`包中提供了处理字节流的类,如`InputStream`和`OutputStream`作为所有字节输入流和输出流的基类。它们的子类如`FileInputStream`和`FileOutputStream`分别用于文件的读写。 2. 字符流:...

    Java基础11-(字节流、字符流)

    Java的IO流是按照数据的流向分为输入流和输出流,按照数据类型分为字节流和字符流。字节流处理的是二进制数据,适用于任何类型的文件,包括文本文件和非文本文件(如图片、音频、视频等)。字符流则用于处理字符数据...

    JavaIO实例_字节流_字符流_缓冲流_转换流IODemo

    在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...

    java io流-3.pdf

    - **1.3 字符数据处理**:通过字符流处理文本数据,支持Unicode等多种字符集。 - **1.4 Reader和Writer类**:Reader和Writer是处理字符数据的主要接口,它们负责读取和写入字符数据。 - **1.5 IOException**:在进行...

    java-io流-文件流

    Java IO流-文件流 Java IO流是Java语言中用于输入/输出操作的基本组件,它提供了多种方式来读取和写入数据,包括文件、网络、内存等。IO流体系可以分为两大类:字节流和字符流。 字节流 字节流是最基本的IO流,...

    Java字符流和字节流

    在Java中,所有字节流类都是`java.io.InputStream`或`java.io.OutputStream`的子类。这两个类提供了基本的读写操作方法,例如`read()`和`write()`。 **1. 文件输出流(FileOutputStream)** - `FileOutputStream`类...

    io流详解,字符流和字节流代码

    本文件包“io流详解,字符流和字节流代码”显然是针对Java IO流的深入学习资源,包含了代码示例和可能的可视化解释。 IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流处理的是8位的数据...

    Java学习IO流小结--字符流

    IO流是Java语言中处理输入/输出的重要工具,它包括字节流和字符流两大类。本文将重点讨论字符流的相关概念及其用法。 #### 字符流简介 字符流主要用来处理文本数据,它是以字符为单位进行读写的流。字符流分为字符...

    commons-io-1.4.jar.zip_io流jar

    Java IO流体系结构分为四类:字节流(Byte Stream)、字符流(Character Stream)、对象流(Object Stream)和套接字流(Socket Stream)。字节流处理单个8位的字节,而字符流基于Unicode编码,处理16位的字符。对象...

    JavaIO实例|字节流|字符流|缓冲流|转换流IODemo

    本教程将详细介绍Java IO中的字节流、字符流、缓冲流以及转换流,并通过IODemo实例来展示它们的用法。 ### 1. 字节流 字节流是Java中最基础的流类型,用于处理以字节为单位的数据。字节流分为输入流(InputStream...

    586.584.JAVA基础教程_IO流-IO流的体系结构(586).rar

    在Java IO流体系结构中,还有一类特殊的流,叫做转换流(InputStreamReader/OutputStreamWriter),它们位于字节流和字符流之间,负责将字节流转换为字符流,或者反之。 3. 链接流(PipedStream):允许线程间的...

    IO流 javaio java 流

    Java IO流分为两大类:字符流(Character Stream)和字节流(Byte Stream)。字符流处理单个字符,而字节流处理8位的字节序列。它们又可以进一步细分为输入流(InputStream/Reader)和输出流(OutputStream/Writer)...

    JavaIODemo-master.zip

    有两类基本的流:字节流(处理字节数据)和字符流(处理字符数据)。字节流包括InputStream和OutputStream(用于输入和输出)以及Reader和Writer(处理字符编码)。例如,FileInputStream和FileOutputStream用于文件...

    2024IO流-字符流-HM

    在Java中,除了字节流之外,还有一类流称为字符流。字符流主要用于处理文本数据,它能够避免字节流读取中文等多字节字符时可能出现的乱码问题。字符流是按照字符为单位进行读写的,每个字符通常占用两个字节。Java...

    IO流学习(字节流 字符流 文本流)!

    总的来说,IO流是Java编程中不可或缺的一部分,理解和熟练运用字节流、字符流和文本流能帮助我们高效地处理数据输入和输出,为各种复杂的应用场景提供支持。在实际开发中,要根据数据类型和需求选择合适的流,并利用...

Global site tag (gtag.js) - Google Analytics