1、缓冲输入文件
如果想打开一个文件用于字符输入,可以使用String或者File对象为参数的FileReader。为了提高速度,我们希望对那个文件进行缓冲,那么我们将产生的引用传给一个BufferedReader构造器。由于BufferedReader也提供了readLine()方法,所以这是我们最终对象和进行读取的接口。当readLine()将返回null时,也就达到了文件的末尾。
package io;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedInputFile {
public static String read(String fileName) throws IOException{
//BufferedReader的readLine方法每次读取一个字符串
BufferedReader in = new BufferedReader(new FileReader(fileName));
String s;
StringBuilder sb = new StringBuilder();
while((s = in.readLine()) != null)
sb.append(s + "\n");
in.close();
return sb.toString();
}
public static void main(String[] args) throws IOException{
System.out.println(BufferedInputFile.read("src/io/BufferedInputFile.java"));
}
}
字符串sb用来累计文件的全部内容(包括必须添加的换行符,因为readLine()已将它们删掉)。
2、从内存输入
import java.io.IOException;
import java.io.StringReader;
public class MemoryInput {
public static void main(String[] args) throws IOException {
StringReader in = new StringReader(BufferedInputFile
.read("src/io/MemoryInput.java"));
int c;
while ((c = in.read()) != -1)
System.out.print((char) c);
}
}
3、格式化的内存输入
要读取格式化数据,可以使用DataInputStream,它是一个面向字节的I/O类(不是面向字符)。因此我们必须使用InputStream类而不是Reader类。
package io;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
public class FormattedMemoryInput {
public static void main(String[] args) throws IOException{
try {
DataInputStream in = new DataInputStream(new ByteArrayInputStream(
BufferedInputFile.read("src/io/FormattedMemoryInput.java")
.getBytes()));
while(true)
System.out.print((char)in.readByte());
} catch (IOException e) {
System.err.println("End of Stream");
}
}
}
必须为ByteArrayInputStream提供字节数组。
如果我们从DataInputStream用readByte()一次一个字节的读取字符,那么任何字节的值都是合法的结果,因为返回值不能用来检测输入是否结束。相反,我们可以使用available()方法检查看还有多少可供存取的字符。
package io;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
public class TestEOF {
public static void main(String[] args) throws IOException {
DataInputStream in = new DataInputStream(new ByteArrayInputStream(
BufferedInputFile.read("src/io/TestEOF.java").getBytes()));
//available方法來自FilterInputStream,返回的是下一次对此输入流调用的方法
//可以不受阻塞(或跳过)的估计剩余字节数
while ((in.available()) != 0)
System.out.print((char) in.readByte());
}
}
4、基本的文件输出
FileWriter对象可以向文件写入数据。首先,创建一个与指定文件链接的FileWriter。实际上,我们通常会用BufferedWriter将其包装起来用以缓冲输出。
package io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringReader;
public class BasicFileOutput {
static String file = "BasicFileOutput.out";
public static void main(String[] args) throws IOException{
BufferedReader in = new BufferedReader(new StringReader(BufferedInputFile.read("src/io/BasicFileOutput.java")));
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
//也可以用下面的快捷方式
//PrintWriter out = new PrintWriter(file);
int lineCount = 1;
String s;
while((s = in.readLine()) != null){
out.println(lineCount++ + ": " + s);
}
out.close();
System.out.println(BufferedInputFile.read(file));
}
}
一旦读完输入数据流,readLine()就返回null。要为out显示的调用close()。如果我们不为所有的输出文件调用close(),就会发现缓冲区内容不会被刷新清空,那么它们也就不完整。
5、存储和恢复数据
PrintWriter可以对数据进行格式化,以便人们阅读。但是为了输出一个可供另一个“流”恢复的数据,我们需要用DataOutputStream写入数据,并用DataInputStream恢复数据。
package io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class StroringAndRecoveringData {
public static void main(String[] args) throws IOException{
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("Data.txt")));
out.writeDouble(3.14159);
out.writeUTF("This is PI");
out.writeDouble(1.41413);
out.writeUTF("Square root of 2");
out.close();
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("Data.txt")));
System.out.println(in.readDouble());
System.out.println(in.readUTF());
System.out.println(in.readDouble());
System.out.println(in.readUTF());
}
}
如果我们使用DataOutputStream写入数据,Java保证我们可以使用DataInputStream准确读取数据--无论读和写数据的平台多么不同。
当我们使用DataOutputStream时,写字符串并且让DataInputStream能够恢复它的唯一可靠做法就是使用UTF-8编码,在这里用writeUTF()和readUTF()来实现。UTF-8是一种多字节格式,其编码长度根据实际使用的字符集会有变化。如果我们使用的只是ASCII或者几乎都是ASCII字符(只占7位),那么就显得极其浪费空间和带宽,所以UTF-8将ASCII字符编码成单一字节的形式,而非ASCII字符则编码成两到三个字节的形式。
6、从标准输入中读取
按照标准的I/O模型,Java提供了System.in System.out和System.err。其中System.out已经事先被包装成了printStream对象,System.err也同样如此,但是System.in确实一个没有被包装过的未经加工的InputStream。这意味尽管我们可以立即使用System.out和System.err,但是在读取System.in之前必须对其进行包装。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Echo {
public static void main(String[] args) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s;
while((s = reader.readLine()) != null && s.length() != 0)
System.out.println(s);
}
}
7、标准I/O的重定向
Java的System类提供了一些简单的静态方法调用,以允许我们对标准输入、输出和错误I/O流进行重定向:
setIn(InputStream);
setOut(PrintStream);
setErr(PrintStream);
如果我们突然开始在显示器上创建大量输出,而这些输出滚动得太快以为无法阅读时,重定向输出就显得极为有用。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
public class Redirecting {
public static void main(String[] args) throws IOException{
PrintStream console = System.out;
BufferedInputStream in = new BufferedInputStream(new FileInputStream("src/io/Redirecting.java"));
PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream("redirect.out")));
System.setIn(in);
System.setOut(out);
System.setErr(out);
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
String s;
while((s = bReader.readLine()) != null)
System.out.println(s);
out.close();
System.setOut(console);
}
}
I/O重定向操纵的是字节流,而不是字符流;因此我们使用的是InputStream和OutputStream,而不是Reader和Writer。
相关推荐
例如,对于高并发、低延迟的服务,可能更倾向于使用I/O多路复用和非阻塞I/O,而对性能有较高要求且数据流相对集中的情况,I/O聚集则更有优势。同时,正确管理和调度文件描述符,确保资源的有效利用,也是提升系统...
在电子设计领域,芯片I/O缓冲及ESD电路设计是至关重要的环节,它们关系到芯片与外界环境的交互效率和稳定性。I/O缓冲电路作为芯片与外部系统通信的桥梁,承担着信号转换、驱动和保护的重要任务。这篇文章将深入探讨I...
1. **流的层次结构**:Java I/O流按照功能的不同分为基本流和高级流。基本流如`FileInputStream`、`FileOutputStream`等,主要用于直接与设备交互;高级流如`BufferedReader`、`PrintWriter`等,则是在基本流的基础...
在I/O端口的保护方面,LCD电视的I/O端口可能因为短路或其他原因受到损坏。因此,保护设计需要提供在过载或短路情况下自动切断或限制电流的方法。高速接口如HDMI、USB和DisplayPort都有明确规定,要求最终用户可触及...
一、MCS51系列单片机介绍 MCS51系列单片机是由...通过以上知识点,我们可以了解到89C51单片机的I/O口模拟串行通信实现的具体方法和技术细节,这对于进行嵌入式控制系统开发和学习单片机编程的人来说是非常有价值的。
Java I/O流的使用通常涉及创建相应的流对象,并通过这些对象调用read()和write()等方法来实现数据的读取和写入。例如,使用FileInputStream来从文件中读取字节数据,使用FileOutputStream来向文件中写入字节数据,...
`工具`可能指的是使用Java IO时的一些辅助工具,例如使用NIO(New IO)框架,它提供了非阻塞的I/O操作,提高了性能和并发性。此外,还可以使用Apache Commons IO库,这个开源库提供了大量方便的IO操作工具类,简化了...
Java的I/O流分为四大类:字节输入流、字节输出流、字符输入流和字符输出流。 字节流的典型代表是InputStream和OutputStream,它们是所有字节输入流和输出流的父类。例如,FileInputStream和FileOutputStream分别...
应用篇通过PC与PC、PC与单片机、PC与智能仪器、PC与PLC、PC与GSM短信模块、PC与远程I/O模块等典型应用实例,详细介绍了C/C++语言利用MSComm控件、API函数实现串口通信的程序设计方法。每个实例的设计任务同时采用C++...
本主题将深入探讨如何使用Java实现文件复制、File类的文件读取和写入,以及I/O流的读取与写入。下面将详细阐述这些知识点。 1. **Java文件复制** 文件复制通常涉及读取源文件内容并将其写入目标文件。在Java中,...
这篇博文将深入探讨Java I/O流的基本概念、分类、常用类以及实际应用。 首先,我们需要理解Java I/O流的分类。Java中的流分为两大类:字节流和字符流,每种类别又分为输入流和输出流。字节流处理单个字节的数据,如...
本书紧凑地审视了Java程序员在I/O方面通常面临的典型挑战,并指导读者如何利用新I/O特性的能力。读者将通过常见的、真实世界的I/O问题示例学习如何应用这些工具,并看到新特性如何直接提升响应性、可伸缩性和可靠性...
综上所述,使用Node.js构建的分布式数据流日志服务系统,通过抽象日志数据流、利用非阻塞I/O特性和高性能的NoSQL数据库,提供了一种高效的分布式日志解决方案。这种系统设计对于提升大规模分布式系统的服务质量、...
下面是一个使用Java I/O流进行文件复制的例子: ```java try { FileInputStream fis = new FileInputStream("source.txt"); FileOutputStream fos = new FileOutputStream("target.txt"); byte[] buffer = new ...
应用篇通过PC与PC、PC与单片机、PC与智能仪器、PC与PLC、PC与GSM短信模块、PC与远程I/O模块等典型应用实例,详细介绍了C/C++语言利用MSComm控件、API函数实现串口通信的程序设计方法。每个实例的设计任务同时采用C++...
Java NIO提供了与传统I/O不同的I/O工作方式,它引入了缓冲区(Buffer)和通道(Channel)的概念,支持非阻塞式IO。相对于传统的IO,NIO支持面向缓冲区的、基于通道的I/O操作。NIO还引入了选择器(Selector)的概念,允许...
NIO(New Input/Output)是一种在Java 1.4中引入的I/O API,它的设计目的...总结,Java NIO提供了比传统I/O更高效的I/O操作方式,它以通道和缓冲区为基本单位,支持非阻塞和异步I/O,特别适合需要高吞吐量的网络应用。
1. 基本I/O:如InputStream和OutputStream用于字节流,Reader和Writer用于字符流。它们分别处理二进制数据和文本数据。 2. 缓冲流:如BufferedInputStream和BufferedReader,可以提高读写性能,通过缓冲区减少实际的...