Java进阶_4 IO
读取控制台输入
Java的控制台输入System.in读取字节流,可以把System.in包装在一个BufferedReader对象中来创建一个字节流。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.in 读取的是字节流;InputStreamReader读取的是字符流;BufferedReader读取的是字符串;System.in 和InputStreamReader属于低级流;BufferedReader属于高级流。
-
使用Java Scanner类获取用户输入
Scanner s = new Scanner(System.in);
next()和nextLine()区别
next():
- 1、一定要读取到有效字符后才可以结束输入。
- 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
- 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 2、可以获得空白。
如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读
-
Console
提供了用于读取密码的方法,可以禁止控制台回显并返回char数组,对两个特性对保证安全有作用
Java.io.Console 只能用在标准输入、输出流未被重定向的原始控制台中使用,在 IDE 的控制台是用不了。
-
StreamTokenizer
把输入流解析为标记(token), StreamTokenizer 并非派生自InputStream或者OutputStream,而是归类于io库中,因为StreamTokenizer只处理InputStream对象。
public class StreamTokenizerTest { public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); //PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); int a, b; while(in.nextToken() != StreamTokenizer.TT_EOF) // 表示读到了文件末尾 { a = (int)in.nval; in.nextToken(); b = (int)in.nval; //out.println(a + b); System.out.println("a + b = "+(a+b)); } //out.flush(); } }
控制台输出
控制台的输出由 print( ) 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。
PrintStream 继承了 OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。
PrintStream 定义 write() 的最简单格式如下所示:
void write(int byteval) //将buteval的低八位字节写到流中
读写文件
-
FileInputStream
- 可以使用字符串类型的文件名创建一个输入流对象来读取文件
InputStream f = new FileInputStream("D:/Java/");
- 可以使用一个文件对象创建一个输入流对象来读取文件
File f = new File("D:/Java"); InputStream in = new FileInputStream(f);
-
ByteArrayInpuStream
字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中。创建字节数组输入流对象有以下几种方式。
-
接收数组作为参数创建
ByteArrayInputStream bArray = new ByteArrayInputStream(byte[] a);
-
接收字节数组、off和len创建
ByteArrayInputStream bArray = new ByteArrayInputStream(byte[] a, int off, int len);
-
-
DataInputStream
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
下面的构造方法用来创建数据输入流对象。
DataInputStream dis = new DataInputStream(InputStream in);
-
PushBackInputStream
提供可以将数据插入到输入流前端的能力(当然也可以做其他操作)。简而言之PushbackInputStream类的作用就是能够在读取缓冲区的时候提前知道下一个字节是什么,其实质是读取到下一个字符后回退的做法,这之间可以进行很多操作,这有点像把读取缓冲区的过程当成一个数组的遍历,遍历到某个字符的时候可以进行的操作,当然,如果要插入,能够插入的最大字节数是与推回缓冲区的大小相关的
public class PushBackInputStreamDemo { public static void main(String[] args) throws IOException { String str = "hello, world!"; PushbackInputStream push = null; // 声明回退流对象 ByteArrayInputStream bat = null; // 声明字节数组流对象 bat = new ByteArrayInputStream(str.getBytes()); push = new PushbackInputStream(bat); // 创建回退流对象,将拆解的字节数组流传入 int temp = 0; while ((temp = push.read()) != -1) { // push.read()逐字节读取存放在temp中,如果读取完成返回-1 if (temp == ',') { // 判断读取的是否是逗号 push.unread(temp); //回到temp的位置 temp = push.read(); //接着读取字节 System.out.print("(push back" + (char) temp + ") "); // 输出回退的字符 } else { System.out.print((char) temp); // 否则输出字符 } } } }
-
SequenceInputStream
有些情况下,当我们需要从多个输入流中向程序读入数据。此时,可以使用合并流,将多个输入流合并成一个SequenceInputStream流对象。SequenceInputStream会将与之相连接的流集组合成一个输入流并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。 合并流的作用是将多个源合并合一个源。其可接收枚举类所封闭的多个字节流对象.
public class SequenceInputStreamTest { public static void main(String[] args) { doSequence(); } private static void doSequence() { // 创建一个合并流的对象 SequenceInputStream sis = null; // 创建输出流。 BufferedOutputStream bos = null; try { // 构建流集合。 Vector<InputStream> vector = new Vector<InputStream>(); vector.addElement(new FileInputStream("D:\text1.txt")); vector.addElement(new FileInputStream("D:\text2.txt")); vector.addElement(new FileInputStream("D:\text3.txt")); Enumeration<InputStream> e = vector.elements(); sis = new SequenceInputStream(e); bos = new BufferedOutputStream(new FileOutputStream("D:\text4.txt")); // 读写数据 byte[] buf = new byte[1024]; int len = 0; while ((len = sis.read(buf)) != -1) { bos.write(buf, 0, len); bos.flush(); } } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } finally { try { if (sis != null) sis.close(); } catch (IOException e) { e.printStackTrace(); } try { if (bos != null) bos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
-
FileOutputStream
-
字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("D:/Java");
-
使用文件对象创建输出流
File f = new File("D:/Java"); OutputStream fOut = new FileOutputStream(f);
-
-
ByteOutputStream
字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。创建字节数组输出流对象有以下几种方式。
- 下面的构造方法创建一个32字节(默认大小)的缓冲区。
OutputStream bOut = new ByteArrayOutputStream();
- 另一个构造方法创建一个大小为 a 字节的缓冲区。
OutputStream bOut = new ByteArrayOutputStream(int a)
-
DataOutputStream
数据输出流允许应用程序以与机器无关方式将Java基本数据类型写到底层输出流。
下面的构造方法用来创建数据输出流对象。
DataOutputStream out = new DataOutputStream(OutputStream out);
文件和I//O
-
创建目录
File类中有两个方法可以用来创建文件夹:
-
**mkdir( )**方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
-
**mkdirs()**方法创建一个文件夹和它的所有父文件夹。
String dirname = "D:/Java"; File d = new File(dirname); d.madirs();
-
-
创建文件
使用createNewFile方法,当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
FIle f = new FIle("D:/Java/create.txt") f.createNewFile();
-
读取目录
一个目录其实就是一个 File 对象,它包含其他文件和文件夹。
如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。
可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。
File f = new File(dirname); String s[] = f.list();
-
删除目录或文件
删除文件可以使用 java.io.File.delete() 方法。
当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。
File f = new File(dirname + "create.txt"); f.delete();
参考:
[Java 流(Stream)、文件(File)和IO | 菜鸟教程 (runoob.com)
[(6条消息) Java IO最详解_飞鸟Blog-CSDN博客](https://www.runoob.com/java/java-files-io.html)
证该目录下没有其他文件才能正确删除,否则将删除失败。*
File f = new File(dirname + "create.txt");
f.delete();
参考:
[Java 流(Stream)、文件(File)和IO | 菜鸟教程 (runoob.com)
[(6条消息) Java IO最详解_飞鸟Blog-CSDN博客](https://www.runoob.com/java/java-files-io.html)