JAVA输入输出流--字节流篇(什么时候用哪个)

JAVA输入输出流--字节流篇(什么时候用哪个)
JAVA输入输出流--字节流篇(什么时候用哪个)

1流的概念

stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样,如下图:

在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型:

(1)字节流

表示以字节为单位从stream中读取或往stream中写入信息,即io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,如图象和声音。

(2)字符流

以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。

区别:

Reader和Writer要解决的,最主要的问题就是国际化。原先的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。Unicode是国际化的字符集(更何况Java内置的char就是16位的Unicode 字符),这样加了Reader和Writer之后,所有的I/O就都支持Unicode了。此外新类库的性能也比旧的好。

但是,Read和Write并不是取代InputStream和OutputStream,有时,你还必须同时使用"基于byte的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。实际上是通过byte[]和String来关联。在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。

以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,只是在操作时的导向不同。

如 CharArrayReader和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。

字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串;而字节流处理单元为1个字节,操作字节和字节数组,可用于任何类型的对象,包括二进制对象,但是不能直接处理Unicode字符。字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好。如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。

2流的层次结构

java将读取数据对象称为输入流,能向其写入的对象叫输出流。

1)基于字节的输入流

●FileInputStream:把一个文件作为InputStream,从本地文件系统中

读取数据字节,实现对文件的读取操作

●ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使

用,从内存数组中读取数据字节

●ObjectInputStream:对象输入流。从文件中把对象读出来重新建立。

对象必须要实现Serializable接口。对象中的transient和static类型

的成员变量不会被读取和写入。

●PipedInputStream:实现了pipe的概念,从线程管道中读取数据字节,

主要在线程中使用。管道输入流是指一个通讯管道的接收端。一个线程

通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这

样可实现两个线程间的通讯

●SequenceInputStream:把多个InputStream合并为一个

InputStream,当到达流的末尾时从一个流转到另一个流,“序列输入

流”类允许应用程序把几个输入流连续地合并起来,并且使它们像单个输

入流一样出现。

●StringBufferInputStream:把一个String对象作为InputStream,

从字符串中读取数据字节

●FilterInputStream:过滤器流java.io.FilterInputStream,过滤器流

即能把基本流包裹起来,提供更多方便的用法。类的构造方法为

FilterInputStream(InputStream),在指定的输入流之上,创建一个

输入流过滤器。常用的子类如下:

◆BufferedInputStream:缓冲区对数据的访问,以提高效率

◆DataInputStream:从输入流中读取基本数据类型,如int、float、

double或者甚至一行文本

◆LineNumberInputStream:在翻译行结束符的基础上,维护一个

计数器,该计数器表明正在读取的是哪一行。

◆PushbackInputStream:允许把数据字节向后推到流的首部

●System.in

从用户控制台读取数据字节

在System类中, in是InputStream类的静态对象,因此,out和err 可以引用PrintStream类的成员方法。如:System.in.read()。

2)基于字节的输出流

●FileOutputStream:把信息存入文件中

●ByteArrayOutputStream:把信息存入内存中的一个缓冲区中,该类实

现一个以字节数组形式写入数据的输出流

●PipedOutputStream:实现了pipe的概念,主要在线程中使用。管道

输出流是指一个通讯管道的发送端。一个线程通过管道输出流发送数

据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的

通讯。

●SequenceOutputStream:把多个OutStream合并为一个

OutStream

●FilterOutputStream:类似于FilterInputStream,OutputStream也

提供了过滤器输出流。

●ObjectOutputStream:对象输出流。对象必须要实现Serializable接

口。对象中的transient和static类型的成员变量不会被读取和写入。

●System.out

输出数据字节到用户控制台

在System类中,out和err是PrintStream类的静态对象,因此,out 和err可以引用PrintStream类的成员方法。如:System.out.write (int

a)。

3)基于字符的输入流

●CharArrayReader:与ByteArrayInputStream对应,从字符数组中

读取数据

●StringReader:与StringBufferInputStream对应,从字符数组中读

取数据

●FileReader:与FileInputStream对应,从本地文件系统中读取字符序

●PipedReader:与PipedInputStream对应,从线程管道中读取字符序

●InputStreamReader:InputStreamReader是从输入流中读取数据,

连接输入流于读取器。如: new InputStreamReader(System.in)

●BufferedReader:缓冲数据的访问,以提高效率

◆LineNumberReader(BufferedReader的子类):维护一个计数

器,该计数器表明正在读取的是哪一行。

●FilterReader(抽象类):提供一个类创建过滤器时可以扩展这个类

◆PushbackReader(FilterReader的子类):允许把文本数据推回

到读取器的流中。

这些过滤器读取器都可以传入一个Reader作为构造方法的参数。

4)基于字符的输出流

●CharArrayWrite:与ByteArrayOutputStream对应

●StringWrite:无与之对应的以字节为导向的stream

●FileWrite:与FileOutputStream对应

PipedWrite:与PipedOutputStream对应

3InputStream类

Inputstream类和Outputstream类都为抽象类,不能创建对象,可以通过子类来实例化。

InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法。Reader也有完全相同的3个read接口。Inputstream类中的常用方法:

1)public abstract int read( ):读取一个byte的数据,返回读到的数据

(高位补0的int类型值),如果返回-1,表示读到了输入流的末尾。

2)public int read(byte b[ ]):读取b.length个字节的数据放到b数

组中。返回值是读取的字节数, 如果返回-1,表示读到了输入流的末尾。

该方法实际上是调用下一个方法实现的。

3)public int read(byte b[ ], int off, int len):从输入流中最多读取

len个字节的数据,存放到数组b中,返回实际读取的字节数。如果返

回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始

偏移位置。

4)public int available( ):返回输入流中可以读取的字节数。注意:若输

入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的

话,它只会返回0,这个方法必须由继承InputStream类的子类对象调

用才有用。

5)public long skip(long n):忽略输入流中的n个字节,返回值是实际

忽略的字节数, 跳过一些字节来读取。

6)public int close( ) :我们在使用完后,必须对我们打开的流进行关闭。

7)void mark(int readlimit) :在输入流的当前位置放置一个标记,如果

读取的字节数多于readlimit设置的值,则流忽略这个标记。在

IutputStream类中实际是一个空实现。

8)void reset() :返回到上一个标记。

9)boolean markSupported() :测试当前流是否支持mark和reset方

法。如果支持,返回true,否则返回false。在IutputStream类中实

际是一个空实现。

4OutputSteam类

OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的,Writer同样提供了相同的三个write方法。

1)public abstract void write(int b) :先将int转换为byte类型,把

低字节写入到输出流中。

2)public void write(byte b[ ]):将参数b中的字节写到输出流。

3)public void write(byte b[ ], int off, int len) :将参数b的从偏

移量off开始的len个字节写到输出流。

4)public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。

只对使用了缓冲的流类起作用。在OutputStream类中实际是一个空实

现。

5)public void close( ) : 关闭输出流并释放与流相关的系统资源。

注意:

1)上述各方法都有可能引起异常。

2)InputStream和OutputStream都是抽象类,不能创建这种类型的对

象。

5FileInputStream和FileOutputStream 5.1FileInputStream

FileInputStream类是InputStream类的子类,用来处理以文件作为数据输入源的数据流。使用方法:

方式1:

File fin=new File("d:/abc.txt");

FileInputStream in=new FileInputStream(fin);

方式2:

FileInputStream in=new FileInputStream("d: /abc.txt");

方式3:

构造函数将 FileDescriptor()对象作为其参数。

FileDescriptor() fd=new FileDescriptor();

FileInputStream f2=new FileInputStream(fd);

从指定文件中读出数据:

view plaincopy to clipboardprint?

1.import java.io.*;

https://www.360docs.net/doc/1d5620346.html,ss StreamTest{

3.public static void main(String[] args)throws Exception{

4. FileInputStream fis=new FileInputStream("testoutput.txt");

5.byte[] buf=new byte [100];

6.int len=fis.read(buf);

7. System.out.println(new String(buf,0,len));//由于buf是大小为100的缓冲

区,为了输出有效字符使用String类的构造方法

String(byte[] bytes, int offset, int length)实现输出

8. fis.close();

9. }

10.}

5.2FileOutputStream

FileOutputStream类用来处理以文件作为数据输出目的数据流;一个表示文件名的字符串,也可以是File或FileDescriptor对象。

创建一个文件流对象有两种方法:

方式1:

File f=new File("d:/abc.txt");

FileOutputStream out=new FileOutputStream (f);

方式2:

FileOutputStream out=new

FileOutputStream("d:/abc.txt");

方式3:

构造函数将 FileDescriptor()对象作为其参数。

FileDescriptor() fd=new FileDescriptor();

FileOutputStream f2=new FileOutputStream(fd);

方式4:

构造函数将文件名作为其第一参数,将布尔值作为第二参数。

FileOutputStream f=new FileOutputStream("d:/abc.txt",true);

注意:

1)文件中写数据时,若文件已经存在,则覆盖存在的文件;

2)文件的读/写操作结束时,应调用close方法关闭流。

向指定文件写入数据:

view plaincopy to clipboardprint?

1.import java.io.*;

2.class StreamTest{

3.public static void main(String[] args)throws Exception{

4. FileOutputStream fos=new FileOutputStream("testoutput.txt");

5. fos.write("Hello World".getBytes ());

6. fos.close();

7. }

8.}

程序中使用到FileOutputStream类的方法void write(byte[] b) ,所以从写入字符串" Hello World "通过String类的方法getBytes()得到字节数组b,成功进行写入。

6ObjectOutputStream和ObjectInputStream

ObjectOutputStream和ObjectInputStream可以利用对象流对对象进行序列化。

在一个程序运行的时候,其中的变量数据是保存在内存中的,一旦程序结束这些数据将不会被保存,一种解决的办法是将数据写入文件,而Java中提供了一种机制,它可以将程序中的对象写入文件,之后再从文件中把对象读出来重新建立。这就是所谓的对象序列化Java中引入它主要是为了RMI(Remote Method Invocation)和Java Bean所用,不过在平时应用中,它也是很有用的一种技术。

所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子:

view plaincopy to clipboardprint?

1.import java.io.*;

2.import java.util.*;

3.public class Logon implements Serializable {

4.private Date date = new Date();

5.private String username;

6.private transient String password;

7.Logon(String name, String pwd){

8. username = name;

9. password = pwd;

10. }

11.public String toString(){

12. String pwd = (password == null) ? "(n/a)":password;

13.return"logon info: \n " + "username: " + username + "\n date:

" + date + "\n password: " + pwd;

14. }

15.public static void main(String[] args)throws IOException, ClassNotFou

ndException {

16. Logon a = new Logon("Morgan", "morgan83");

17. System.out.println("logon a = " + a);

18. ObjectOutputStream o = new ObjectOutputStream( new FileOutputS

tream("Logon.out"));

19. o.writeObject(a);

20. o.close();

21.int seconds = 5;

22.long t = System.currentTimeMillis() + seconds * 1000;

23.while(System.currentTimeMillis()

24. ObjectInputStream in = new ObjectInputStream(new FileInputStre

am("Logon.out"));

25. System.out.println("Recovering object at " + new Date());

26. a = (Logon)in.readObject();

27. System.out.println("logon a = " + a);

28. }

29.}

类Logon是一个记录登录信息的类,包括用户名和密码。首先它实现了接口Serializable,这就标志着它可以被序列化。之后再main方法里ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("Logon.out"));新建一个对象输出流包装一个文件流,表示对象序列化的目的地是文件Logon.out。然后用方法writeObject开始写入。想要还原的时候也很简单ObjectInputStream in = new ObjectInputStream(new FileInputStream("Logon.out"));新建一个对象输入流以文件流Logon.out为参数,之后调用readObject方法就可以了。

需要说明一点,对象序列化有一个神奇之处就是,它建立了一张对象网,将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件,更为奇妙的是,如果你一次序列化了好几个对象,它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝。

关键字transient在这里表示当前内容将不被序列化,比如例子中的密码,需要保密,所以没有被写入文件。

7PipedInputStream和PipedOutputStream

PipedInputStream和PipedOutputStream分别从InputStream类和OutputStream类继承,因此它们并不是过滤流类。

管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的 PipedOutputStream对象读取。要使管道流有用,必须同时构造管道输入流和管道输出流。

利用线程生产者和消费者问题:

view plaincopy to clipboardprint?

1.import java.io.*;

2.class PipedStreamTest{

3.public static void main(String[] args){

4. PipedOutputStream pos=new PipedOutputStream();

5. PipedInputStream pis=new PipedInputStream();

6.try{

7. pos.connect(pis);

8.new Producer(pos).start();

9.new Consumer(pis).start();

10. }catch(Exception e){

11. e.printStackTrace();

12. }

13. }

14.}

15.

16.class Producer extends Thread{

17.private PipedOutputStream pos;

18. Producer(PipedOutputStream pos){

19.this.pos=pos;

20. }

21.public void run(){

22.try{

23. pos.write("Hello,My friends!".getBytes());

24. pos.close();

25. }catch(Exception e){

26. e.printStackTrace();

27. }

28. }

29.}

30.class Consumer extends Thread{

31.private PipedInputStream pis;

32. Consumer(PipedInputStream pis){

33.this.pis=pis;

34. }

35.public void run(){

36.try{

37.byte[] buf=new byte[100];

38.int len=pis.read(buf);

39. System.out.println(new String(buf,0,len));

40. pis.close();

41. }catch(Exception e){

42. e.printStackTrace();

43. }

44. }

45.}

8FilterInputStream和FilterOutputStream

java的流类提供了结构化方法,如,底层流和高层过滤流。

而高层流不是从输入设备读取,而是从其他流读取。同样高层输出流也不是写入输出设备,而是写入其他流。

使用“分层对象(layered objects)”,为单个对象动态地,透明地添加功能的做法,被称为Decorator Pattern。Decorator模式要求所有包覆在原始对象之外的对象,都必须具有与之完全相同的接口。这使得decorator的用法变得非常的透明--无论对象是否被decorate过,传给它的消息总是相同的。这也是Java I/O类库要有“filter(过滤器)”类的原因:抽象的“filter”类是所有decorator的基类。Decorator模式常用于如下的情形:如果用继承来解决各种需求的话,类的数量会多到不切实际的地步。Java的I/O类库需要提供很多功能的组合,于是decorator模式就有了用武之地。

为InputStream和OutputStream定义decorator类接口的类,分别是FilterInputStream和FilterOutputStream。

通过FilterInputStream和FilterOutStream的子类,我们可以为stream 添加属性。下面以一个例子来说明这种功能的作用。

如果我们要往一个文件中写入数据,我们可以这样操作:

FileOutStream fs = new FileOutStream(“test.txt”);

然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如果我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和 FilterOutStream的子类,为FileOutStream 添加我们所需要的功能。

8.1FilterInputStream

8.2FilterOutputStream

8.3DataInputStream和

DataOutputStream

DataInputStream类对象可以读取各种类型的数据。

DataOutputStream类对象可以写各种类型的数据;

创建这两类对象时,必须使新建立的对象指向构造函数中的参数对象。例如:FileInputStream in=new FileInputStream("d:/test.txt");

DataInputStream din=new DataInputStream(in);

向指定文件中写入数据:

view plaincopy to clipboardprint?

1.import java.io.*;

2.class StreamTest{

3.public static void main(String[] args)throws Exception{

4. FileOutputStream fos=new FileOutputStream("d:/test.txt");

5. BufferedOutputStream bos=new BufferedOutputStream(fos);

6. DataOutputStream dos=new DataOutputStream(bos);

7.byte b=3;

8.int i=100;

9.boolean bool=false;

10.char c='k';

11.float f=45.77f;

12. dos.writeByte(b);

13. dos.writeInt(i);

14. dos.writeBoolean(bool);

15. dos.writeChar(c);

16. dos.writeFloat(f);

17. dos.close();

18. }

19.}

从指定文件中读出数据:

view plaincopy to clipboardprint?

1.import java.io.*;

2.class StreamTest{

3.public static void main(String[] args)throws Exception{

4. FileInputStream fis=new FileInputStream("d:/test.txt");

5. BufferedInputStream bis=new BufferedInputStream(fis);

6. DataInputStream dis=new DataInputStream(bis);

7. System.out.println(dis.readByte());

8. System.out.println(dis.readInt());

9. System.out.println(dis.readBoolean());

10. System.out.println(dis.readChar());

11. System.out.println(dis.readFloat());

12. dis.close();

13. }

14.}

8.4BufferInputStream和

BufferOutputStream

允许程序在不降低系统性能的情况下一次一个字节的从流中读取数据。

BufferInputstream定义了两种构造函数

(1)BufferInputStream b= new BufferInputstream(in);

(2)BufferInputStream b=new BufferInputStream(in,size)

第二个参数表示指定缓冲器的大小。

同样BufferOutputStream也有两种构造函数。一次一个字节的向流中写数据。

向指定文件中写入数据:

view plaincopy to clipboardprint?

1.import java.io.*;

2.class StreamTest{

3.public static void main(String[] args)throws Exception{

4. FileOutputStream fos=new FileOutputStream("testBuffer.txt");

5. BufferedOutputStream bos=new BufferedOutputStream(fos);

6. bos.write("Hello BufferedOutputStream!".getBytes());

7. bos.close();

8. }

9.}

如果不加bos.close();语句,则运行后打开testBuffer.txt文件会查看不到内容,这是因为我们将数据写入了缓冲区,只有结束程序时才写入到指定文件中。bos.close();实现立即写入到指定文件,不同的是这样如果想要继续写入就不用再次打开文件了。

从指定文件中读出数据:

view plaincopy to clipboardprint?

1.import java.io.*;

2.class StreamTest{

3.public static void main(String[] args)throws Exception{

4. FileInputStream fis=new FileInputStream("d:/test.txt");

5. BufferedInputStream bis=new BufferedInputStream(fis);

6.byte[] buf=new byte [100];

7.int len = bis.read(buf);

8. System.out.println(new String(buf,0,len));

9. bis.close();

10. }

11.}

8.5Printstream

用于写入文本或基本类型

两种构造函数方法:

PrintStream ps=new PrintStream(out);

PrintStream ps=new PrintStream(out, autoflush)

第二个参数为布尔值,控制每次输出换行符时java是否刷新输出流。

9Java IO 的一般使用原则

一、按数据来源(去向)分类:

1 、是文件: FileInputStream, FileOutputStream(字节流),FileReader, FileWriter(字符流)

2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream(字节流)

3 、是 Char[]: CharArrayReader, CharArrayWriter(字符流)

4 、是 String: StringBufferInputStream, StringBufferOuputStream (字节流)StringReader, StringWriter(字符流)

5 、网络数据流: InputStream, OutputStream(字节流), Reader, Writer( 字符流 )

二、按是否格式化输出分:

1 、要格式化输出: PrintStream, PrintWriter

三、按是否要缓冲分:

1 、要缓冲: BufferedInputStream, BufferedOutputStream(字节流), BufferedReader, BufferedWriter(字符流)

四、按数据格式分:

1 、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream 及其所有带 Stream 结束的子类

2 、纯文本格式(含纯英文与汉字或其他编码方式):Reader, Writer 及其所有带 Reader, Writer 的子类

五、按输入输出分:

1 、输入: Reader, InputStream 类型的子类

2 、输出: Writer, OutputStream 类型的子类

六、特殊需要:

1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter

2 、对象输入输出: ObjectInputStream, ObjectOutputStream

3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

4 、合并输入: SequenceInputStream

5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):首先,考虑最原始的数据格式是什么:原则四

第二,是输入还是输出:原则五

第三,是否需要转换流:原则六第 1 点

第四,数据来源(去向)是什么:原则一

第五,是否要缓冲:原则三(特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)

第六,是否要格式化输出:原则二

实验9 Java输入输出流

山西大学计算机与信息技术学院 实验报告 姓名学号专业班级 课程名称 Java实验实验日期2013-12-4 成绩指导教师批改日期实验名称实验9 Java的输入输出流 ●实验目的 1. 理解I/O流的概念,掌握其分类 2. 掌握文本文件读写、二进制文件读写 ●实验内容 1. 分别使用FileWriter 和BufferedWriter 往文件中写入1万个随机数,比较用时的多少?(用时采用方法System.currentTimeMillis())求时间差; 使用:FileWriter 程序源代码 package a; import java.io.*; public class Filewriter { public Filewriter(String string){ } public static void main(String[] args)throws IOException { long time =System.currentTimeMillis(); Filewriter filewriter=new Filewriter("text"); int num; for(int i=0;i<=10000;i++){ num=(int)Math.random()*10000; filewriter.write(num+" "); } filewriter.close(); time=System.currentTimeMillis()-time; System.out.println("使用Filewriter所用时间:"+time+"um"); } private void write(String string){ } private void close(){ } }

JAVA输入输出流--字节流篇(什么时候用哪个)

1流的概念 stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样,如下图: 在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型: (1)字节流 表示以字节为单位从stream中读取或往stream中写入信息,即io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,如图象和声音。 (2)字符流 以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。 区别: Reader和Writer要解决的,最主要的问题就是国际化。原先的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。Unicode是国际化的字符集(更何况Java内置的char就是16位的Unicode 字符),这样加了Reader和Writer之后,所有的I/O就都支持Unicode了。此外新类库的性能也比旧的好。 但是,Read和Write并不是取代InputStream和OutputStream,有时,你还必须同时使用"基于byte的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。实际上是通过byte[]和String来关联。在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。 以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,只是在操作时的导向不同。

实验04 Java输入输出流报告

实验四 Java 输入输出流 1.实验目的 (1) 掌握输入输出流的总体结构; (2) 掌握流的概念; (3) 了解各种流(包括文件流、过滤流、对象的序列化、随机访问)的使用。2.实验内容 实验题1 编写一个Java Application程序,打印命令行输入的所有参数。 [基本要求] 编写完整程序。 运行结果: 代码如下: import java.util.Scanner; public class CommandOutPut { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("Please input :"); Scanner in = new Scanner(System.in);

String str = in.nextLine(); System.out.println("The output results :"); System.out.println(str); in.close(); } } 实验题2 通过键盘输入路径,搜索指定路径下的全部内容。 运行结果: 代码如下: package https://www.360docs.net/doc/1d5620346.html,.output; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class Output { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub String fileName = "d:\\xxx.txt"; File file = new File(fileName); byte[] b=new byte[(int)file.length()]; FileInputStream out=new FileInputStream(file);

Java多线程和输入输出流

班级:13科技2班学号:201324131225 姓名:许耿宁 Java多线程和输入输出流 一、实验目的: 1.熟悉利用Thread类建立多线程方法。 2.熟悉利用Thread接口建立多线程方法。 3.熟悉Java的文件读写机制,练习输入输出流的使用。 二、实验内容: 1.阅读下列程序,分析并上机检验其功能。 public class DelayRunnable implements Runnable{ private static int count=0; private int no; private int delay; public DelayRunnable(){ count++; no=count; } public void run(){ try{ for (int i=0;i<10;i++){ delay=(int)(Math.random()*5000); Thread.sleep(delay); System.out.println("Thread "+no+" with a delay "+delay); } }catch(InterruptedException e){} } } class MyRunnable{ public static void main(String args[]){ DelayRunnable r1 = new DelayRunnable();

DelayRunnable r2 = new DelayRunnable(); Thread thread1=new Thread(r1); Thread thread2=new Thread(r2); thread1.start(); thread2.start(); try{ Thread.sleep(1000); }catch(InterruptedException e){ System.out.println("Thread wrong"); } } } 2.将上列程序利用Runnable接口改写,并上机检验。 3.创建简单的程序ThreeThread.java,该程序将创建三个线程,每个线程应当显示它所运行的时间(可以考虑使用Date类或Calendar类)。 4.键盘输入10个整数,从小到大进行排序。 5.接收键盘输入的字符串,用FileInputStream类将字符串写入文件,用 FileOutputStream类读出文件内容显示在屏幕上。 6.将一个文本文件的内容按行读出,每读出一行就顺序加上行号,并写入到另一个文件中。 三、实验要求: 1.通过实验掌握Thread 、Runnable使用方法; 2.程序必须能够实现多线程; 3.程序必须能够完成题目要求; 4.通过实验掌握文件输入输出流的使用方法; 5.程序必须能够从键盘接收字符串并保存在文件中; 6.程序必须能够读出文件内容显示在屏幕上; 7.写出实验报告。 四、实验代码及截图: 第一题: 在编译器上运行程序得到截图所示结果:

java实验11 输入输出流 - 答案

实验输入输出流 一、实验目的 1、掌握文件字节流的用法; 2、掌握文件字符流的用法; 3、掌握缓冲流的用法; 二、实验内容与步骤 1、编写程序,实现将诗句写入c:\小池.txt文件中,然后再从该文件中读出并打印输出。宋诗《小池》 作者:杨万里 泉眼无声惜细流, 树荫照水弄轻柔。 小荷才露尖尖角, 早有蜻蜓立上头。 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; public class PoemWrite { public static void main(String[] args) { Scanner reader=new Scanner(System.in); String s; try{ FileWriter outOne=new FileWriter("c:\\小池.txt"); BufferedWriter outTwo=new BufferedWriter(outOne); while(!(s=reader.nextLine()).equals("0")){ outTwo.write(s); outTwo.newLine(); } outTwo.flush(); outTwo.close(); outOne.close(); FileReader inOne=new FileReader("c:\\小池.txt"); BufferedReader inTwo=new BufferedReader(inOne); while((s=inTwo.readLine())!=null){

实验9 Java输入输出流

▇▆大学计算机与信息技术学院 实验报告 姓名□□□学号▅▅▅▅专业班级▅▅ 课程名称 Java实验实验日期???? 成绩指导教师▇▇██批改日期实验名称实验9 Java的输入输出流 ●实验目的 1. 理解I/O流的概念,掌握其分类 2. 掌握文本文件读写、二进制文件读写 ●实验内容 1. 分别使用FileWriter 和BufferedWriter 往文件中写入1万个随机数,比较用时的多少?(用时采用方法System.currentTimeMillis())求时间差; 使用:FileWriter 程序源代码 import java.io.*; public class TestFileWriter { public static void main(String []args) throws IOException{ File f = new File("C:/java/tem.txt"); if (f.exists()){ System.out.printf("文件\"C:/java/tem.txt\"已存在"); System.exit(0); } FileWriter fileWriter = new FileWriter(f); long time = System.currentTimeMillis(); for(int i=0;i<10000;i++) fileWriter.write((int)(Math.random()*101)); fileWriter.close(); time = System.currentTimeMillis() - time; System.out.printf("使用FileWriter耗时:"+time+"毫秒"); } } 程序运行结果贴图 使用:BufferedWriter 程序源代码 import java.io.*; public class TestBufferedWriter { public static void main(String []args) throws IOException{ File f = new File("C:/java/tem2.txt");

java输入输出流和文件操作

Java IO流和文件操作Java流操作有关的类或接口: Java流类图结构:

1、File类 File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。 构造方法摘要 File(File parent, String child) File(String pathname) File(String parent, String child) 构造函数 创建方法 1.boolean createNewFile() 不存在返回true 存在返回false 2.boolean mkdir() 创建目录 3.boolean mkdirs() 创建多级目录 删除方法 1.boolean delete() 2.boolean deleteOnExit() 文件使用完成后删除 例子1:列出指定文件夹的文件或文件夹 public class FileDemo1 { public static void main(String[] args){ File[] files =File.listRoots(); for(File file:files){

System.out.println(file); if(file.length()>0){ String[] filenames =file.list(); for(String filename:filenames){ System.out.println(filename); } } } } } 例子2:文件过滤 import java.io.File; public class FileTest2 { public static void main(String[] args) { File file = new File("file"); String[] names = file.list(); for(String name : names) { if(name.endsWith(".java")) { System.out.println(name); }

最新c++课件第十三章 输入输出流(1)

c++课件第十三章输入输出流(1)

第13章输入输出流 13.1 C++的输入和输出 13.1.1输入输出的含义 (1)对系统指定的标准设备进行输入和输出。 (2)以外存磁盘文件为对象进行输入和输出。 (3)对内存指定的空间进行输入和输出。 13.1.2 C++的I/O对C的发展——类型安全和可扩展性13.1.3 C++的输入输出流 1. iostream类库中有关的类 图13.1

图13.2 图13.3 2. 与iostream类库有关的头文件 iostream fstream strstream stdiostream iomanip 3. 在iostream头文件中定义的流对象 4. 在iostream头文件中重载运算符 ostream operator << (char *); //用于向输出流插入一个字符串 cout<<"C++"; 相当于 cout.operator<<("C++"); 对于自己的类,可用11章的方法进行重载。13.2标准输出流

13.2.1 cout,cerr和clog流 1.cout流对象 (1)cout流是流向显示器的数据。 (2)输出基本类型数据时,可以不考虑数据的类型是什么。 (3)cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl时,不论缓冲区 是否已满,都立即输出流中的所有数据,然后插入一 个换行符,并刷新流(清空缓冲区)。 2.cerr流对象 cerr流是标准错误流。cerr流被指定与显示器关联。cout 流通常是传送到显示器输出,但也可以被重定向输出到磁盘文件。 例13.1 解一元二次方程ax2+bx+c=0 #include #include using namespace std; void main() { float a,b,c,disc; cout<<"please input a,b,c:"; cin>>a>>b>>c; if (a==0) cerr<<"a is equal to zero,error!"<

Java输入输出流经典编程题

软件091班java程序机试题 编程题: 0. 求两点之间的距离。 要求: 1)设计点类,属性为点的坐标;利用点类设计距离类。 2)两点的坐标通过键盘输入,键盘输入要运用流,输入数据时要有合理的提示信息, 输出信息表达明确。 1.实现如下界面功能的图形界面应用程序(字体设置)。 2.编写程序,通过键盘输入多行信息,直接输入一个文本文件中。 要求:键盘输入的信息要使用流。 3.求5个以上学生的Java平均成绩。 要求: 1)要利用对象数组生成对象 2)信息通过键盘输入(利用流)。 3)Java成绩的范围在0-分100分,若输错,则需要重新输入。 4.设计一个包含两个命令按钮(显示文字和显示图片)的界面。 要求: 1)当单击“显示文字”命令按钮后,命令按钮变为“文字消失”,同时显示一行“单 击了命令按钮!”的文字。单击“文字消失”命令按钮后,命令按钮又变为“显 示文字”命令按钮,同时文字“单击了命令按钮!”消失。如此可以反复。 2)当单击“显示图片”命令按钮后,命令按钮变为“图片消失”,同时显示任意一 幅图片。单击“图片消失”命令按钮后,命令按钮又变为“显示图片”命令按钮, 同时图片消失。如此可以反复。 5.求5个以上人的平均年龄。 要求: 1)要利用对象数组生成对象 2)信息通过键盘输入(利用流)。 3)人年龄的范围在0岁-120岁,若输错,则需要重新输入。 6.打开Login1.Java源程序,题目要求见源程序的注释部分。 7.分别利用接口和抽象类,求给定三个以上三角形和给定三个以上矩形的平均周长。 提示:应该产生两个源程序。 要求: 1)要利用对象数组生成对象。 2)信息通过键盘输入(利用流)。 3)输入的三角形的三条边要能构成三角形,否则需要重新输入。

java输入输出流总结

一、数据流的基本概念 流一般分为输入流(Input Stream)和输出流(Output Stream)两类,但这种划分并不是绝对的。比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。当然,键盘只是一个数人流,而屏幕则只是一个输出流。 java的标准数据流:标准输入输出指在字符方式下(如DOS),程序与系统进行交互的方式,分为三种: 标准输入studin,对象是键盘。 标准输出stdout,对象是屏幕。 标准错误输出stderr,对象也是屏幕。 二、java.io包中的数据流和文件类 字节流:从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。 InputStream、OutputStream FileInputStream、FileOutputStream PipedInputStream、PipedOutputStream ByteArrayInputStream、ByteArrayOutputStream FilterInputStream、FilterOutputStream DataInputStream、DataOutputStream BufferedInputStream、BufferedOutputStream 字符流:从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。 Reader、Writer InputStreamReader、OutputStreamWriter FileReader、FileWriter CharArrayReader、CharArrayWriter PipedReader、PipedWriter FilterReader、FilterWriter BufferedReader、BufferedWriter StringReader、StringWriter 三、字节流方法 InputStream 和OutputStream read():从流中读入数据 skip():跳过流中若干字节数 available():返回流中可用字节数 mark():在流中标记一个位置 reset():返回标记过得位置 markSupport():是否支持标记和复位操作 close():关闭流 int read() :从输入流中读一个字节,形成一个0~255之间的整数返回(是一个抽象方法)。 int read(byte b[]) :读多个字节到数组中。 int read(byte b[], int off, int len):从输入流中读取长度为len的数据,写入数组b中从索引of f开始的位置,并返回读取得字节数。 write(int b) :将一个整数输出到流中(只输出低位字节,抽象) write(byte b[]) :将字节数组中的数据输出到流中 write(byte b[], int off, int len) :将数组b中从off指定的位置开始,长度为len的数据输出到流

《Java面向对象程序设计》实验-实验八(输入输出流)

广西科技大学 计通学院 《Java面向对象程序设计》实验实验八输入输出流 学生姓名:××× 学号:××× 班级:××× 指导老师:××× 专业:计算机科学与技术 提交日期:×××年××月××日 实验报告内容

1.实验目的 掌握字符输入、输出流用法; 掌握使用Scanner类解析文件; 掌握Console流的使用。 2.实验内容 实验教材-第12章实验1、2、3 字符输入输出流;Scanner类和Console类。 要求:完善程序,给出实验结果截图; 完成试验后练习。 3.程序代码及运行结果: 实验1 举重成绩单 //AnalysisResult.java import java.io.*; import java.util.*; public class AnalysisResult { public static void main(String[] args) { File fRead=new File("score.txt"); File fWrite=new File("scoreAnalysis.txt"); try{ Writer out=new FileWriter(fWrite); BufferedWriter bufferWrite=new BufferedWriter(out); Reader in=new FileReader(fRead); BufferedReader bufferRead=new BufferedReader(in); String str=null; while((str=bufferRead.readLine())!=null){ double

输入输出流

项目13 文本保存器 学习目标: ?认识数据流的概念 ?认识JAVA流的层次结构 ?认识文件的概念 ?会从标准输入/输出设备上输入/输出数据的方法 ?能使用字节流和字符流的方法 工作任务: 编写窗口界面程序,当用户在文本框中输入内容后,单击“保存“按钮,就可将文件写到指定的文件中(1.txt)。 【任务分析】 按下按钮触发动作事件,将文本框中的字符写入文件1.txt。数据是从程序流入到文件1.txt,因此相对于程序而言数据的流向是输出方向。 【程序代码】 import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; class Save extends JFrame { private JTextArea text=new JTextArea(); public Save() { setSize(200,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //窗口关闭时,程序退出 JButton saveButton=new JButton("Save"); saveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { FileOutputStream fos=new FileOutputStream(new File("1.txt")); OutputStreamWriter osw=new OutputStreamWriter(fos); String saveString=text.getText().replaceAll("\n","\r\n"); osw.write(saveString); osw.flush(); osw.close(); }catch(Exception ee) { ee.printStackTrace(); } } } );/*给Save按钮注册一个ActionListener对象,该对象的事件处理方法为actionPerforme,

Java的输入与输出流(实验报告)

成都大学实验报告 实验项目名称Java的输入与输出流 一、实验目的: 1. 理解I/O流的概念,掌握其分类 2. 掌握文本文件读写、二进制文件读写 二、实验内容(包括源程序及相关说明): 1. 分别使用FileWriter 和BufferedWriter 往文件中写入10万个随机数,比较用时。源代码如下: (1) import java.io.*; public class Ex1_1 { public static void main(String[] args) throws IOException{ long t=System.currentTimeMillis(); FileWriter fw =new FileWriter("d:\\Ex1.txt"); for(int i=1;i<=100000;i++) { fw.write((int)(Math.random()*10000)+" \n"); } fw.close(); t=System.currentTimeMillis()-t; System.out.println("The elapsed: "+t); } } (2) import java.io.*; public class Ex1_1 { public static void main(String[] args) throws IOException{ long t=System.currentTimeMillis(); BufferedWriter fw=new BufferedWriter(new FileWriter("d:\\Ex1.txt"));

java输入输出流试验

输入输出流 一、实验目的: 熟悉Java的文件读写机制,练习输入输出流的使用。 二、实验内容: 1、键盘输入10个整数,从小到大进行排序。 2、接收键盘输入的字符串,用FileInputStream类将字符串写入文件,用 FileOutputStream类读出文件内容显示在屏幕上。 3、将一个文本文件的内容按行读出,每读出一行就顺序加上行号,并写入 到另一个文件中。 三、实验要求: 1. 通过实验掌握文件输入输出流的使用方法; 2. 程序必须能够从键盘接收字符串并保存在文件中; 3. 程序必须能够读出文件内容显示在屏幕上; 4. 写出实验报告。 四、实验步骤: 1、键盘输入10个整数,从小到大进行排序。 package javaTest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Gui_21 { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str; int array[]=new int[10]; for(int i=0;i<10;i++) { System.out.println("请输入一个整数:"); str=br.readLine(); array[i]=Integer.parseInt(str);

servlet中的输入输出流

分类:Java JSP和Servlet中的输入输出流 2008-05-27 20:00 一、servlet response实现了HttpServletResponse接口,request实现了HttpServletRequest接口。 1、输出流有两个: 字节形式输出:response.getOutputStream() 字符形式输出:response.getWriter() 2、输入流有两个: 字节形式输入:request.getInputStream() 字符形式输入:request.getReader() 二、JSP JSP中的response对象已经实现了HttpServletResponse接口,request对象已经实现了HttpServletRequest接口。 1、输出流 jsp中可以使用response.getWriter()方法建立字符输出流来输出字符数据到网页上。 因为jsp转译成servlet时,当有输出就会使用getWriter(). 它是javax.servlet.jsp.JspWriter类型(extends java.io.Writer). 而getOutputStream(). 它是javax.servlet.ServletOutputStream类型(extends java.io.OutputStream). 而对客户端的输出只能使用一种类别输出. 当它在jsp里使用了getOutputStream(). 就会产生了两种类别输出,所以就会形成冲突.program根本不知道你要使用那一个作为输出. 一般在下载档案时都要使用getOutputStream().对客户端串流输出. 使用jsp作为下载档案时, 在jsp档案里,不能有任何的输出. 包括空格或out.println("xxx"); 因为会使用了jspWriter(). 2、输入流 jsp中好像没有自动实现输入流的对象,所以可以使用request.getInputStream(),request.getReader()方法建立输入流。 3、读写服务器上的文件 file.Reader()和file.Writer()方法可以用来读写服务器上任何位置的文件。

Java的输入与输出流(实验报告)

大学实验报告 实验项目名称Java的输入与输出流 一、实验目的: 1. 理解I/O流的概念,掌握其分类 2. 掌握文本文件读写、二进制文件读写 二、实验容(包括源程序及相关说明): 1. 分别使用FileWriter 和 BufferedWriter 往文件中写入10万个随机数,比较用时。源代码如下: (1) import java.io.*; public class Ex1_1 { public static void main(String[] args) throws IOException{ long t=System.currentTimeMillis(); FileWriter fw =new FileWriter("d:\\Ex1.txt"); for(int i=1;i<=100000;i++) { fw.write((int)(Math.random()*10000)+" \n"); } fw.close(); t=System.currentTimeMillis()-t; System.out.println("The elapsed: "+t); } } (2) import java.io.*; public class Ex1_1 { public static void main(String[] args) throws IOException{ long t=System.currentTimeMillis(); BufferedWriter fw=new BufferedWriter(new FileWriter("d:\\Ex1.txt")); for(int i=1;i<=100000;i++){

java实验七 输入输出流

实验七输入输出流 一.实验目的和要求 目的: 1、掌握使用输入输出流进行文件的读写操作。 要求: 1、实验报告给出内容1,2的填充代码以及内容3的全部源代码。 二.实验内容 1、按程序模板要求,将注释处替换为Java程序代码。实现文件加密。 2、按程序模板要求,将注释处替换为Java程序代码。给文件的内容添加行号. 3、串行化对象Student到本地文件,并在下一次运行程序时用来初始化。(选做)三.实验环境 硬件: (1)学生用微机 (2)多媒体实验教室 软件: (1)Windows XP中文操作系统 (2)JDK控制台 四.算法描述及实验步骤 实验步骤: 1、按程序模板要求,将注释处替换为Java程序代码 该程序将已存在的文本文件加密后存入另一个文本文件中。请按模板要求,将【代码1】~【代码6】替换为Java程序代码 SecretExample.java import java.io.*; public class SecretExample { public static void main(String args[ ]) { File fileOne=new File("hello.txt"), fileTwo=new File("hello.secret"); char b[]=new char[100]; try{ FileReader in=【代码1】 // 创建指向fileOne的字符输入流 FileWriter out=【代码2】 // 创建指向fileTwo字符输出流 int n=-1; while((n=in.read(b))!=-1) {

for(int i=0;i

5Java第五单元练习题-输入流与输出流

5Java输入流与输出流 5.1单项选择题 1.实现字符流的写操作类是()。 A.FileReader B.Writer C.FileInputStream D.FileOutputStream 2. 实现字符流的读操作类是()。 A.FileReader B.Writer C.FileInputStream D.FileOutputStream 3.凡是从中央处理器流向外部设备的数据流称为() A. 文件流 B. 字符流 C. 输入流 D. 输出流 4.构造BufferedInputStream的合适参数是哪一个?()A.FileInputStream B.BufferedOutputStream C.File D.FileOuterStream 5.在编写Java Application程序时,若需要使用到标准输入输出语句,必须在程序的开头写上()语句。 A.import java.awt.* ; B.import java.applet.Applet ;

C.import java.io.* ; D.import java.awt.Graphics ; 6.下列流中哪个不属于字符流?()A.InputStreamReader B.BufferedReader C.FilterReader D.FileInputStream 7.流的传递方式是() A. 并行的 B. 串行的 C. 并行和串行 D. 以上都不对 8.字符流与字节流的区别在于() A.前者带有缓冲,后者没有 B.前者是块读写,后者是字节读写 C. 二者没有区别,可以互换使用 D. 每次读写的字节数不同 9.下列流中哪个不属于字节流() A.FileInputStream B.BufferedInputStream C. FilterInputStream D. InputStreamReader 10.如果需要从文件中读取数据,则可以在程序中创建哪一个类的对象()

相关文档
最新文档