Java 输入输出流及文件读写详解
字节流和字符流进行读写操作的一般步骤
字节流和字符流进行读写操作的一般步骤
字节流和字符流是 Java 中用于数据读写的两种基本流,它们有着不同的特点和应用场景。
在字节流中进行读写操作一般包括以下步骤:
1. 打开文件或输入输出流:使用相应的打开方法,如打开FileInputStream 或 FileOutputStream 对象,打开文件或输出流。
2. 读取数据:使用输入流的 read() 方法或 RandomAccessFile 类的 read() 方法读取数据,将其存储在字节数组或字符数组中。
3. 处理数据:对读取到的数据进行处理,如将其转换为字符串、打印到控制台等。
4. 关闭流:使用相应的关闭方法,如 FileInputStream.close() 或 FileOutputStream.close() 方法,关闭文件或输入输出流。
在字符流中进行读写操作一般也包括以下步骤:
1. 打开文件或输入输出流:与字节流相似,使用相应的打开方法打开文件或输入输出流。
2. 读取字符:使用输入流的 read() 方法或 RandomAccessFile 类的 read() 方法读取字符,将其存储在字符数组中。
3. 处理字符:对读取到的字符进行处理,如将其转换为字符串、打印到控制台等。
4. 关闭流:与字节流相似,使用相应的关闭方法,如FileInputStream.close() 或 FileOutputStream.close() 方法,关闭文件或输入输出流。
不过,在字符流中,读取的字符需要进行编码转换,以适应不同的字符编码方案。
例如,在读取文本文件时,需要将读取到的字符进行 UTF-8 编码转换,以确保读取的字符符合文本文件的格式。
Java的输入与输出流(实验报告)
成都大学实验报告实验项目名称Java的输入与输出流一、实验目的:1. 理解I/O流的概念,掌握其分类2. 掌握文本文件读写、二进制文件读写二、实验内容(包括源程序及相关说明):1. 分别使用FileWriter 和BufferedWriter 往文件中写入10万个随机数,比较用时。
源代码如下:(1)import java.io.*;public class Ex1_1 {public static void main(String[] args) throws IOException{long t=System.currentTimeMillis();FileWriter fw =new FileWriter("d:\\Ex1.txt");for(int i=1;i<=100000;i++){fw.write((int)(Math.random()*10000)+" \n");}fw.close();t=System.currentTimeMillis()-t;System.out.println("The elapsed: "+t);}}(2)import java.io.*;public class Ex1_1 {public static void main(String[] args) throws IOException{long t=System.currentTimeMillis();BufferedWriter fw=new BufferedWriter(new FileWriter("d:\\Ex1.txt"));for(int i=1;i<=100000;i++){fw.write((int)(Math.random()*10000)+"\n");}fw.close();t=System.currentTimeMillis()-t;System.out.println("The elapsed: "+t);}}2. 生成一个html文件,使其能显示2的幂次(0~9)的表格如下:代码如下:import java.io.*;public class Ex1_1 {public static void main(String[] args) throws IOException{BufferedWriter bw=new BufferedWriter(new FileWriter("d:\\Ex2.html"));bw.write("<table border=1 align=center width=200 height=250>");bw.newLine();bw.write("<tr><td align=center>Power of 2<td align=center>Value</tr>");for(int i=0;i<=9;i++){bw.write("<tr><td align=center>"+i+"<td align=center>"+Math.pow(i, 2)+"</tr>");}bw.write("</table>");bw.newLine();bw.close();}}3. 在文本文件bigbook.txt中包含有很长篇幅的英语短文,编写程序要求统计文件的所有短文中包含英文字母“A”的个数,并显示统计的时间。
第7章 Java的输入 输出流
第7章 Java的输入/输出流
String dirList[]=f1.list(m); for(int i=0;i<dirList.length;i++) Transcript.println(dirList[i]); } } public MyClass3(File f) { this.f=f; } public boolean accept(File dir, String name){ return name.startsWith("un"); } }
第7章 Java的输入/输出流
该程序的运行结果如图7.3所示。 此程序中,我们为了说明路径分隔符的使用方法, 实例化文件对象的时候给出了全路径,其实由于我们 已经在Java系统中设置好了源路径,只要给出文件名 就行了。 表7.1中,list方法用于列出一个目录中所有的文件 或与某个模式相匹配的文件。下面我们给出两个例子 来讨论带参数或不带参数的list方法的使用。
返回指定格式的目录中的文件名 返回当前目录中的所有文件名 创建目录,成功返回真 创建路径中所有目录,成功则返回真 返回路径分隔符 文件更名,成功返回真 返回文件分隔符 返回对象的字符串表示
第7章 Java的输入/输出流
下面我们给出几个File类的应用实例。通过例题的 使用,希望读者对File类有更清楚的认识。 例7.1 import java.io.*; public class MyClass1 { public static void main(String args[]){ Filef=new File("c:\\jbuilder3\\myprojects\\untitled5\\MyClass1.java"); if(!f.exists())
java 顺序读写文件的原理
java 顺序读写文件的原理Java顺序读写文件的原理顺序读写文件是一种常见的文件操作方式,特别是用于处理大型文件或者需要按照固定顺序访问文件内容的情况。
Java提供了多种API和技术来实现顺序读写文件,下面将介绍其原理。
1. 读取文件(顺序读取):顺序读取文件主要通过FileInputStream类来实现。
以下是其原理:- 使用FileInputStream类的构造函数创建一个文件输入流对象,并指定要读取的文件路径。
- 创建一个字节数组或者字符数组作为缓冲区,用来存放从文件中读取的数据。
- 使用read方法从文件输入流中读取数据,并将数据存入缓冲区。
read方法会返回读取的字节数或者字符数,如果已经读取到文件末尾,则返回-1。
- 重复执行上述步骤,直到读取完整个文件内容。
2. 写入文件(顺序写入):顺序写入文件主要通过FileOutputStream类来实现。
以下是其原理:- 使用FileOutputStream类的构造函数创建一个文件输出流对象,并指定要写入的文件路径。
- 创建一个字节数组或者字符数组作为缓冲区,用来存放待写入的数据。
- 使用write方法将缓冲区中的数据写入文件输出流。
write方法会将数据写入文件并返回写入的字节数或者字符数。
- 重复执行上述步骤,直到写入完所有数据。
- 使用close方法关闭文件输出流,确保所有数据都被写入文件。
需要注意的是,顺序读写文件时要合理设置缓冲区的大小。
缓冲区太小会导致频繁的IO操作,影响性能;缓冲区太大则会占用过多内存。
因此,根据实际情况调整缓冲区大小以达到最佳性能。
另外,为了保证顺序读写文件的稳定性和可靠性,建议在读写文件时使用try-catch-finally或者try-with-resources语句块,确保资源能够被正确释放。
总结:顺序读写文件是通过Java的FileInputStream和FileOutputStream类来实现的。
java输入输出流读取文件路径并保存到文本中
e.printStackTrace();
}
try {
File file = new File("c:\\a.txt"); //创建一个file文件
FileWriter writer = new FileWriter(file);
File f = new File(strPath);
if (f.isDirectory()) {
File[] fList = f.listFiles();
for (int j = 0; j < fList.length; j++) {
if (fList[j].isDirectory()) { //判断是否为文件夹
fos.close();
}catch(FileNotFoundException e){
System.out.println("FileStreamsTest"+e);
}catch(IOException e)
writer.write(n); //把目录写到文件file中
writer.close();
}
catch (IOException ex) {
System.err.println(ex);
}
}
public static void main(String[] args) {
String strPath = "C:\\dev\\training"; //选择路径
System.out.println(strPath);
try {
getDir(strPath);
《java输入输出》课件
通过格式化字符串将数据输出到控制台。
String.format
将数据格式化字符串并返回格式化结果。
异常处理
1
try -catch语句
通过添加try-catch语句来处理异常。
2
fin ally 语句
无论是否发生异常,finally语句块中的代码都会执行。
3
自定义异常
开发自定义异常来处理特殊情况。
字符输入输出
字符读取
使用Reader类读取字符信息。
字符写入
使用Writer类向文件中写入字符信息,可支持中文。
二进制输入输出
1 输入
使用BufferedInputStream类从二进制文件中读取信息。
2 输出
使用BufferedOutputStream类将信息写入二进制文件中。
格式化输入输出
控制台输出
使用System.out.print来在控制台输出信息。
键盘输入
使用Scanner类从键盘获取用户输入的信息。
文件输入输出
1
文件读取
使用File类和Scanner类从文件中读取信息。
2
文件写入
使用FileWriter类和PrintWriter类信息写入文件中。
3
二进制文件读写
使用InputStream和OutputStream类读写二进制文件。
《java输入输出》PPT课件
本课程将教您如何处理各种输入输出并展示Java编程语言的强大功能。
输入输出概述
输入
从外部读取数据到计算机中,例如键盘输入。
处理
综合输入和输出,对外部数据做出处理。
输出
将数据从计算机输出到外部,例如屏幕输出。
java08(第8章输入输出流)
在java.io包中定义了很多这二个基本类具体实现 包中定义了很多这二个基本类具体实现 输入输出功能的子类, 输入输出功能的子类,表8.1为部分常用字节输入 为部分常用字节输入 流类和字节输出流子类的功能。 流类和字节输出流子类的功能。
表8.1
类 名 FileInputStream 和 FileOutputStream ByteArrayInputStream和 ByteArrayOutputStream ObjectInputStream 和 ObjectOutputStream FilterInputStream 和 FilterOutputStream DataInputStream 和 DataOutputStream BufferedInputStream 和 BufferedOutputStream
【例8-1 】
1. /* 读取文件 */ 2. import java.io.FileInputStream; 3. import javax.swing.JOptionPane; 4. class Example8_1 5. { public static void main( String args[ ]) 6. { byte buffer[ ] = new byte[2056]; 7. String str; 8. try{ 9. File file=new File("d:/jtest/test.dat"); 10. FileInputStream fileInput = new FileInputStream(file); 11. int bytes = fileInput.read( buffer, 0, 2056 ); //读到的字节数 读到的字节数 12. str = new String( buffer, 0, bytes ); 13. } 14. catch(Exception e) 15. { 16. str= e.toString(); 17. } 18. JOptionPane.showMessageDialog(null,str); 19. System.exit(0); //退出程序 退出程序 20. } 21. }
Java中常用数据类型的输入输出详解
Java中常⽤数据类型的输⼊输出详解⽬录1、Char型1.1 输⼊格式:1.2 举例说明2、int型1.1 简单的int格式输⼊:1.2 举例说明2.1带空格的int格式输⼊:2.2 举例说明3.1 复杂int格式的输⼊3.2 举例说明3、double型1.1 double保留两位格式输出1.2 举例说明4、多次输⼊1.1 输⼊格式1.2 举例说明5、数组1.1 数组输⼊格式:2.1 数组转换成字符串6、字符串1.1 字符串转换成整型,浮点型(以整型为例)1.2 整型,浮点型转换成字符串2.1 字符串转换成字符数组2.2 字符数组转换成字符串3 举例说明7、写在最后C语⾔学习完转到Java后,第⼀个感觉就是Java的写法很复杂,同时,在常⽤的数据类型的输⼊输出上也没有C语⾔那么⽅便。
在C语⾔上⾯,⽤ scanf 函数可以很⽅便的输⼊⼤多数格式,在Java上却不⾏,Java当中没有类似于scanf的语句。
本⽂搭配本⼈的输⼊输出习惯及做题的记录,对这些不同类型的如整型的,是整型的但隔开参数的...做⼀个总结。
下⾯的说明中主类均为Main类,我们使⽤Scanner来进⾏输⼊。
每⼀种输⼊或输出可能有多种⽅法,本⼈只写了较为简单的写法。
1、Char型这⾥说的char型指的是只输⼊⼀个字符的情况。
1.1 输⼊格式:import java.io.IOException;//导⼊包public class Main {public static void main(String[] args) throws IOException {char ch = (char)System.in.read();//<1>System.out.println((int)ch);}}说明:需要搭配IOException异常来使⽤。
<1>中,System.in就是从标准输⼊流(最常见的是键盘)输⼊,rand()⽅法是从这个流⾥⾯读取输⼊的内容。
java
System.out.println("文件名: "+myFile.getName()); System.out.println("文件的相对路 径:"+myFile.getPath()); System.out.println("文件绝对路 径:"+myFile.getAbsolutePath()); System.out.println("上一级目录 名:"+myFile.getParent());
(2)public File(String pathname, String name); 参数pathname指明新创建的文件对象 所对应的文件所在的路径,可以是绝对路 径或相对路径。参数name指明新创建的文 件对象所对应文件的名称。将路径和名称 分开可使具有相同路径的文件具有同一个 路径字符串,而且方便管理。 例如: File myFile=new File("c:\java", "test.txt");
System.out.println("文件长 度:"+myFile.length()); System.out.println("是文件 吗?"+myFile.isFile()); System.out.println("是目录 吗?"+myFile.isDirectory()); System.out.println("是否可 写?"+myFile.canWrite());
第9章 Java输入输出
9.1 Java输入输出概述
9.2 文 件 处 理 9.3 目 录 管 理
java中基本输入输出流的解释
java中基本输入输出流的解释1.网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节。
字节就是字节,在很大程度上,读服务器发送的数据与读取文件没什么不同;向客户传送数据与写入一个文件也没有什么区别。
Java中输入和输出组织不同于大多数其他语言。
它是建立在流(stream)上。
不同的基本流类(如java.io.FileInputStream和.TelnetOutputStream)用于读写特定的数据资源。
但是所有的基本输出流使用同一种基本方法读数据。
过滤器流可以连接到输入流或输出流。
它可以修改已经读出或写人的数据(例如,加密或压缩数据),或者可以简单地提供附加方法将已经读出或写入的数据转化成其他格式。
最后Reader和Writer也可以链接到输入流和输出流,从而允许程序读出和写入文本(即字符)而不是字节。
如果使用正确,Reader和Writer能够处理多种类型的字符编码,包括SJIS和UTF-8等多字节字符集。
一、输出流java的基本输出流是 java.io.OutputStream.public abstract class OutputStreamn public abstract void write(int b) throws IOExceptionn public void write(byte[] data) throws IOExceptionn public void write(byte[] data,int offset,int length) throws IOExceptionn public void flush() throws IOExceptionn public void close() throws IOExceptionOutputStream的子类使用这些方法向指定媒体写入数据。
我始终相信,我们理解了为什么它们存在,就会更好地记住它们,好,现在开始说一下OutputStream类的方法的由来public abstract void write(int b) throws IOExceptionOutputStream的基本方法是write(int b)。
java 文件读写操作注意事项
java 文件读写操作注意事项在进行Java文件读写操作时,有几个注意事项需要注意:1. 文件路径,确保提供正确的文件路径。
可以使用绝对路径或相对路径。
如果使用相对路径,要确保当前工作目录正确。
2. 文件编码,要根据实际情况选择正确的文件编码。
常见的编码方式有UTF-8、GBK等。
在读取或写入文件时,要使用与文件编码相匹配的字符编码。
3. 文件打开和关闭,在读取或写入文件之前,要确保正确地打开文件,并在操作完成后关闭文件。
这可以使用Java的IO流来实现。
使用try-with-resources语句块可以确保文件在使用完毕后自动关闭。
4. 文件权限,在进行文件读写操作时,要确保当前用户对文件具有足够的权限。
否则,可能会抛出权限不足的异常。
5. 异常处理,在进行文件读写操作时,要对可能出现的异常进行适当的处理。
常见的异常包括文件不存在、文件无法读取或写入等。
可以使用try-catch语句块来捕获并处理这些异常。
6. 内存管理,在读取大型文件时,要注意内存的使用。
如果一次性读取整个文件可能导致内存溢出,可以考虑使用缓冲区进行分段读取。
7. 文件锁定,在多线程或多进程环境下,要注意文件的并发访问。
可以使用文件锁定机制确保同一时间只有一个线程或进程可以访问文件。
8. 缓冲区刷新,在写入文件时,要及时将缓冲区的内容刷新到磁盘上的文件中。
可以使用flush或close方法来实现。
9. 文件大小限制,在读取文件时,要注意文件的大小限制。
如果文件过大,可能会导致读取时间过长或内存溢出。
可以考虑使用分段读取或按需读取的方式。
10. 文件类型检查,在读取文件时,要确保文件的类型与预期一致,以避免解析错误或安全问题。
可以通过文件扩展名或内容检查来进行文件类型验证。
总之,在进行Java文件读写操作时,要注意路径、编码、权限、异常处理、内存管理、并发访问、缓冲区刷新、文件大小限制和文件类型检查等方面的注意事项,以确保操作的正确性和安全性。
Java 程序设计基础第10章 Java语言的输入输出与文件处理
8
10.2.1 基本的输入输出流
OutputStream类常用的方法及功能见教材表 10.2。 由于OutputStream是抽象类,所以程序中创 建的输出流对象一般是OutputStream某个子 类的对象,通过调用该对象继承的write() 方法就可以实现对相应外设的输出操作。
11
} 用FileInputStream 、 FileOutputStream来实现对二进制图 像文件的复制。 //filename:App10_2.java 读写二进制文件 import java.io.*; public class App10_2 { public static void main(String[] args) throws IOException { FileInputStream fi=new FileInputStream("d:\\cgj\\风景.jpg"); FileOutputStream fo=new FileOutputStream("d:\\cgj\\风景1.jpg"); System.out.println("文件的大小="+fi.available()); byte[] b=new byte[fi.available()]; fi.read(b); fo.write(b); System.out.println("文件已被拷贝并被更名"); fi.close(); fo2.2 输入输出流的应用
文件输入(FileInputStream)输出流 (FileOutputStream )主要负责完成对本地磁盘文 件的顺序输入与输出操作。 FileInputStream类的对象表示一个文件字节输入 流,从中可读取一个字节或一批字节。 FileOutputStream类的对象表示一个字节文件输 出流,可向流中写入一个字节或一批字节。在生 成该类的对象时,若指定的文件不存在,则创建 一个新的文件,若已存在,则清除原文件的内容。 FileInputStream类和FileOutputStream类的构造 方法见教材表10.3和10.4。
Java输入输出流(一)——常用的输入输出流
Java输⼊输出流(⼀)——常⽤的输⼊输出流1.流的概念:在Java中,流是从源到⽬的地的字节的有序序列。
Java中有两种基本的流——输⼊流(InputStream)和输出流(OutputStream)。
根据流相对于程序的另⼀个端点的不同,分为节点流和过滤流。
(1)节点流:以特定源如磁盘⽂件、内存某区域或者线程之间的管道为端点的构造输⼊输出流,是⼀种基本的流。
(2)过滤流:以其他已经存在的流为端点构造的输⼊输出流。
根据流中的数据单位分为字节流和字符流。
(1)字节流:流中的数据是以8位字节为单位进⾏读写,以InputStream和OutputStream为基础类。
(2)字符流:流中的数据是以16为字符为单位进⾏读写,以Reader和Writer为基础类。
2.字节流InputStream和OutputStream是字节流的两个顶层⽗类,提供了输⼊流类和输出流类的通⽤API。
2.1 输⼊字节流InputStream基本⽅法:(1)基本读⽅法;: int read() int read(byte[] b) int read(byte[] b,int off,int len)(2) 关闭流:void close()(3) 返回输⼊流中还有多少可读字节 int available()(4) 跳过指定字节 long skip(long n)(5) 回读数据 boolean markSupported() void Mark(int readlimt) void reset()2.2 输出字符流OutputStream基本⽅法:(1)基本写⽅法:void write(int c) void write(byte[] b) void write(byte[] b,int off,int len)(2) 关闭流:void close()(3)q强制输出:void flush()3.字符流:Reader和Writer是字符流的顶层⽗类,字符流能够处理Unicode字符集中的所有字符。
用java逐行读取和写入大文件的最快方法
在软件开发过程中,经常会遇到需要处理大文件的情况,而对于Java语言来说,如何高效地逐行读取和写入大文件是一个常见的问题。
本文将介绍使用Java语言逐行读取和写入大文件的最快方法,帮助开发人员更加高效地处理大文件。
一、使用BufferedReader和BufferedWriter进行逐行读取和写入BufferedReader和BufferedWriter是Java标准库中提供的用于缓冲输入和输出的类,它们可以显著提高文件读写的效率。
下面是使用BufferedReader和BufferedWriter进行逐行读取和写入的代码示例:```javapublic class FileUtil {public static void copyFile(String sourceFileName, String targetFileName) {try (BufferedReader br = new BufferedReader(new FileReader(sourceFileName));BufferedWriter bw = new BufferedWriter(new FileWriter(targetFileName))) {String line;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();}} catch (IOException e) {e.printStackTrace();}}}```在上面的代码中,我们使用了BufferedReader逐行读取文件,并使用BufferedWriter逐行写入文件,通过缓冲输入和输出来提高读写效率。
这种方法适用于处理中等大小的文件,但对于大文件来说,还有更加高效的方法可供选择。
二、使用RandomAccessFile进行逐行读取和写入RandomAccessFile是Java标准库中提供的用于随机访问文件的类,它可以在文件中进行任意位置的读写操作。
文件输入输出流
文件输入输出流文件输入输出流是在计算机中进行文件读写操作的一种机制。
通过文件输入输出流,我们可以从文件中读取数据或者将数据写入文件中。
在程序开辟中,文件输入输出流常用于读取配置文件、读取和写入日志文件、进行数据持久化等操作。
文件输入输出流的基本概念和使用方法如下:1. 文件输入流(FileInputStream):用于从文件中读取数据。
- 创建文件输入流对象:可以使用FileInputStream类的构造方法来创建一个文件输入流对象。
需要提供文件路径作为参数。
- 读取数据:可以使用文件输入流对象的read()方法来读取数据。
read()方法会返回一个整数值,表示读取到的字节数据。
当读取到文件末尾时,read()方法会返回-1。
2. 文件输出流(FileOutputStream):用于将数据写入文件中。
- 创建文件输出流对象:可以使用FileOutputStream类的构造方法来创建一个文件输出流对象。
需要提供文件路径作为参数。
如果文件不存在,会自动创建新文件;如果文件已存在,会清空文件内容。
- 写入数据:可以使用文件输出流对象的write()方法来写入数据。
write()方法接受一个字节数组作为参数,将字节数组中的数据写入文件中。
文件输入输出流的使用示例:```javaimport java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class FileIOExample {public static void main(String[] args) {// 文件输入流示例try {FileInputStream inputStream = new FileInputStream("input.txt");int data;while ((data = inputStream.read()) != -1) {System.out.print((char) data);}inputStream.close();} catch (IOException e) {e.printStackTrace();}// 文件输出流示例try {FileOutputStream outputStream = new FileOutputStream("output.txt"); String data = "Hello, World!";byte[] bytes = data.getBytes();outputStream.write(bytes);outputStream.close();} catch (IOException e) {e.printStackTrace();}}}```在上面的示例中,我们通过文件输入流读取了名为"input.txt"的文件中的数据,并使用文件输出流将字符串"Hello, World!"写入了名为"output.txt"的文件中。
java inputstream 和 outputstream使用方法
java inputstream 和 outputstream使用方法Java中的InputStream和OutputStream是用于处理字节流的抽象类。
它们是Java IO库中非常重要的部分,用于读取和写入数据。
InputStream的使用方法:1. 创建一个InputStream对象,可以通过继承InputStream类或实现InputStream接口来创建子类或实现类。
2. 使用read()方法读取数据,该方法会返回一个字节数组。
可以多次调用read()方法来读取多个字节,直到所有数据都被读取完毕。
3. 使用close()方法关闭InputStream对象,释放相关资源。
下面是一个简单的示例代码,演示如何使用InputStream读取文件中的数据:```javaimport ;import ;public class InputStreamExample {public static void main(String[] args) {try {FileInputStream fis = new FileInputStream(""); byte[] buffer = new byte[1024];int bytesRead = (buffer);while (bytesRead != -1) {// 处理读取到的数据(new String(buffer, 0, bytesRead));bytesRead = (buffer);}();} catch (IOException e) {();}}}```OutputStream的使用方法:1. 创建一个OutputStream对象,可以通过继承OutputStream类或实现OutputStream接口来创建子类或实现类。
2. 使用write()方法写入数据,该方法需要一个字节数组作为参数。
可以多次调用write()方法来写入多个字节,直到所有数据都被写入完毕。
Java使用FileInputStream流读取文件示例详解
Java使⽤FileInputStream流读取⽂件⽰例详解⼀、File流概念JAVA中针对⽂件的读写操作设置了⼀系列的流,其中主要有FileInputStream,FileOutputStream,FileReader,FileWriter四种最为常⽤的流⼆、FileInputStream1)FileInputStream概念FileInputStream流被称为⽂件字节输⼊流,意思指对⽂件数据以字节的形式进⾏读取操作如读取图⽚视频等2)构造⽅法2.1)通过打开与File类对象代表的实际⽂件的链接来创建FileInputStream流对象public FileInputStream(File file) throws FileNotFoundException{}若File类对象的所代表的⽂件不存在;不是⽂件是⽬录;或者其他原因不能打开的话,则会抛出FileNotFoundException/**** 运⾏会产⽣异常并被扑捉--因为不存在xxxxxxxx这样的⽂件*/public static void main(String[] args){File file=new File("xxxxxxxx"); //根据路径创建File类对象--这⾥路径即使错误也不会报错,因为只是产⽣File对象,还并未与计算机⽂件读写有关联try{FileInputStream fileInputStream=new FileInputStream(file);//与根据File类对象的所代表的实际⽂件建⽴链接创建fileInputStream对象}catch (FileNotFoundException e){System.out.println("⽂件不存在或者⽂件不可读或者⽂件是⽬录");}}2.2)通过指定的字符串参数来创建File类对象,⽽后再与File对象所代表的实际路径建⽴链接创建FileInputStream流对象public FileInputStream(String name) throws FileNotFoundException通过查看源码,发现该构造⽅法等于是在第⼀个构造⽅法的基础上进⾏延伸的,因此规则也和第⼀个构造⽅法⼀致public FileInputStream(String name) throws FileNotFoundException {this(name != null ? new File(name) : null);}2.3)该构造⽅法没有理解---查看api是指使⽤的fdObj⽂件描述符来作为参数,⽂件描述符是指与计算机系统中的⽂件的连接,前⾯两个⽅法的源码中最后都是利⽤⽂件描述符来建⽴连接的public FileInputStream(FileDescriptor fdObj)3)FileInputStream常⽤API3.1)从输⼊流中读取⼀个字节返回int型变量,若到达⽂件末尾,则返回-1public int read() throws IOException理解读取的字节为什么返回int型变量1、⽅法解释中的-1相当于是数据字典告诉调⽤者⽂件已到底,可以结束读取了,这⾥的-1是Int型2、那么当⽂件未到底时,我们读取的是字节,若返回byte类型,那么势必造成同⼀⽅法返回类型不同的情况这是不允许的3、我们读取的字节实际是由8位⼆进制组成,⼆进制⽂件不利于直观查看,可以转成常⽤的⼗进制进⾏展⽰,因此需要把读取的字节从⼆进制转成⼗进制整数,故返回int型4、因此结合以上3点,保证返回类型⼀致以及直观查看的情况,因此该⽅法虽然读取的是字节但返回int型read⽅法读取实例--最后输出内容和字符内容⼀致是123package com.test;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class FileStream{/*****/public static void main(String[] args){//建⽴⽂件对象File file=new File("C:\\Users\\Administrator\\Desktop\\1.txt");try{//建⽴链接FileInputStream fileInputStream=new FileInputStream(file);int n=0;StringBuffer sBuffer=new StringBuffer();while (n!=-1) //当n不等于-1,则代表未到末尾{n=fileInputStream.read();//读取⽂件的⼀个字节(8个⼆进制位),并将其由⼆进制转成⼗进制的整数返回char by=(char) n; //转成字符sBuffer.append(by);}System.out.println(sBuffer.toString());}catch (FileNotFoundException e){System.out.println("⽂件不存在或者⽂件不可读或者⽂件是⽬录");}catch (IOException e){System.out.println("读取过程存在异常");}}}3.2)从输⼊流中读取b.length个字节到字节数组中,返回读⼊缓冲区的总字节数,若到达⽂件末尾,则返回-1public int read(byte[] b) throws IOException1. 我们先设定⼀个缓冲区即字节数组⽤于存储从流中读取的字节数据,该数组的长度为N2. 那么就是从流中读取N个字节到字节数组中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
I/O类体系在JDK API中,基础的IO类都位于java.io包,而新实现的IO类则位于一系列以java.nio开头的包名中,这里首先介绍java.io包中类的体系结构。
按照前面的说明,流是有方向的,则整个流的结构按照流的方向可以划分为两类:1、输入流:该类流将外部数据源的数据转换为流,程序通过读取该类流中的数据,完成对于外部数据源中数据的读入。
2、输出流:该类流完成将流中的数据转换到对应的数据源中,程序通过向该类流中写入数据,完成将数据写入到对应的外部数据源中。
而在实际实现时,由于JDK API历史的原因,在java.io包中又实现了两类流:字节流(byte stream)和字符流(char stream)。
这两种流实现的是流中数据序列的单位,在字节流中,数据序列以byte为单位,也就是流中的数据按照一个byte一个byte的顺序实现成流,对于该类流操作的基本单位是一个byte,而对于字节流,数据序列以char为单位,也就是流中的数据按照一个char一个插入的顺序实现成流,对于该类流操作的基本单位是一个char。
另外字节流是从JDK1.0开始加入到API中的,而字符流则是从JDK1.1开始才加入到API中的,对于现在使用的JDK版本来说,这两类流都包含在API的内部。
在实际使用时,字符流的效率要比字节流高一些。
在实际使用时,字符流中的类基本上和字节流中的类对应,所以在开始学习IO类时,可以从最基础的字节流开始学习。
在SUN设计JDK的IO类时,按照以上的分类,为每个系列的类设计了一个父类,而实现具体操作的类都作为该系列类的子类,则IO类设计时的四个体系中每个体系中对应的父类分别是:字节输入流InputStream该类是IO编程中所有字节输入流的父类,熟悉该类的使用将对使用字节输入流产生很大的帮助,下面做一下详细的介绍。
按照前面介绍的流的概念,字节输入流完成的是按照字节形式构造读取数据的输入流的结构,每个该类的对象就是一个实际的输入流,在构造时由API完成将外部数据源转换为流对象的操作,这种转换对程序员来说是透明的。
在程序使用时,程序员只需要读取该流对象,就可以完成对于外部数据的读取了。
InputStream是所有字节输入流的父类,所以在InputStream类中包含的每个方法都会被所有字节输入流类继承,通过将读取以及操作数据的基本方法都声明在InputStream类内部,使每个子类根据需要覆盖对应的方法,这样的设计可以保证每个字节输入流子类在进行实际使用时,开放给程序员使用的功能方法是一致的。
这样将简化IO类学习的难度,方便程序员进行实际的编程。
默认情况下,对于输入流内部数据的读取都是单向的,也就是只能从输入流从前向后读,已经读取的数据将从输入流内部删除掉。
如果需要重复读取流中同一段内容,则需要使用流类中的mark方法进行标记,然后才能重复读取。
这种设计在使用流类时,需要深刻进行体会。
在InputStream类中,常见的方法有:a、available方法public int available() throws IOException该方法的作用是返回当前流对象中还没有被读取的字节数量。
也就是获得流中数据的长度。
假设初始情况下流内部包含100个字节的数据,程序调用对应的方法读取了一个字节,则当前流中剩余的字节数量将变成99个。
另外,该方法不是在所有字节输入流内部都得到正确的实现,所以使用该方法获得流中数据的个数是不可靠的。
b、close方法public void close() throws IOException该方法的作用是关闭当前流对象,并释放该流对象占用的资源。
在IO操作结束以后,关闭流是进行IO操作时都需要实现的功能,这样既可以保证数据源的安全,也可以减少内存的占用。
c、markSupported方法public boolean markSupported()该方法的作用是判断流是否支持标记(mark)。
标记类似于读书时的书签,可以很方便的回到原来读过的位置继续向下读取。
d、reset方法public void reset() throws IOException该方法的作用是使流读取的位置回到设定标记的位置。
可以从该位置开始继续向后读取。
e、mark方法public void mark(int readlimit)为流中当前的位置设置标志,使得以后可以从该位置继续读取。
变量readlimit指设置该标志以后可以读取的流中最大数据的个数。
当设置标志以后,读取的字节数量超过该限制,则标志会失效。
f、read方法read方法是输入流类使用时最核心的方法,能够熟练使用该方法就代表IO基本使用已经入门。
所以在学习以及后期的使用中都需要深刻理解该方法的使用。
在实际读取流中的数据时,只能按照流中的数据存储顺序依次进行读取,在使用字节输入流时,读取数据的最小单位是字节(byte)。
另外,需要注意的是,read方法是阻塞方法,也就是如果流对象中无数据可以读取时,则read方法会阻止程序继续向下运行,一直到有数据可以读取为止。
read方法总计有三个,依次是:public abstract int read() throws IOException该方法的作用是读取当前流对象中的第一个字节。
当该字节被读取出来以后,则该字节将被从流对象中删除,原来流对象中的第二个字节将变成流中的第一个字节,而使用流对象的available方法获得的数值也将减少1。
如果需要读取流中的所以数据,只要使用一个循环依次读取每个数据即可。
当读取到流的末尾时,该方法返回-1。
该返回值的int中只有最后一个字节是流中的有效数据,所以在获得流中的数值时需要进行强制转换。
返回值作成int的目的主要是处理好-1的问题。
由于该方法是抽象的,所以会在子类中被覆盖,从而实现最基础的读数据的功能。
public int read(byte[] b) throws IOException该方法的作用是读取当前流对象中的数据,并将读取到的数据依次存储到数组b(b需要提前初始化完成)中,也就是把当前流中的第一个字节的数据存储到b[0],第二个字节的数据存储到b[1],依次类推。
流中已经读取过的数据也会被删除,后续的数据会变成流中的第一个字节。
而实际读取的字节数量则作为方法的返回值返回。
public int read(byte[] b, int off, int len) throws IOException 该方法的作用和上面的方法类似,也是将读取的数据存储到b中,只是将流中的第一个数据存储到b中下标为off的位置,最多读取len个数据,而实际读取的字节数量则作为方法的返回值返回。
g、skip方法public long skip(long n) throws IOException该方法的作用是跳过当前流对象中的n个字节,而实际跳过的字节数量则以返回值的方式返回。
跳过n个字节以后,如果需要读取则是从新的位置开始读取了。
使用该方法可以跳过流中指定的字节数,而不用依次进行读取了。
从流中读取出数据以后,获得的是一个byte数组,还需要根据以前的数据格式,实现对于该byte数组的解析。
由于InputStream类是字节输入流的父类,所以该体系中的每个子类都包含以上的方法,这些方法是实现IO流数据读取的基础。
字节输出流OutputStream该类是所有的字节输出流的父类,在实际使用时,一般使用该类的子类进行编程,但是该类内部的方法是实现字节输出流的基础。
该体系中的类完成把对应的数据写入到数据源中,在写数据时,进行的操作分两步实现:第一步,将需要输出的数据写入流对象中,数据的格式由程序员进行设定,该步骤需要编写代码实现;第二步,将流中的数据输出到数据源中,该步骤由API实现,程序员不需要了解内部实现的细节,只需要构造对应的流对象即可。
在实际写入流时,流内部会保留一个缓冲区,会将程序员写入流对象的数据首先暂存起来,然后在缓冲区满时将数据输出到数据源。
当然,当流关闭时,输出流内部的数据会被强制输出。
字节输出流中数据的单位是字节,在将数据写入流时,一般情况下需要将数据转换为字节数组进行写入。
在OutputStream中,常见的方法有:a、close方法public void close() throws IOException该方法的作用是关闭流,释放流占用的资源。
b、flush方法public void flush() throws IOException该方法的作用是将当前流对象中的缓冲数据强制输出出去。
使用该方法可以实现立即输出。
c、write方法write方法是输出流中的核心方法,该方法实现将数据写入流中。
在实际写入前,需要实现对应的格式,然后依次写入到流中。
写入流的顺序就是实际数据输出的顺序。
write方法总计有3个,依次是:public abstract void write(int b) throws IOException该方法的作用是向流的末尾写入一个字节的数据。
写入的数据为参数b的最后一个字节。
在实际向流中写数据时需要按照逻辑的顺序进行写入。
该方法在OutputStream的子类内部进行实现。
public void write(byte[] b) throws IOException该方法的作用是将数组b中的数据依次写入当前的流对象中。
public void write(byte[] b, int off, int len) throwsIOException该方法的作用是将数组b中从下标为off(包含)开始,后续长度为len个的数据依次写入到流对象中。
在实际写入时,还需要根据逻辑的需要设定byte数值的格式,这个根据不同的需要实现不同的格式。
字符输入流Reader字符输入流体系是对字节输入流体系的升级,在子类的功能上基本和字节输入流体系中的子类一一对应,但是由于字符输入流内部设计方式的不同,使得字符输入流的执行效率要比字节输入流体系高一些,在遇到类似功能的类时,可以优先选择使用字符输入流体系中的类,从而提高程序的执行效率。
Reader体系中的类和InputStream体系中的类,在功能上是一致的,最大的区别就是Reader体系中的类读取数据的单位是字符(char),也就是每次最少读入一个字符(两个字节)的数据,在Reader体系中的读数据的方法都以字符作为最基本的单位。
Reader类和InputStream类中的很多方法,无论声明还是功能都是一样的,但是也增加了两个方法,依次介绍如下:a、read方法public int read(CharBuffer target) throws IOException该方法的作用是将流内部的数据依次读入CharBuffer对象中,实际读入的char个数作为返回值返回。