目录
2.InputStream的子类FileInputStream
(3)FileReader和FileWriter主要读字符时使用
1.I/O
(1)Java的I/O包提供了丰富的类和方法来支持不同类型的流,输入流和输出流之间可以自由地进行转换。它们分别主要包括字节流和字符流两种类型。其中,字节流是操作二进制数据的流,可以处理任何类型的数据,常见的例如InputStream和OutputStream;字符流则是处理字符数据的流,其主要使用Reader和Writer接口。
(2)Java中的IO流可以对文件、网络套接字等的数据进行读写操作,这些操作涉及到打开、关闭、查找、修改和删除文件、创建及维护网络连接等等一系列活动。因此,掌握Java中IO流的知识,有助于我们实现更加高效准确地操作文件、网络数据等各种实用应用。
什么是流
在Java IO中,流是一个核心的概念。流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。在Java IO中流既可以是字节流(以字节为单位进行读写),也可以是字符流(以字符为单位进行读写)。
I/O流的分类
可以从三个不同的维度进行分类:
• 1、按照流的方向(输出输入都是站在程序所在内存的角度划分的)
• 输入流:只能从中读取数据【主要由InputStream和Reader作为基类】
• 输出流:只能向其写入数据【主要由outputStream和Writer作为基类】
• 2、按照流的操作颗粒度划分
• 字节流:以字节为单元,可操作任何数据【主要由InputStream和outPutStream作为基类】
• 字符流:以字符为单元,只能操作纯字符数据,比较方便【主要由Reader和Writer作为基类】
• 3、按照流的角色划分
• 节点流:可以从/向一个特定的IO设备(如磁盘,网络)读/写数据的流。
• 处理流:用于对一个已存在的流进行连接和封装,通过封装后的流来实现数据的读/写功能。
2.File类
(1)概念
在java包中File类是唯一一个可以代表磁盘文件的对象,File类的对象可以表示文件,还可以表示目录,通过调用File类的各个方法可以创建,删除或者重命名文件,判断某磁盘上文件是否存在等,File对象无法操作文件的具体数据,即不能直接对文件进行读/写操作。
(2)File类中的方法
File类的构造方法:
File(String pathname):通过指定的字符串类型文件路径创建一个File对象。
File f1=new File("aaa.txt");//表示在当前目录下创建一个与aaa.txt文件名相关连的文件对象.
File f2=new File("D:\\java\\Hello.java");//指明详细路径及文件名,用双斜杠或者反斜杠
举例:
(3)拿到文件目录下的文件名
3.字节流
(1)概念
InputStream 是所有的输入字节流的父类,它是一个抽象类。被看成一个输入管道,OutputStream被看成一个输出管道,数据通过InputStream从源设备输入到程序,通过OutputStream从程序输出到目标设备,从而实现数据的传输。
(2)InputStream
1.InputStream的方法
int read() 从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数。当没有可用字节时,将返回-1
int read(byte[] b)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目
int read(byte[] b,int off,int len) 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目
void close() 关闭此输入流并释放与该流关联的所有系统资源
前三个read()方法都是用来读数据的,分按字节读取和按字节数组读取。
进行I/O流操作时,应该调用close()方法关闭流,从而释放当前I/O流所占的系统资源。
2.InputStream的子类FileInputStream
(1)FileInputStream的1个字节读入法
package FineDeom1;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamDeom2 {
public static void main(String[] args) throws IOException {
FileInputStream inputStream=new FileInputStream("D:/deom.tex");
FileOutputStream fileOutputStream=new FileOutputStream("E:/deom.tex");
byte[] bytes =new byte[10];
//文件内容读取完后返回一个-1
int size=0;//每次实际装入的元素个数
while((size=inputStream.read(bytes))!=-1)
{ //一次向外写出
fileOutputStream.write(bytes,0,size);
}
inputStream.close();
fileOutputStream.close();
}
}
(2)7.FileInputStream的byte[]读入法
package FineDeom1;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamDeom2 {
public static void main(String[] args) throws IOException {
FileInputStream inputStream=new FileInputStream("D:/deom.tex");
FileOutputStream fileOutputStream=new FileOutputStream("E:/deom.tex");
byte[] bytes =new byte[10];
//文件内容读取完后返回一个-1
int size=0;//每次实际装入的元素个数
while((size=inputStream.read(bytes))!=-1)
{ //一次向外写出
fileOutputStream.write(bytes,0,size);
}
inputStream.close();
fileOutputStream.close();
}
}
(3)FileOutputStream用法
public static void writeByteToFile() throws IOException{
String hello= new String( "hello word!");
byte[] byteArray= hello.getBytes();
File file= new File( "d:/test.txt");
//因为是用字节流来写媒介,所以对应的是OutputStream
//又因为媒介对象是文件,所以用到子类是FileOutputStream
OutputStream os= new FileOutputStream( file);
os.write( byteArray);
os.close();
}
4.字符流
读取一个字符并以整数的形式返回, 如果返回-1已到输入流的末尾,字符流对应的类应该是Reader和Writer。
(1)Reader
public static void writeCharToFile() throws IOException{
String hello= new String( "hello word!");
File file= new File( "d:/test.txt");
//因为是用字符流来读媒介,所以对应的是Writer,又因为媒介对象是文件,所以用到子类是FileWriter
Writer os= new FileWriter( file);
os.write( hello);
os.close();
}
(2)Writer
public static void readCharFromFile() throws IOException{
File file= new File( "d:/test.txt");
//因为是用字符流来读媒介,所以对应的是Reader
//又因为媒介对象是文件,所以用到子类是FileReader
Reader reader= new FileReader( file);
char [] byteArray= new char[( int) file.length()];
int size= reader.read( byteArray);
System. out.println( "大小:"+size +";内容:" +new String(byteArray));
reader.close();
}
(3)FileReader和FileWriter主要读字符时使用
package FileReaderDeom1;
import java.io.*;
public class CharDemo2 {
public static void main(String[] args) throws IOException {
FileReader fileReader=new FileReader("D:/demo1.txt");
FileWriter fileWriter=new FileWriter("D:/demo2.txt",true);//
BufferedReader bufferedReader=new BufferedReader(fileReader);
BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
String size=null;
while ((size=bufferedReader.readLine())!=null)
{
bufferedWriter.write(size);
bufferedWriter.newLine();//插入换行符
}
bufferedReader.close();
bufferedWriter.flush();
bufferedWriter.close();
}
}
注意:上述代码用处理流对FileReader和FileWriter进行包装,可以一行一行的读和一行一行的写。
5.处理流
(1)缓冲流
缓冲流(内部提供了一个缓冲区)能有效提高文件读写效率。
但要注意缓冲流不能直接作用于文件上,能够直接作用于文件上的是节点流(FileInputStream、FileOutputStream、FileReader、FileWriter是节点流)。处理流是套接在节点流上对节点流进行包装进行处理的流。
缓冲流有:
处理字节:BufferedInputStream、BufferedOutPutStream
处理字符:BufferedReader、BufferedWriter
(2)缓冲流实现文本文件的复制
使用BufferedReader、BufferedWriter(不能处理非文本文件)
package Work;
import java.io.*;
import java.util.*;
public class Work2 {
public static void main(String[] args) {
ArrayList<String> lines = new ArrayList<>();
try {
FileReader fileReader=new FileReader("D:/shi.txt");
BufferedReader bufferedReader=new BufferedReader(fileReader);
String size=null;
while ((size=bufferedReader.readLine())!=null)
{
lines.add(size);
}
Collections.sort(lines);//排序
File file=new File("D:/paixv.txt");
if(!file.exists())
{
file.createNewFile();
}
FileWriter fileWriter=new FileWriter("D:/paixv.txt");
BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
for(String a:lines)
{
bufferedWriter.write(a);
bufferedWriter.newLine();
}
bufferedWriter.flush();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
例如对此文件中的诗句进行排序后,再复制到另一个文件中。