热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaSE基础与提高_javase基础

第八章流输入输出流的分类Java.io包中定义了多个流的类型(类或抽象类)来实现输入输出功能;可以从不同的角度对其进行分类:按数据流的方向不同可以分为输入流和输出流按处理数据单位不

第八章流

输入/输出流的分类

Java.io包中定义了多个流的类型(类或抽象类)来实现输入/输出功能;可以从不同的角度对其进行分类:

按数据流的方向不同可以分为输入流和输出流

按处理数据单位不同可以分为字节流和字符流

按照功能不同可以分为节点流和处理流

J2SDK所提供的所有流类型位于包java.io内都分别继承自以下四种抽象类型.

字节流

字符流

输入流

InputStream

Reader

输出流

OutputStream

Writer

输入和输出相对于程序说

节点流可以从一个特定的数据源(节点)读写数据(如:文件,内存)

处理流是连接在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能.

InputStream

继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit);

FileInputStream

InputStreamInputstream

PipedInputStream

ByteArrayInputStream

StringBufferInputStream

FilterInputStream

ObiectInputStream

sequenceInputStream

LineNumberInputStream

DataInputStream

BufferedInputStream

PushbackInputStream

InputStream的基本方法

Int read() throws IOException 读取一个字节并以整数的形式返回(0~255),如果返回-1已到输入流的末尾

Int read(bute[] buffer) throws IOException 读取一系列字节并存储到一个数组buffer,返回实际读取的字节数,如果读取前已到输入流的末尾返回-1

Int read(byte[] buffer,int offset,int lengt throws IOException) 读取length个字节,并存储到一个字节数组buffer,从length位置开始,返回实际读取的字节数,如果读取前已到输入流的末尾返回-1

Void close() throws IOException 关闭流释放内存资源

Long skip(long n) throws IOException 跳过n个字节不读,返回实际跳过的字节数

OutputStream

继承自OutputStream的流是用于程序中输出数据,且数据的单位为字节(8bit);

FileOutputStream

OutputStreamPipedOutputStream

ByteArrayOutputStream

ObjectOutputStream

FilterOutputStreamDataOutputStream

BufferedOutputStream

PrintStream

OutputStream的基本方法

Void write(int b) throws IOException 向输出流中写入一个字节数据,该字节数据为参数b的低8位

Void write(byte[] b) throws IOException 将一个字节类型的数组中的数据写入输出流

Void write(byte[] b,int off,int len throws IOException) 将一个字节类型的数组中的数据从指定位置off开始的len个字节写入到输出流

Void flush() throws IOException 将缓冲区中缓冲的数据全部写出到目的地

Void close() throws IOException 关闭流释放内存资源

Reader

继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit)

ReaderBufferedReader        LineNumberReader

CharArrayReader

InputStreamReader    FileReader

FilterReader           PushbackReader

PipedReaderu

StringReader

Reader的基本方法

int read() throws IOException 读取一个字符并以整数的形式返回(0~255),如果返回-1已到输入流的末尾

int read(char[] cbuf) throws IOException 读取一系列字符并存储到一个数组buffer,返回实际读取的字符数,如果读取前已到输入路的末尾返回-1

int read(char[] cbuf,int offset,int length throws IOException) 读取length个字符并存储到一个数组buffer,从length位置开始返回实际读取的字符数,如果读取前以到输入流的末尾返回-1

void close() throws IOException 关闭流释放内存资源

long skip(long n) throws IOException 跳过n个字符不读,返回实际跳过的字节数

writer

继承自writer的流都是用于程序中输入数据,且数据的单位为字符(16bit);

BufferedWriter

WriterCharArrayWriter

OutputStreamReader     FileWriter

FilterWriter

PipedWriter

StringWriter

Writer的基本方法

Void write (int c) throws IOException 向输出流中写入一个字符数据,该字节数据为参数b的低16位

Void write(char[] cbuf) throws IOException 将一个字符类型的数组中的数据写入输出

Void write(char[] cbuf,int offset,int length throws IOException) 将一个字符类型的数组中的指定位置offset开始的length个字符写入到输出流

Void write(String string ) throws IOException 将一个字符串中的字符写入到输出流

Void flush() throws IOException 将输出流中缓冲的数据全部写出到目的地.

Void close() throws IOException 关闭流释放内存资源

访问文件

FileInputStream和FileOutputStream分别继承自InputStream和OutputStream用于向文件中输入和输出字节

FileInputStream FileOutputStream的常用构造方法:

FileInputStream(String name) throws FileNotFoundException

fileInputStream(File file) throws FileNotFoundException

FileOutputStream(String name) throws FileNotFoundException

FileOutputStream(File file) throws FileNotFoundException

FileOutputStream(File file,Boolean append throws FileNoFoundException)

FileInputStream FileOutputStream类支持其父类InputStream和OutputStream所提供的数据读写方法

注意:在实例化FileInputStream和FileOutputStream流时要用try-catch语句以处理其可能抛出的FileNotFoundException.

在读写数据时也要用try-catch语句以处理可能抛出的IOException

FileNotFoundException 是IOException的子类

Eg:

Import java.io.*;

Public class TestFileInputStream{

Public static void main(String[] args){

Int b=0;

FileInputStream in=null;

Try{

In =new FileInputStream(“d:\\share\\java\\io\\TestFileInputStream.java”);

}catch(FileNotFoundException e){

System.out.println(“找不到指定文件”);

System.exit(-1);

}

Try{

Long num=0;

While((b=in.read())!=-1){

System.out.print((char)b);

Num++;

}

In.close();

System.out.println();

System.out.println(“共读取了”+num+”个字节”);

}catch(IOException e1){

System.out.println(“文件读取错误”);

System.exit(-1);

}

}

}

Import java.io.*;

Public class TestFileOutputStream{

Public static void main(String[] args){

Int b=0;

FileInputStream in=null;

FileOutputStream out=null;

Try{

In =new FileInputStream(“d:/java/HelloWorld.java”);

Out=new FileOutputStream(“d:/java/io/HW.java”);

While((b=in.read())!=-1){

Out.write(b);

}

In.close();

Out.close();

}catch(FileNotFoundException e2){

System.out.println(“找不到指定文件”);

System.exit(-1);

}catch(IOException e1){

System.out.println(“文件复制错误”);

System.exit(-1);

}

System.out.println(“文件已复制”);

}

}

Import java.io.*;

Public class TestFileReader{

Public static void main(String[] args){\

FileReader fr=null;

Int c=0;

Try{

Fr=new FileReader(“d:\\share\\java\\io\\TestFileReader.java”);

Int ln=0;

While((c=fr.read())!=-1){

System.out.print((char)c);

}

fr.close();

}catch(FileNotFoundException e){

System.out.println(“找不到指定文件”);

}catch(IOException e){

System.out.println(“文件读取错误”);

}

}

}

Import java.io.*;

Public class testFileWriter{

Public static void main(String[] args){

FileWriter fw=null;

Try{

Fw=new FileWriter(“d:\\bak\\unicode.dat”);

For(int c&#61;0;c<&#61;50000;c&#43;&#43;){

Fw.write(c);

}

Fw.close();

}catch(IOException e1){

E1.printStackTrace();

System.out.println(“文件写入错误”);

System.exit(-1);

}

}

}

处理流类型

缓冲流

缓冲流要套接在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法.J2SDK提供了四种缓存流,常用构造方法为:

BufferedReader(Reader in)

BufferedReader(Reader in,int sz) //sz为自定义缓存区的大小

BufferedWriter(Writer out)

BufferedWriter(Writer out,int sz)

BufferedInputStream(InputStream in)

BufferedInputStream(InputStream in,int size)

BufferedOutputStream(OutputStream out)

BufferedOutputStream(OutputStream out,int size)

缓冲输入流支持其父类的mark和reset方法

BufferedReader提供了readLine方法用于读取一行字符串(以\r或\n分隔)

BufferedWriter 提供了newLine用于写入一个行分隔符

对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出.

Eg

Import java.io.*;

Public class TestBufferStream1{

Public static void main(String[] args){

Try{

FileInputStream fis&#61;new FileInputStream(“d:\\share\\java\\HelloWorld.java”);

BufferedInputStream bis&#61;new BufferedInputStream(fis);

Int c&#61;0;

System.out.println(bis.read());

System.out.println(bis.read());

Bis.mark(100);

For(int i&#61;0;i<10&&(c&#61;bis.read())!&#61;-1;i&#43;&#43;){

System.out.print((char)c&#43;””);

}

System.out.println();

Bis.reset();

For(int i&#61;0;i<10&&(c&#61;bis.read())!&#61;-1;i&#43;&#43;){

System.out.print((char)c&#43;””);

}

Bis.close();

}catch(IOException e){e.printStackTrace}

}

}

Import java.io.*;

Public class TestBufferStream2{

Public static void main(String[] args){

Try{

BufferedWriter bw&#61;new BufferedWriter(new FileWriter(“d:\\share\\java\\dat2.txt”));

BufferedReader br&#61;new BufferedReader(new FileReader(“d:\\share\\java\\dat2.txt”));

String s&#61;null;

For(int i&#61;1;i<&#61;100;i&#43;&#43;){

S&#61;String.valueOf(Math.random());

Bw.write(s);

Bw.newLine();

}

Bw.flush();

While((s&#61;br.readLine())!&#61;null){

System.out.println(s);

}

Bw.close();

Br.close();

}catch(IOException e){e.printStackTrace();}

}

}

转换流

InputStreamReader 和OutputStreamWriter用于字节数据到字符数据之间的转换

InputStreamReader需要和InputStream套接

OutputStreamWriter需要和OutputStream套接

转换流在构造是可以指定其编码集合,例如:InputStream isr&#61;new InputStreamReader(System.in,”ISO8859_1”)

Import java.io.*;

Public class TestTransForm1{

Public static void main(String[] args){

Try{

OutputStreamWriter osw&#61;new OutputStreamWriter(new FileOutputStream(“d:\\bak\\char.txt”));

Osw.write(“mircosoftibmsunapplehp”);

System.out.println(osw.getEncoding());

Osw.close();

Osw&#61;new OutputStreamWriter(new FileOutputStream(“d:\\bak\\char.txt”,true),”ISO8859_1”);//追加.ISO8859_1西欧语言又叫latin-1

Osw.write(“mircosoftibmsunapplehp”);

System.out.println(osw.getEncoding());

Osw.close();

}catch(IOException e){e.printStackTrace;}

}

}

Import java.io.*;

Public class TesttransForm2{

Public static void main(String[] args){

InputStreamReader isr&#61;new InputStreamReader(System.in);

BufferedReader br&#61;new BufferedReader(isr);

String s&#61;null;

Try{

S&#61;br.readLine();

While(s!&#61;null){

If(s.equalsIgnoreCase(“exit”)) break;//忽略大小写

System.out.println(s.toUpperCase());//转换成大写

S&#61;br.readLine();

}

Br.close();

}catch(IOExcepton e){e.printStackTrace;}

}

}//阻塞

数据流

Int 4 long 8 float 4 double 8 boolean 1字节

DateInputStream和DataOutputStream分别继承自InputStream和OutputStream,它属于处理流,需要分别套接在InputStream和OutputStream类型的节点流上

DataInputStream和DataOutputStream提供了可以存取与机器无关的java原始类型数据(如:int,double等)的方法

DataInputStream和DataOutputStream的构造方法为:DataInputStream(InputStream in)

DataOutputStream(OutputStream out)

Eg import java.io.*;

Public class TestDataStream{

Public static void main(String[] args){

ByteArrayOutputStream baos&#61;new ByteArrayOutputStream();

DataOutputStream dos&#61;new DataOutputStream(baos);

Try{

Dos.writeDouble(Math.random());

Dos.writeBoolean(true);

ByteArrayInputStream bais&#61;new ByteArrayInputStream(baos.toByteArray());

System.out.println(bais.available());

DataInputStream dis&#61;new DataInputStream(bais);

System.out.println(dis.readDouble());

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

Dos.close();

Dis.close();

}catch(IOException e){

e.printStackTrace();

}

}

}

Print流

PrintWriter和PrintStream都属于输出流,分别针对于字符和字节.

PrintWriter和PrintStream提供了重载的print

Println方法用于多种数据类型的输出

PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息.

PrintWriter和PrintStream有自动flush功能.

PrintWriter(Writer out)

PrintWriter(Writer out,Boolean autoFlush)

PrintWriter(OutputStream out)

PrintWriter(OutputStream out,boolean autoFlush)

PrintStream(OutputStream out)

PrintStream(OutputStream out,booleanautoFlush)

Eg import java.io.*;

Public class TestPrintStream1{

Public static void main(String[] args){

PrintStream ps&#61;null;

Try{

FileOutputStream fos&#61;new FileOutputStream(“d:\\bak\\log.dat”);

Ps&#61;new PrintStream(fos);

}catch(IOException e){

e.printStackTrace();

}

If(ps!&#61;null){

System.setOut(ps);

}

Int ln&#61;0;

For(char c&#61;0;c<&#61;60000;c&#43;&#43;){

System.out.print(c&#43;” “);

If(ln&#43;&#43; >&#61;100){System.out.println();ln&#61;0;}

}

}

}

Import java.io.*;

Public class TestPrintStream2{

Public static void main(String[] args){

String filename&#61;args[0];

If(filename!&#61;null){list(filename,System.out);}

}

Public static void list(String f,PrintStream fs){

Try{

BufferedReader br&#61;new BufferedReader(new FileReader(f));

String s&#61;null;

While((s&#61;br.readLine()!&#61;null)){

Fs.println(s);

}

Br.close();

}catch(IOException e){

Fs.println(“无法读取文件”);

}

}

}

Import java.util.*;

Import java.io.*;

Public class TestPrintStream3{

Public static void main(String[] args){

String s&#61;null;

BufferedReader br&#61;new BufferedReader(new InputStreamReader(System.in));

Try{

FileWriter fw&#61;new FileWriter(“d:\\bak\\logfile.log”,true);

PrintWriter log&#61;new PrintWriter(fw);

While((s&#61;br.readLine())!&#61;null){

If(s.equalsIgnoreCase(“exit”)) break;

System.out.println(s.toUpperCase());

Log.println(“-----”);

Log.println(s.toUpperCase());

Log.flush();

}

Log.println(“&#61;&#61;&#61;”&#43;new Data()&#43;”&#61;&#61;&#61;”);

Log.flush();

Log.close();

}catch(IOException e){

e.printStackTrace();

}

}

}

Object流

直接将object写入或读出

Transient关键字 透明的(可以用来修饰成员变量,序列化的时候不予考虑,为0)

Serializable接口 序列化(如果想把某个类的对象序列化必须实现)

Externalizable接口 外部化(标记序列对象可以序列化,自己控制序列化过程)

Eg

Import java.io.*;

Public class TestObjectIO{

Public static void main(String args[]) throws Exception{

T t&#61;new T();

t.k&#61;8;

FileOutputStream fos&#61;new FileOutputStream(“d:/share/java/io/testobjectio.dat”);

ObjectOutputStream oos&#61;new ObjectOutputStream(fos);

oos.writeObject(t);

oos.flush();

oos.close();

FileInputStream fis&#61;new FileInputStream(“d:/share/java/io/testobjectio.dat”);

ObjectInputStream ois&#61;new ObjectInputStream(fis);

T tReaded &#61;(T)ois.readObjecct();

System.out.println(tReaded.i&#43;””&#43;tReaded.j&#43;””&#43;tReader.d&#43;””&#43;tReaded.k);

}

}

Class T implements Serializable{

Int i&#61;10;

Int j&#61;9;

Double d&#61;2.3;

Int k&#61;15;

}



推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
author-avatar
偏偏喜欢你_Jerry_207
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有