10-io java

Java 流(Stream)、文件(File)和IO

java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目 java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。 Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

读取控制台输入

System.in

从控制台读取多字符输入

int read( ) throws IOException
每次调用 read() 方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回 -1。该方法抛出 IOException。

  
char c;  
do {  
    c = (char) br.read();  
    if (c != '\n') {  
        out.println(c);  
    }  
  
} while (c != 'q');

读取字符串

String str;  
do {  
    str = br.readLine();  
    if (str != "\n") {  
        out.println(str);  
    }  
    out.println(identityHashCode(str));  
    out.println(identityHashCode("end"));  
  
} while (!str.equals("end"));

注意, 两个字符串比较是否相同, 需要使用 equals 否则比较的是引用变量。

控制台输出

在此前已经介绍过,控制台的输出由 print( ) 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。
PrintStream 继承了 OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。

PrintStream 定义 write() 的最简单格式如下所示:

void write(int byteval)

读写文件

下图是一个描述输入流和输出流的类层次图。

![[Pasted image 20220723155410.png]]

FileInputStream

可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f = new FileInputStream("C:/java/hello");

也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:

File f = new File("C:/java/hello");
InputStream in = new FileInputStream(f);

方法:

  • public void close() throws IOException{}
  • protected void finalize()throws IOException {}
  • public int read(int r)throws IOException{}
  • public int read(byte[] r) throws IOException{} # 即下次可以读取的字节数

FileOutputStream

OutputStream f = new FileOutputStream("C:/java/hello")

或者

File f = new File("C:/java/hello"); 
OutputStream fOut = new FileOutputStream(f);

写文件

File f = new File("op.txt");  
FileOutputStream fo = new FileOutputStream(f);  
OutputStreamWriter osw = new OutputStreamWriter(fo, StandardCharsets.UTF_8);  
  
osw.write("asdf");  
osw.append("asdfasfafasdf");  
osw.append("asdfasfafasdf");  
osw.flush();  
osw.close();  
fo.close();

读文件

FileInputStream fis = new FileInputStream(f);  
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);  
  
StringBuffer ssb = new StringBuffer();  
  
while (isr.ready()){  
    ssb.append((char) isr.read());  
}  
out.println(ssb.toString());  
  
isr.close();  
fis.close();

Java中的目录

创建目录:

File类中有两个方法可以用来创建文件夹:

  • mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
  • mkdirs()方法创建一个文件夹和它的所有父文件夹。

读取目录

一个目录其实就是一个 File 对象,它包含其他文件和文件夹。

如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。

可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。

File f1 = new File(dirname);
String s[] = f1.list();  // 目录列表

f.isDirectory() 判断是否是目录

f.delete() 删除文件或目录

Java Scanner 类

java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。

下面是创建 Scanner 对象的基本语法:
Scanner s = new Scanner(System.in);

使用 next 方法:

Scanner scan = new Scanner(System.in);  
// 从键盘接收数据  
  
// next方式接收字符串  
System.out.println("next方式接收:");  
// 判断是否还有输入  
if (scan.hasNext()) {  
    String str1 = scan.next();  
    System.out.println("输入的数据为:" + str1);  
}  
scan.close();

使用 nextLine 方法:

类似

next() 与 nextLine() 区别

next():

  • 1、一定要读取到有效字符后才可以结束输入。
  • 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
  • 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  • next() 不能得到带有空格的字符串。

nextLine():

  • 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
  • 2、可以获得空白。

如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取:

Exception 类的层次

所有的异常类是从 java.lang.Exception 类继承的子类。

Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。

Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。

Error 用来指示运行时环境发生的错误。

例如,JVM 内存溢出。一般地,程序不会从错误中恢复。

异常类有两个主要的子类:IOException 类和 RuntimeException 类。
![[Pasted image 20220723162036.png]]

try{  
    // 程序代码  
}catch(异常类型1 异常的变量名1){  
    // 程序代码  
}catch(异常类型2 异常的变量名2){  
    // 程序代码  
}catch(异常类型3 异常的变量名3){  
    // 程序代码  
}finally{ 
// 程序代码 
}

throws/throw 关键字:

如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。

也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

下面方法的声明抛出一个 RemoteException 异常:

import java.io.*;  
public class className  
{  
    public void deposit(double amount) throws RemoteException  
    {  
        // Method implementation  
        throw new RemoteException();  
    }  
    //Remainder of class definition  
}

try-with-resources

类似 python中 with xxx as xx:

JDK7 之后,Java 新增的 try-with-resource 语法糖来打开资源,并且可以在语句执行完毕后确保每个资源都被自动关闭 。
JDK7 之前所有被打开的系统资源,比如流、文件或者 Socket 连接等,都需要被开发者手动关闭,否则将会造成资源泄露。

try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {  
    while ((line = br.readLine()) != null) {  
        System.out.println("Line =>"+line);  
    }  
} catch (IOException e) {  
    System.out.println("IOException in try block =>" + e.getMessage());  
}

try-with-resources 处理多个资源

try-with-resources 语句中可以声明多个资源,方法是使用分号 ; 分隔各个资源:

声明自定义异常

class MyException extends Exception{ }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值