Java中I/O操作首要是指运用Java进行输入,输出操作. Java一切的I/O机制都是根据数据流进行输入输出,这些数据流表明了字符或许字节数据的活动序列。
数据流是一串接二连三的数据的调集,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股接二连三的水流。数据写入程序可所以一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序构成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段状况,每次能够读取其间的恣意长度的数据,但只能先读取前面的数据后,再读取后边的数据(不能随机读取)。不论写入时是将数据分屡次写入,仍是作为一个全体一次写入,读取时的效北京城地下九层大揭秘果都是彻底相同的。
简而言之:数据流是一组有序,有起点和结尾的字节的数据序列。包含输入道德经,Java 中比较常用的知识点:I/O 总结,艾希流和输出流。
当程序需求读取数据的时分,就会树立一个通向数据源的衔接,这个数据源可所以文件,内存,或是网络衔接。相似的,当程序需求写入数据的时分,就会树立一个通向目的地的衔接。
数据流分类:
流序列中的数据既可所以未经加工的原始二进制数据,也可所以经必定编码处理后契合某种格局规则的特定数据。因而Java中的流分为两种: 1) 字节省:数据流中最小的数据单元是字节 2) 字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。
概览
Java.io包中最重要的便是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable。把握了这些就把握了Java I/O的精华了。
Java I/O首要包含如下3层次:
- 流式部分——最首要的部分。如:OutputStream、InputStream、Writer、Reader等
- 非流式部分——如:File类、Random道德经,Java 中比较常用的知识点:I/O 总结,艾希AccessFile类和FileDescriptor等类
- 其他——文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作体系相关的文件体系的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。
首要类如下:
- File(文件特征与办理):用于文件或许目录的描绘信息,例如生成新目录,修正文件名,删去文件,判别文件地点途径等。
- InputStream(字节省,二进制格局操作):笼统类,根据字节的输入操作,是一切输入流的父类。界说了一切输入流都具有的一起特征。
- OutputStream(字节省,二进制格局操作):笼统yy紫金公会类。根据字节的输出操作。是一切输出流的父类。界说了一切输出流都具有的一起特征。
- Reader(字符流,文本格王京岐式操作):笼统类,根据字符的输入操作。
- Writer(字符流,文本格局操作):笼统类,根据字符的输出操作。
- Random后爹AccessFile(随机文件操作):潘径中学它的功用丰厚,能够从文件的恣意方位进行存取(输入输出)操作。
I/O流
java.io包里有4个基本类:InputStream、OutputStream及Reader、Writer类,它们别离处理字节省和字符流。
其他各式各样的流都是由这4个派生出来的。
按来历/去向分类:
- File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
- byte[]:ByteArrayInputStream, ByteArrayOutputStream
- Char[]: CharArrayReader, CharArrayWriter
- String: StringBufferInputStream, StringReader, StringWriter
- 网络数据流:InputStream, OutputStream, Reader, Writer
InputStream
InputStream 为字节输入流,它本身为一个笼统类,有必要依托其子类实道德经,Java 中比较常用的知识点:I/O 总结,艾希现各种功用,此笼统类是表明字节输入流的一切类的超类。 承继自InputStream 的流都是向程序中输入数据的,且数据单位为字节(8bit);
InputStream是输入字节数据用的类,所以InputStream类供给了3种重载的read办法.Inputstream类中的常用办法:
- public abstract int read( ):读取一个byte的数据,回来值是高位补0的int类型值。若回来值=-1阐明没有读取到任何字节读取作业完毕。
- public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。回来值是读取的字节数。该办法实践上是调用下一个办法完成的
- public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。
- public int available( ):道德经,Java 中比较常用的知识点:I/O 总结,艾希回来输入流中能够读取的字节数。留意:若输入堵塞,当时线程将被挂起,假如InputStream目标调用这个办法的话,它只会回来0,这个办法有必要由承继InputStream类的子类目标调用才有用,
- public long skip(long n):疏忽输入流中的n个字节,回来值是实践疏忽的字节数, 越过一些字节来读取
- public int close( ) :运用完后,有必要对咱们翻开的流进行封闭。
来看看几种不同的InputStream:
- FileInputStream把一个文件作为InputStream,完成对文件的读取操作
- ByteArrayInputStream:把内存中道德经,Java 中比较常用的知识点:I/O 总结,艾希的一个缓冲区作为InputStream运用
- StringBufferInputStream:把一个String目标作为InputStream
- PipedInputStream:完成了pipe的概念,首要在线程中运用
- SequenceInputStream:把多个InputStream合并为一个InputStream
OutputStream
OutputStream供给了3个write办法来做数据的输出,这个是和InputStream是相对应的。
- public void write(byte b[ ]):将参数b中的字节写到输出流。
- public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开端的len个字节写到输出流。
- public abstract void write(int b) :先将int转换为byte类型,把低字节黄色暴力写入网王之紫凌惜月到输出流中。
- public void flush( ) : 将数据缓冲区中数据悉数输出,并清空缓冲区。
- public void close( ) : 封闭输出流并开释与流相关的体系资源。
几种不同的OutputStream:
- ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
- Fil刘海燕哈弗eOutputStream:把信息存入文件中
- PipedOutputStream:谥组词完成了pipe的概念,首要在线程中运用
- Se女孩私房手艺quenceOutputStream:把多个OutStream合并为一个OutStrea余火灵m
Reader和InputStream相似;Writer和OutputStream相似。
有两个需求留意的:
- InputStreamReader : 从输入流读取字节,在将它们转换成字符。
- BufferReader :承受Reader目标作为参数,并对其增加字符缓冲器,运用readline()办法能够读取一行。
怎么挑选I/O流
- 确定是输入仍是输出
- 输入:输入流 InputStream Reader
- 输出:输出流 OutputStream Writer
- 清晰操作的数据目标是否是纯文本
- 是:字符流 Reader,Writer
- 否:字节省 InputStream,OutputStream
- 清晰详细的设备。
- 文件:
- 读:FileInputStream,, FileReader,
- 写:FileOutputStream,FileWriter
- 数组:
- byte[ ]:ByteArrayInputStream, ByteArrayOutputStream
- char[ ]:CharArrayReader, CharArrayWriter
- String:
- StringBufferInputStream(已过期,由于其只能用于String的每个字符都是8位的字符串), StringReader, StringWriter
- Socket流
- 键盘:用System.in(是一个InputStream目标)读取,用System.out(是一个OutoutStream目标)打印
- 是否需求转换流
- 是,就运用转换流,从Stream转化为Reader、Writer:InputStreamReader,Ou道德经,Java 中比较常用的知识点:I/O 总结,艾希tputStreamWriter
- 是否需求缓冲进步功率
- 是就加上Buffered:BufferedInp簿本全彩utStream, BufferedOuputStream, BufferedReader, BufferedWriter
- 是否需求格局化输出
示例代码
- 将规范输入(键盘输入)显现到规范输出(显现器),支撑字符。
char ch;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //将字节省转为字符流,带缓冲
try {
while ((ch = (char) in.read()) != -1){
System.o配人ut.print(ch);
}
} catch (IOException e) {
e.printStackTrace();
}
- 将AtomicityTest.java的内容打印到显现器
办法一:
BufferedReader in = new BufferedReader(new FileReader("AtomicityTest.java"));
String s;
try {
wc2808hile ((s = in.readLine()) != null){
System.out.println(s);
}
in.吸胸close();
} catch (IOException e) {
e.printStack安身美利坚Trace();
}
办法二:
FileReader in = new FileReader("AtomicityTest.java");
int b道德经,Java 中比较常用的知识点:I/O 总结,艾希;
try {
while ((b = in.read()) != -1){
System.out卡尔迪罗拉.print((char)b);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
办法三:(有或许呈现乱码)
FileInputStream in = new FileInputStream("AtomicityTest.java");
int n = 50;
byte[] buffer = new byte[n];
try {
while ((in.read(buffer,0,n) != -1 && n > 0)){
System.out.print(new String(buffer));
}
in.close();
} catch (IOException e) 北京增福康公司合法吗{
e.printStackTrace();
}
- 将文件A的内容拷贝到文件B
FileInputStream in = new FileInputStream("AtomicityTest.java");
FileOutputStream out = new FileOutputStream("copy.txt");
int b;
while ((b = in.read()) != -1){
out.write(b);
}
out.flush();
in.close();
out.close();
- 将规范输入的内容写入文件
Scanner in = new Scanner(System.in)奥法之主;
FileWriter out = new FileWriter("systemIn.log");
String s;
while (!(s = in.nextLine()).equals("Q")){
out.write(s + "\n");
}
out.flush();
out.close();
in.close();
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。