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派生输出流

其他控制台输出方法:write(), printf(),format() printf()和format() 可详细控制所输出的数据的格式

--使用字节流读写文件

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

关闭文件 fout.close();

从一个文件读取字节,然后写入另一个文件 i = fin.read(); if(i != -1) fout.write(i);

--读写二进制数据

可创建包含int,double或short数据的文件,其读取和写入需使用DataInputStream和DataOutputStream

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,那么输出被添加至文件末尾,否则文件被重写

FileWriter是由OutputStreamWriter和Writer派生而来,因此可访问这些类定义的方法

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);

可能会抛出IOException,FileAlreadyExistsException,NoSuchFileException异常

复制和移动文件及目录

复制
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);
 
posted @ 2022-02-17 11:03  meiyouyou  阅读(55)  评论(0编辑  收藏  举报