java知识点汇总(四) -- I/O
使用 I/O
--java程序通过流来执行I/O,I/O流是生成或使用信息的抽象,I/O系统将流与物理设备相连,相同的I/O类和方法可应用于任何类型的设备,java在定义于java.io包的类层次结构中实现I/O流
--java定义了两种类型的流:字节流和字符流,使用Unicode,可国际化
字节流处理字节的输入和输出
字符流处理字符的输入和输出,比字节流效率更高
--字节流类
字节流由两个类的层次结构定义,顶端是两个抽象类:InputStream和OutputStream.
InputStream / OutputStream 定义了字节输入流 / 字节输出流共有特点
--字符流类
字符流由两个类的层次结构定义,顶端是两个抽象类:Reader 和 Writer.
Reader用于输入,Writer用于输出,其方法在出错时抛出 IOException
--预定义流
java.lang包中System类,封装了运行时环境的几个要素,包含三个预定义的流变量in,out,err.
in,out,err被声明为public,final,static
System.out /System.err 是标准输出流/错误流,默认是控制台;System.in是标准输入流,默认是键盘
System.in是InputStream类型的对象;System.out /System.err是PrintStream类型的对象,都是字节流
--使用字节流读写控制台
InputStream和OutputStream类的方法可根据错误抛出IOException
读取控制台输入
System.in是InputStream类的一个实例,InputStream类只定义了一个读取字节的输入方法read(),有3版本
int read() throws IOException 读取字符
System.out.println("Enter :");
char aa = (char) System.in.read();
System.out.println("You Enter :" + aa);
int read(byte data[]) throws IOException 读取字节
byte data[] = new byte[10];
System.out.println("Enter :");
System.in.read(data);
System.out.println("You Enter :");
for(int i = 0; i<data.length; i++){
System.out.print((char) data[i]);
}
int read(byte data[], int start, int max) throws IOException 读取字节
byte data[] = new byte[10];
int start = 1;
int max = 5;
System.out.println("Enter :");
System.in.read(data,start, max);
System.out.println("You Enter :");
for(int i = 0; i<data.length; i++){
System.out.print((char) data[i]);
}
写入控制台输出
print()和println()方法可完成控制台输出,由PrintStream类定义(System.out是其实例),PrintStream是OutputStream派生输出流
--使用字节流读写文件
java中,所有文件都由字节组成
为创建一个与文件相链接的字节流,需要使用FileInputStream或FileOutputStream,要打开文件,只需创建这些类的一个对象,将文件名指定为构造函数的一个实参。一旦打开文件,即可对其进行读取或写入
从文件输入
打开文件 FileInputStream fin = new FileInputStream(fileName); [String fileName ; throws FileNotFoundException]
-->fileName 指定了要打开的文件的名称,若文件不存在,则会抛出FileNotFoundException,这是IOException子类,文件成功打开后,fin不为null
读取文件 fin.read();
-->每次调用read()时,它都会从文件读取一个字节,作为整数值返回,当到达文件结尾时,返回-1,出错时抛出IOException
处理完文件后,须关闭文件 fin.close();
-->关闭文件可释放系统资源,否则会导致内存泄漏;出错时抛出IOException
写入文件
打开文件用于输出 FileOutputStream(String fileName) 输出文件打开后,同名文件会被销毁
FileOutputStream(String fileName, boolean append) append为true,输出添加到文件末尾,否则,文件会被重写
FileOutputStream fout = new FileOutputStream(fineName);
--> 无法创建文件,则会抛出FileNotFoundException.
写入文件 fout.write(byteval);
--> byteval 为int,但它只有低8位可写入文件,若出错,则抛出IOException
从一个文件读取字节,然后写入另一个文件 i = fin.read(); if(i != -1) fout.write(i);
--读写二进制数据
DataInputStream / DataOutputStream 实现了DataInput / DataOutput接口,当错误发生时,抛出IOException
读取:
DataInputStream dataIn = new DataInputStream(new FileInputStream("testdata"));
int i = dataIn.readInt(); double d = dataIn.readDouble(); boolean b = dataIn.readBoolean();...
写入:
DataOutputStream dataOut = new DataOutputStream(new FileOutputStream("testdata"));
dataOut.writeInt(i); dataOut.writeDouble(d); dataOut.writeBoolean(b); ...
--使用字符流读写控制台
控制台读取字符
System.in是一个字节流,须将其包含在某一类型Reader中,读取控制台输入最合适类是BufferedReader
int read() throws IOException
int read(char data[]) throws IOException
int read(char data[], int start, int max) throws IOException
example:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//创建链接到System.in的BufferedReader
char c = (char) br.read();
读取字符串
String str = br.readLine(); //读取一行文本
控制台输出
使用PrintWriter类(字符流类)进行控制台输出
PrintWriter pw = new PrintWriter(System.out, true); //创建一个链接到System.out的PrintWriter, true表示每次调用println()方法后自动刷新输出流
pw.print(i); pw.println(d);.. //若print()/println()实参不是基本类型,PrintWriter方法将调用对象的toString()方法,然后打印结果
--使用字符流读写文件
字符流优势是它们可以直接操作Unicode字符
执行基于字符的文件I/O,须使用FileReader和FileWriter类
读取文件--FileReader
FileReader(String fileName) throws FileNotFoundException
fileName是文件的完整路径名,若文件不存在,则抛出异常
FileReader是由InputStreamReader和Reader派生而来,因此可访问这些类定义的方法
BufferedReader br = new BufferedReader(new FileReader("test.txt")); //创建一个FileReader
String s = br.readLine(); br.close();
FileReader包含在BufferedReader中
写入文件--FileWriter
FileWriter(String fileName) throws FileNotFoundException
FileWriter(String fileName, boolean append) throws FileNotFoundException
fileName是文件的完整路径名,若append为true,那么输出被添加至文件末尾,否则文件被重写
String str = "qazwss";
FileWriter fw = new FileWriter("test.txt"); //创建一个FileWriter
fw.write(str);
fw.frush(); // 因为是字符流所以要刷新,写一次后刷一次,这样才真正写入
--File类
File表示一个文件或一个目录路径名
File file1 = new File("C:\\temp\myNote.txt"); //在Windows系统上
File file2 = new File("/temp/yNote.txt"); //在Linux/Unix系统上
pathname是绝对路径或相对路径名,若为null,则抛出NullPointerException异常
File类方法:
canRead() / canWrite() / createNewFile() /delete() / makeDir() / exists()
File引用的文件是否可读 / 可写 / 用此File指定的名称在当前位置新建一个空的新文件 / 删除文件或目录 / 创建此File命名的目录 / 文件或目录是否存在
一个文件系统包含3种类型对象:文件,目录和符号链接,并非所有操作系统都支持符合链接
文件系统中的对象可用一条路径唯一标识,该路径可为绝对路径/相对路径
--Files类
可创建和删除文件和目录,检查文件是否存在,对文件进行读写操作
读取和写入文件只适用于小文件,大文件及新增工具须用流:InputStream/OutputStream/Reader/Writer
创建和删除文件及目录
Path newfile = Paths.get("D:\\33.txt");
Files.createFile(newfile);
Path newdirectory = Paths.get("D:\\44");
Files.createDirectory(newdirectory);
Files.deleteIfExists(newfile/newdirectory);
Files.delete(newfile);
Files.delete(newdirectory);
复制和移动文件及目录
复制
Path source = Paths.get("D:\\11.txt");
Path target = Paths.get("D:\\22.txt");
Files.copy(source,target, StandardCopyOption.REPLACE_EXISTING);
移动
Path source = Paths.get("D:\\11.txt");
Path target = Paths.get("D:\\55\\11.txt");
Files.copy(source,target, StandardCopyOption.REPLACE_EXISTING);
读取
Path textfile = Paths.get("D:\\11.txt");
List<String> ss = Files.readAllLines(textfile);
for(String line:ss)
System.out.println(line);
写入(会覆盖掉原来的内容)
Path textfile = Paths.get("D:\\11.txt");
String line1 = "ppppp";
String line2 = "qqqqq";
List<String> lines = Arrays.asList(line1,line2);
Files.write(textfile,lines);