`

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):允许线程间的...

    一文读懂Java IO流 1. IO流基础概念 1.1 什么是IO流 1.2 IO流的分类 1.2.1 按数据传输单位分类 1.2.2 按功能角色分类 1.3 Java IO流体系结构 1.4 流的基

    一文读懂Java IO流 1. IO流基础概念 1.1 什么是IO流 1.2 IO流的分类 1.2.1 按数据传输单位分类 1.2.2 按功能角色分类 1.3 Java IO流体系结构 1.4 流的基本操作 2. 字节流 2.1 InputStream - 输入字节流 2.2 ...

    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...

Global site tag (gtag.js) - Google Analytics