【Java学习笔记十】输入输出流

在Java.io包中提供了一系列用于处理输入/输出的流类。从功能上分为两类:输入流和输出流。从六结构上可分为:字节流(以字节为处理单位)和字符流(以字符为处理单位)。

字符是由字节组成。在Java中所有字符用Unicode编码,占两个字节。

如果将“中”以字节输出,则对方收到的内容为两个字节, 但是可能是乱码。
如果将“中”以字符输出,则对方收到的内容为“中”,也占两个字节。

字节流的输入流和输出流的基础类是InputStream和OutputStream这两个抽象类,具体的输入/输出操作则由这两个类的子类完成。

字符流的输入流和输出流的基础类是Reader和Writer这两个抽象类。

Java中还提供了一个特殊类RandomAccessFile,它允许对文件进行随机访问,使用该类的对象可以实现同时对文件进行输入(读文件)或输出(写文件)操作。

InputStream类中的常用方法
  • int available()获得从输入流中所能读取的字节的个数
  • void close()关闭输入流
  • int read()读取输入流中的下一个字节,返回该字节的ASCII值,范围在0~255之间;若流结束,则返回-1
  • int read(byte []a)从输入流中读取字节,并存储到字节数组a中。返回值为实际读取的字节数;若流结束,返回-1
  • int read(byte []a, int off, int length)从输入流中读取长度为length个字节的数据,并存储于数组a索引off位置开始处,并返回读取的字节数,若流结束,则返回-1
  • long skip(long a)从当前位置开始,跳过a个字节的数据
OutputStream类中的常用方法
  • int flush()刷空输出流,并输出所有被缓存的字节
  • void write(int a)将指定的字节a写入输出流。如果a的值大于255,则只输出它的低位字节所表示的值
  • void write(byte []a)把字节数组a中的字节数据全部写入输出流
  • void write(byte []a, int off, int length)把字节数组a中从索引off开始的length个字节写入输出流
  • void close() 关闭输出流
常用的文件处理
文件的顺序读写

一般操作步骤:

  1. 引入java.io包import java.io.*;
  2. 根据不同的数据源和输入输出任务,建立字节流和字符流对象
  3. 若需要对字节或字符流信息组织加工,在已建立字节流或字符流对象上哦固件数据流对象。
  4. 用输入/输出流对象的相应成员方法景行读写操作
  5. 关闭流对象

文件读写字节流类指的是FileInputStream类和FileOutputStream类,它们都重写或实现了其父类InputStream和OutputStream类的一些方法,以实现顺序访问本地文件。它们都是以字节为单位顺序读写一个已存在的文件。

FileInputStream类构造方法有

  • FileInputStream(String filename)用文件名filename创建输入流对象
FileInputStream fis = new FileInputStream("d:\\intest.dat");
  • FileInputStream(File file)用文件对象创建输入流对象,如:
  File file = new File("d:\\intest.dat");FileInputStream fis = new FileInputStream(file);

若输入流对象创建失败(如对应的文件不存在时),将会引发异常FileNotFoundException,在程序中需要对其捕获和处理。
从文件中读取信息。一般用read()成员方法进行读取信息操作。

创建文件输出字节流FileOutputStream对象。可以用文件名、文件对象建立文件输出字节流对象。创建输出字节流对象时,若指定的文件不存在,则会自动建立一个新文件,如果指定的文件已存在,则该文件的内容将被保留或删除。

FileOutputStream类的构造方法有:

  • FileOutputStream(String filename) 用文件名filename创建输出流对象
  • FileOutputStream(File file)用文件对象创建输出流对象

向文件中写入数据。一般用write()成员方法向文件中写入数据
无论是读文件还是写文件,操作完毕后,应该关闭输入流和输出流,以释放资源。关闭的方式有两种:显示关闭和隐式关闭。隐式关闭是利用Java系统的自动垃圾回收功能自动完成,但完成的时机不能确定。显示关闭使用close()方法,建议用显示方式主动关闭流。

例如:

//写文件
package fileio; 
import java.io.FileOutputStream; 
public class FileOutputTest1 
{ public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("c:\\info.txt"); //注意是双反斜杠String msg = "hello";fos.write(msg.getBytes()); //使用字符串的getBytes方法得到字节数组fos.close(); } 
} 
//读文件
package fileio; 
import java.io.File; 
import java.io.FileInputStream; 
public class FileInputTest1 
{ public static void main(String[] args) throws Exception { File file = new File("c:\\info.txt"); FileInputStream fis = new FileInputStream(file); byte[] data = new byte[(int)file.length()];fis.read(data); fis.close(); String msg = new String(new String(data)); System.out.println(msg); } 
} 

例如:实现一个文件复制功能的程序:

import java.io.*;
public class CopyFile 
{public static void main(String[] args) {int dt;FileInputStream fis;FileOutputStream fos;try{ fis = new FileInputStream(args[0]);}catch(FileNotFoundException e){System.out.println("源文件未找到");return;}try{ fos = new FileOutputStream(args[1]);}catch(FileNotFoundException e){System.out.println("目标文件打开失败");return;}try{while((dt=fis.read())!=-1)//进行复制{fos.write(dt);}}catch(IOException e){System.out.println("文件读写出错");}finally{fis.close();fos.close();}}
}

文件字节流FileInputStream和FileOutputStream类只能提供纯字节或字节数组的输入/输出操作,如果要进行基于Java基本数据类型(如整数或浮点数等)的输入/输出,则要用到过滤流FilterInputStream类和FilterOutputStream类的各种子类。

过滤流对象必须与一个输入类或输出类联系起来,而不能直接使用文件名或文件对象来建立

使用数据文件流DataInputStream类和DataOutputStream类读写文件

首先使用前面的方法建立文件字节流对象;然后基于文件字节流对象建立数据文件流对象;再用此对象的方法对文件进行基于基本数据类型数据的读写操作。

DataInputStream类的构造方法为

  • DataInputStream(InputStream in)通过输入流对象in创建输入数据文件流对象。
    DataOutputStream类的构造方法为
  • DataOutputStream(OutputStream out)创建输出数据文件流对象,并写数据到OutputStream对象out。

数据文件流对象不仅能读写数据流,还能读写各种Java语言的基本数据类型数据,如int、float、double等。

在这里插入图片描述
求100以内的所有素数,并把结果写入D盘的data.dat文件中,最后再以每行10个数的方式显示出data.dat文件的内容。

import java.io.*;
public class PrimeList 
{public static void main(String[] args) {int count = 0;  //用于统计素数数目try{       OutputStream fos= new FileOutputStream("d:\\data.dat");DataOutputStream dos = new DataOutputStream(fos);		for(int i=2; i<=100; i++){if(isPrime(i)){dos.writeInt(i); count++;}}fos.close();}catch(IOException e){System.out.println(e.toString());}try{InputStream fis = new FileInputStream("d:\\data.dat");DataInputStream dis = new DataInputStream(fis);for(int i=0; i<count; i++){if(i%10==0)System.out.println();//每行只显示10个数System.out.printf("%5d", dis.readInt());}fis.close();}catch(IOException e){System.out.println(e.toString());}}
使用BufferedInputStream和BufferedOutputStream类读写文件

这两个类称之为字节缓冲流。如果文件的读写数据量较多时,使用字节缓冲流类对象可以提高文件读写操作的效率字节缓冲流对象会建立一个内部缓冲区,输入/输出数据首先会读写到缓冲区进行操作,当缓冲区满或关闭字节缓冲流时一次性输出到对应流,也可使用flush()方法主动将缓冲区数据输出到对应流,这样可以极大地减少磁盘读写次数,提高了文件操作效率。

BufferedInputStream类的构造方法

  • BufferedInputStream(InputStream in)创建缓冲输入流对象,保存in流对象,并创建一个内部缓冲区来保存输入数据。
  • BufferedInputStream(InputStream in, int size)创建缓冲输入流对象,保存in流对象,并创建一个指定大小为size个字节的内部缓冲区来保存输入数据。

BufferedOutputStream类的构造方法

  • BufferedOutputStream(OutputStream out)创建输出缓冲流对象,并创建一个默认大小为512个字节的内部缓冲区,写数据到参数所指定的输出流out对象。
  • BufferedOutputStream(OutputStream out, int size)创建输出缓冲流对象,并创建一个指定大小为size个字节的内部缓冲区,写数据到参数所指定的输出流out对象。

flush()方法用于在程序结束之前主动将缓冲区里的数据输出到对应的输入/输出流。可以通过输入/输出缓冲流对象进行显示调用。

BufferedInputStream类提供了与FileInputStream类同样的读文件操作方法,BufferedOutputStream类提供了与FileOutputStream类同样的写文件操作方法,唯一的区别是所有读写操作的数据首先进入到缓冲区,在必要时(缓冲区满、关闭流或调用flush()方法)才输出到对应的流中。

使用PrintStream类写文件

PrintStream类提供了把Java的任何类型数据转换为字符串类型数据输出的功能。输出时,经常使用的方法有print()、println()和printf()。

创建PrintStream类的对象时,需要在OutputStream类对象的基础上进行。PrintStream类的构造方法有:

  • PrintStream(OutputStream out)创建一个打印流对象。
  • PrintStream(OutputStream out, boolean autoFlush)创建一个打印流对象。

java.io.PrintStream写文件,更加简便。 我们可以调用PrintStream类里面的函数来进行输出操作,其功能主要是各个print函数和println函数,使用方法和System.out类似。

package fileio; 
import java.io.FileOutputStream; 
import java.io.PrintStream; 
public class PrintStreamTest1 
{ public static void main(String[] args) throws Exception { PrintStream ps = new PrintStream(new FileOutputStream("c:\\info.txt")); String msg = "hello"; ps.println(msg); ps.close(); }
}
字符流
  • 使用Reader类和Writer类的子类对象可以处理以字符为单位的输入/输出操作。字符流中将所有的内容看成一个个字符(Character),占据2个字节,英文字符也不例外。在Java中,所有字符输入流的父类是:java.io. Reader,所有字符输出流的父类是:java.io.Writer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 写时拷贝 2

什么情况下会用到c中的拷贝构造函数】&#xff1a; 1&#xff09;用已经存在的同类的对象去构造出另一个新的对象 2&#xff09;当函数的形参是类的对象时&#xff0c;这时调用此函数&#xff0c;使用的是值的拷贝&#xff0c;也会调用拷贝构造函数 3&#xff09;当函数的返…

【Java学习笔记十一】图形用户界面

图形用户界面或图形用户接口(Graphical User Interface&#xff0c;GUI)是指采用图形方式,借助菜单、按钮等标准界面元素&#xff0c;用户可以通过鼠标等外设向计算机系统发出指令、启动操作&#xff0c;并将系统运行的结果同样以图形方式显示给用户的技术。 GUI是事件驱动的&…

C++ 写时拷贝 3

http://blog.csdn.net/ljianhui/article/details/22895505 字符串一种在程序中经常要使用到的数据结构&#xff0c;然而在C中却没有字符串这种类型。在C中&#xff0c;为了方便字符串的使用&#xff0c;在STL中提供了一个string类。该类维护一个char指针&#xff0c;并封装和提…

C++类模板实例化条件

&#xff08;我不想了解这个&#xff0c;可是考试要考。。。。 并不是每次使用模板类都会实例化一个类 声明一个类模板的指针和引用不会引起类模板的实例化如果检查这个指针或引用的成员时时&#xff0c;类模板会实例化定义一个对象的时候需要有类的定义&#xff0c;会实例化…

C++ String类写时拷贝 4

http://blog.51cto.com/zgw285763054/1839752 维基百科&#xff1a; 写入时复制&#xff08;英语&#xff1a;Copy-on-write&#xff0c;简称COW&#xff09;是一种计算机程序设计领域的优化策略。其核心思想是&#xff0c;如果有多个调用者&#xff08;callers&#xff09;同时…

C++笔试复习

基础知识点 C中对象数组在定义的时候全部进行实例化&#xff08;与Java不同&#xff0c;Java相当于只是定义了一个指针数组&#xff0c;没有进行实例化&#xff09; 程序的三种基本控制结构是&#xff1a;顺序结构、循环结构、选择结构 一个C程序开发步骤通常包括&#xff1a…

C++函数默认参数

声明是用户可以看到的部分&#xff0c;客户非常信任地使用这个特性&#xff0c;希望得到一定的结果&#xff0c;但是你在实现里使用了不同的缺省值&#xff0c;那么将是灾难性的。因此编译器禁止声明和定义时同时定义缺省参数值。 类的成员函数的参数表在声明时默认参数位于参…

C语言链表各类操作详解

http://blog.csdn.net/pf4919501/article/details/38818335链表概述   链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量&#xff0c;以head表示&#xff0c;它存放一个地址。该地址指向一个元素。…

Java笔试复习

Java程序运行 Java程序的执行必须经过编辑、编译和运行三个步骤 编辑指编写代码&#xff0c;最终形成后缀名为.java的Java源文件编译指使用Java编译器&#xff08;javac指令&#xff09;将源文件翻译为二进制代码&#xff0c;编译后生成后缀名为.class的字节码文件&#xff0c…

数据结构之自建算法库——链栈

http://blog.csdn.net/sxhelijian/article/details/48463801本文针对数据结构基础系列网络课程(3)&#xff1a;栈和队列中第4课时栈的链式存储结构及其基本运算实现。 按照“0207将算法变程序”[视频]部分建议的方法&#xff0c;建设自己的专业基础设施算法库。 链栈算法库采用…

Java类名与包名不区分大小写

刚才写了一个简单的Java程序&#xff0c;经过测试得到一个令人震惊的结论&#xff1a;Java类名和包名是不区分大小写的 可以看一下这个例子&#xff1a; package Test;class aBcdEfG {}class AbCdefg {}public class TTT {public static void main(String[] args){AbCdefg tm…

epoll实现高并发聊天室

http://blog.csdn.net/qq_31564375/article/details/51581038项目介绍 本项目是实现一个简单的聊天室&#xff0c;聊天室分为服务端和客户端。本项目将很多复杂的功能都去掉了&#xff0c;线程池、多线程编程、超时重传、确认收包等等都不会涉及。总共300多行代码&#xff0c;让…

BZOJ2809-左偏树合并

Description 在一个忍者的帮派里&#xff0c;一些忍者们被选中派遣给顾客&#xff0c;然后依据自己的工作获取报偿。在这个帮派里&#xff0c;有一名忍者被称之为 Master。除了 Master以外&#xff0c;每名忍者都有且仅有一个上级。为保密&#xff0c;同时增强忍者们的领导力&a…

处理大并发之一 对epoll的理解,epoll客户端服务端代码

http://blog.csdn.net/zhuxiaoping54532/article/details/56494313处理大并发之一对epoll的理解&#xff0c;epoll客户端服务端代码序言&#xff1a;该博客是一系列的博客&#xff0c;首先从最基础的epoll说起&#xff0c;然后研究libevent源码及使用方法&#xff0c;最后研究n…

epoll详解

http://blog.csdn.net/majianfei1023/article/details/45772269欢迎转载&#xff0c;转载请注明原文地址&#xff1a;http://blog.csdn.net/majianfei1023/article/details/45772269一.基本概念&#xff1a;1.epoll是什么&#xff1a;epoll是Linux内核为处理大批量文件描述符而…

数据分割-并查集+set

小w来到百度之星的赛场上&#xff0c;准备开始实现一个程序自动分析系统。 这个程序接受一些形如xixj 或 xi≠xj 的相等/不等约束条件作为输入&#xff0c;判定是否可以通过给每个 w 赋适当的值&#xff0c;来满足这些条件。 输入包含多组数据。 然而粗心的小w不幸地把每组数据…

linux c++线程池的实现

http://blog.csdn.net/zhoubl668/article/details/8927090?t1473221020107 线程池的原理大家都知道&#xff0c;直接上代码了^_^ Thread.h [cpp] view plaincopy #ifndef __THREAD_H #define __THREAD_H #include <vector> #include <string> #inc…

树启发式合并入门

所谓启发式合并&#xff0c;就是一种符合直觉的合并方法&#xff1a;将小的子树合并在大的子树上。 这些问题一般是相似的问题背景&#xff1a;都是树上的计数问题&#xff0c;都不能直接从上往下进行暴力&#xff0c;都需要从下往上计数时对子树信息进行运算从而得到父亲节点的…

链栈基本操作

http://blog.csdn.net/jwentao01/article/details/46765517###;栈基本概念&#xff1a; 栈&#xff08;stack&#xff09;是限定在表尾进行插入和删除操作的线性表&#xff08;或单链表&#xff09;。 //只能在一段进行插入和删除&#xff0c;因此不存在&#xff0c;在中间进行…

Linux网络编程---I/O复用模型之select

https://blog.csdn.net/men_wen/article/details/53456435Linux网络编程—I/O复用模型之select 1. IO复用模型 IO复用能够预先告知内核&#xff0c;一旦发现进程指定的一个或者多个IO条件就绪&#xff0c;它就通知进程。IO复用阻塞在select或poll系统调用上&#xff0c;而不是阻…