Java IO之简单输入输出
Java中的IO分为两个部分,以InputStream和Reader为基类的输入类,以OutputStream和Writer为基类的输出类。
当中InputStream和OutputStream以字节为单位进行IO。而Reader和Writer以字符为单位。
除了输入输出,另一系列类库称为Filter,或成为装饰器。
对于输入可用FilterInputStream和FilterReader的派生类,输出可用FilterOutputStream和FilterWriter的派生类。当中FilterInputStream和FilterOutputStream以字节为单位,FilterReader和FilterWriter以字符为单位。
另一个独立与InputStream和OutputStream的—RandomAccessFile。用于对文件的读写,有点相似与C语言中的fopen()
所以能够总结,全部以Stream结尾的都是以字节为单位,也成为流;以Reader或Writer结尾的都以字符为单位。Reader和Writer在java1.1中才出现,假设须要进行转换,能够使用InputStreamReader和OutputStreamWriter。
过滤器(Filter)
Filter是对输入或输出进行一定的控制,如缓存、读取或写入基本数据类型等。用于更改流的一些行为。
FilterInputStream的派生类:
FilterOutputStream的派生类:
Reader和Writer中所用的Filter与InputStream和OutputStream中的Filter对照:
对于Filter的详细使用将在详细综合样例中讲到。
输入
输入分为输入字节和输入字符。分别使用基类是InputStream和Reader,假设须要把InputStrema转化为Reader,能够使用InputStreamReader。下面是一些InputStream经常使用的派生类与Writer与之相应的派生类。
InputStream派生类:
Reader与之相应的派生类:
将InputStream转成Reader演示样例:
// 创建一个InputStream类型的对象
InputStream in = new FileInputStream("data.txt");
// InputStreamReader继承自Reader。其构造方法接受一个InputStream对象
Reader reader = new InputStreamReader(in);
输出
输出分为输出字节和输出字符,分别使用基类是OutputStream和Writer,假设须要把OutputStrema转化为Writer,能够使用OutputStreamWriter。
下面是一些OutputStream经常使用的派生类与Writer与之相应的派生类。
OutputStream派生类:
Writer与之相应的派生类:
将OutputStream转成Writer演示样例:
// 创建一个OutputStream类型的对象
OutputStream out=new FileOutputStream("data.txt");
// OutputStreamWriter继承自Writer,其构造方法接受一个OutputStream对象
Writer writer=new OutputStreamWriter(out);
综合演示样例
1、打开一个文件。并把当中的内容逐行输出的屏幕上。为了提高效率。这里将使用第一种过滤器BufferedReader,能够对输入进行缓冲。
public class Read {
public static void main(String[]args) throws Exception{
String file="data.txt";
read(file);
}
public static void read(String file) throws Exception{
BufferedReader in=new BufferedReader(new FileReader(file));
String s;
while((s=in.readLine())!=null)
System.out.println(s);
in.close();
}
}
2、从文件中按字节读取内容,须要用到DataInputStream过滤器,因为这里要对字节进行操作,所以要使用InputStream而不是Reader。当中对是否是用BufferedStream进行效率比較。
import java.io.*;
public class ReadByte {
public static void main(String[] args) throws Exception {
String file = "data.txt";
long start;
start = System.currentTimeMillis();// 记录执行開始时间
readWithBufferedInputStream(file);
System.out.println("readWithBufferedInputStream use time:"
+ (System.currentTimeMillis() - start));// 执行结束时间-開始时间就是执行时间
start = System.currentTimeMillis();
readWithoutBufferedInputStream(file);
System.out.println("readWithoutBufferedInputStream use time:"
+ (System.currentTimeMillis() - start));
}
public static void readWithBufferedInputStream(String file)
throws Exception {
// 用BufferedInputStream进行读取文件
DataInputStream in = new DataInputStream(new BufferedInputStream(
new FileInputStream(file)));
while (in.available() != 0)
// DataInputStream剩余的字符数不为零则表示还没输出结束
in.readByte();
in.close();
}
public static void readWithoutBufferedInputStream(String file)
throws Exception {
// 不用BufferedInputStream读取文件
DataInputStream in = new DataInputStream(new FileInputStream(file));
while (in.available() != 0)
in.readByte();
in.close();
}
}
执行该程序,当中使用的data.txt文件大小为5.4M,在我的电脑上的输出为:
readWithBufferedInputStream use time:8775
readWithoutBufferedInputStream use time:18487
显然使用了BufferedInputStream效率高了不少。
3、java1.5以后为了方便文件的输入,加入了一个PrintWrite过滤器,它封装了BufferedWriter,并且能够接受String类型的文件名称。所以能够精简代码。
import java.io.*;
public class FileOutPut {
public static void main(String[]args) throws Exception{
BufferedReader in=new BufferedReader(new FileReader("data.txt"));
PrintWriter out=new PrintWriter("data1.txt");
String s;
long start=System.currentTimeMillis();
while((s=in.readLine())!=null){
out.println(s);//用readLine读取文件时,每一行的回车符会被去掉。所以写入文件的时候要把回车符写回去
}
System.out.println("use time:"+(System.currentTimeMillis()-start));
in.close();
out.close();
}
}
执行文件同一时候能够发现,相同是一样大的data.txt文件,读出并写出速度很快。这个得益于缓存。
4、因为之前的方法往文件中面写入的是字节或字符,没有办法存储一些基本类型。所以要使用DataOutputStream/DataInputStream。
import java.io.*;
public class ReadAndWriteBaseType {
public static void main(String[] args) throws Exception {
DataOutputStream out = new DataOutputStream(new FileOutputStream(
"data1.txt"));
out.writeUTF("This a String");// 写入字符串要用writeUTF();
out.writeInt(5);
out.writeFloat(5.4f);
out.close();
DataInputStream in = new DataInputStream(new FileInputStream(
"data1.txt"));
System.out.println(in.readFloat());
System.out.println(in.readInt());
System.out.println(in.readUTF());// 读出字符串要用readUTF();
in.close();
}
}
5、使用RandomAccessFile进行读写文件有点相似DataOutputStream/DataInputStream。都须要指定数据类型。但RandomAccessFile在创建对象的时候须要确定对文件的操作类型,r/w/rw分别表示仅仅读,仅仅写,读和写。Seek()方法能够到处移动。在文件的任何位置改动内容
import java.io.*;
public class UsingRandomAccessFile {
public static void main(String[] args) throws Exception {
RandomAccessFile rf = new RandomAccessFile("data1.txt", "rw");
rf.writeInt(5);
rf.writeInt(10);
rf.writeInt(15);
rf.writeInt(24);
rf.close();
rf = new RandomAccessFile("data1.txt", "r");
System.out.println(rf.readInt());
System.out.println(rf.readInt());
System.out.println(rf.readInt());
System.out.println(rf.readInt());
rf.close();
rf = new RandomAccessFile("data1.txt", "rw");
rf.seek(0);// 把指针指向文件开头
rf.writeInt(-1);// 把前两个字节改成-1
rf.seek(0);
System.out.println(rf.readInt());
System.out.println(rf.readInt());
System.out.println(rf.readInt());
System.out.println(rf.readInt());
rf.close();
}
}
6、把标准输入用BufferedReader包装并获取键盘输入
public class Systemin {
public static void main(String[] args) throws Exception {
// System.in为InputStream类型。要通过InputStreamReader将其转换成Reader
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s;
while ((s = in.readLine()) != null) {
System.out.println(s);
}
}
}
6、重定向。把控制台输出、错误输出定向到文件,可用来写日志文件
import java.io.*;
public class Redirect {
public static void main(String[] args) throws Exception {
OutputStream console = System.out;
PrintStream out = new PrintStream(new BufferedOutputStream(
new FileOutputStream("data1.txt")));
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream("data.txt")));
System.setOut(out);// 把输出重定向到out
System.setErr(out);// 把错误信息重定向到out
String s;
while ((s = in.readLine()) != null)
System.out.println(s);// 输出被定向到out,所以不会在控制台输出
out.close();
in.close();
}
}
Java IO之简单输入输出的更多相关文章
- Java IO流简单使用
Java IO流简单使用 也许是以前IO方面接触的比较少,我对于读和写的概念老是混淆. 趁着现在实习比较闲小结一下,我个人理解读和写都是针对程序,分别就是程序的输入和输出,或者叫读入写出. Java ...
- java IO类简单介绍
一.流的概念 流是字节序列的抽象概念.流和文件的差别:文件是数据的静态存储形式,而流是指数据传输时的形态.文件只是流的操作对象之一.流按其操作的对象不同可以分为文件流.网络流.内存流.磁带流等.Jav ...
- Java IO的简单示例
File类示例 public class FileUsageTest { private static void usage() { System.err.println("Usage: F ...
- Java源码解析——Java IO包
一.基础知识: 1. Java IO一般包含两个部分:1)java.io包中阻塞型IO:2)java.nio包中的非阻塞型IO,通常称为New IO.这里只考虑到java.io包中堵塞型IO: 2. ...
- Java IO(2)阻塞式输入输出(BIO)的字节流与字符流
在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...
- Java IO(3)非阻塞式输入输出(NIO)
在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端 ...
- Java IO(2)阻塞式输入输出(BIO)
在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...
- JAVA IO总结及socket简单实现
为了方便理解与阐述,先引入两张图: a.Java IO中常用的类 在整个Java.io包中最重要的就是5个类和一个接口.5个类指的是File.OutputStream.InputStream.Writ ...
- Mac OS X中报:java.io.UnixFileSystem.createFileExclusively(Native Method)的简单原因
这个博客太简单了!想到可能有其它朋友也遇到这个问题,就记录一下. 今天把一个之前在Windows上的Java项目放到Mac OS X上执行,本来认为应该非常easy的事情,结果还是报: Excepti ...
随机推荐
- 洛谷P1040 加分二叉树(区间dp)
P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...
- C语言和C++的应用领域都在哪些?学C语言好,还是学习C++好?
从事嵌入式开发十几年,基本上围绕着这两种编程语言展开,都可以直接操作底层的编程语言,用的越熟练越是感觉工具属性越强.虽然两种编程语言分属于不同的编程思想,用的时间长了觉得差异也不是很大,现在就个人的从 ...
- Java调用JavaWebService
1.pom配置 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId&g ...
- Linux学习教程
前言 “Linux?听说是一个操作系统,好用吗?” “我也不知道呀,和windows有什么区别?我能在Linux上玩LOL吗” “别提了,我用过Linux,就是黑乎乎一个屏幕,鼠标也不能用,不停地的敲 ...
- 分布式文件管理系统MooseFS在centOS 7中的安装
首先,MooseFS是做什么的在这边不做具体详述,这边主要记录一下我在自己部署MooseFS中遇到的问题和步骤(大部分参考的其他博客或者资料) 首先是准备资源,MooseFS的最新安装包可以去官网下载 ...
- SQL Server2008优化之SET STATISTICS开关
一.准备工作 缓存对于某个查询的性能影响十分之大,所以优化之前要清空缓存. 清除Buffer Pool时面的所有缓存 DBCC DROPCLEANBUFFERS清除Buffer Pool里的所有缓存的 ...
- Python 遍历目录
代码: 1.递归使用遍历目录 import os def scanfile(path): filelist = os.listdir(path) allfile = [] for filename i ...
- AI不与人为敌
业界广为流传着一句话:有多少人工就有多少智能. 其实还应该有一句话:有多少付出就因该有多少回报.公正是世界永恒的话题. 一.人工智能还是人工愚蠢 科技从来没有善恶,也不会杀人,愚蠢的人比聪明的人做的错 ...
- 用VS Code Debug Python
- java 循环document 通用替换某个字符串或特殊字符
document 生成xml时 报错 XML-20100: (Fatal Error) Expected ';'. 查了半天发现是 特殊字符 & 不能直接转出,需要进行转换,因为是通用方法很 ...