java基础入门之键盘输入的文件流
JAVA输入输出流和文件操作

1. 流类
① InputStream
抽象字节输入流类
② OuputStream
抽象字节输出流类
③ Reader
抽象字符输入流类
④ Writer
抽象字符输出流类
2. 文件操作类
① File
文件类
②
RandomAccessFile
随机存取文件类 《Java程序设计实用教程(第3版)》程 序设计实用教程(第3版)》程序设计实
//关闭输出流,空方序《法设Jav计a程实序用设教计程实(用第教3版程)(》第程3版序)设》计程实
}
用教程(第3版)》程序设计实用教程 (第3版)》程序设计实用教程(第3
版)》程序设计实用教程(第3版)》
OutputStream类的子类
《Java程序设计实用教程(第3版)》程 序设计实用教程(第3版)》程序设计实
《Java程序设计实用教程(第3版)》程 序设计实用教程(第3版)》程序设计实
用教程(第3版)》程序设计实用教程 (第3版)》程序设计实用教程(第3
版)》程序设计实用教程(第3版)》
9.2.1 抽象字节流
1. InputStream类及其子类
public abstract class InputStream extends Object implements Closeable
}
《Java程序设计实用教程(第3版)》程
序设计实用教程(第3版)》程序设计实
用教程(第3版)》程序设计实用教程
(第3版)》程序设计实用教程(第3
版)》程序设计实用教程(第3版)》
InputStream类的子类
《Java程序设计实用教程(第3版)》程 序设计实用教程(第3版)》程序设计实
java输入输出流和文件操作

Java IO流和文件操作Java流操作有关的类或接口:Java流类图结构:1、File类File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。
File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
构造方法摘要File(File parent, String child)File(String pathname)File(String parent, String child)构造函数创建方法1.boolean createNewFile() 不存在返回true 存在返回false2.boolean mkdir() 创建目录3.boolean mkdirs() 创建多级目录删除方法1.boolean delete()2.boolean deleteOnExit() 文件使用完成后删除例子1:列出指定文件夹的文件或文件夹public class FileDemo1 {public static void main(String[] args){File[] files =File.listRoots();for(File file:files){System.out.println(file);if(file.length()>0){String[] filenames =file.list(); for(String filename:filenames){ System.out.println(filename); }}}}}例子2:文件过滤import java.io.File;public class FileTest2{public static void main(String[] args){File file = new File("file");String[] names = file.list();for(String name : names){if(name.endsWith(".java")){System.out.println(name);}}}}例子3:文件过滤import java.io.File;import java.io.FilenameFilter;public class FileTest3{public static void main(String[] args){File file = new File("file");String[] names = file.list(new FilenameFilter(){public boolean accept(File dir, String name){if(name.endsWith(".txt")){return true;}return false;};});for(String name : names){System.out.println(name);}}}例子4:利用递归列出全部文件import java.io.*;public class FileTest4 {public static void showDir(File dir){ System.out.println(dir);File[] files=dir.listFiles();for(File f:files){if(f.isFile()){System.out.println(f);}else{showDir(f);}}}public static void main(String[] args) { File file=new File("file");showDir(file);}}例子5:利用递归删除全部文件import java.io.File;public class FileTest5 {public static void deleteAll(File file){ if(file.isFile()||file.list().length==0){ file.delete();}else{File[] files=file.listFiles();for(File f:files){deleteAll(f);f.delete();}}}public static void main(String[] args) { File file=new File("file");deleteAll(file);}}流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。
Java语言程序设计第9章_输入输出和文件操作

DataOutputStream PrintStream
ObjectOutputStream PipedOutputStream
输出字节流类层次结构图
9.1.2 字节流与字符流
Reader
BufferedReader LineNumberReade r
CharArrayReader FilterReader PushbackReader
【例9-12】 【例9-13】 【例9-14】
9.5 文本扫描器(Scanner)
▪ Scanner类常用的构造方法
⑴ public Scanner(String source)
构造一个新的Scanner对象,从指定的字符串数据源获取数据。 ⑵ public Scanner(File source) throws FileNotFoundException 构造一个新的Scanner对象,从File对象指定的文件数据源获取数 据。
▪ 在对流进行读写操作时,使用一块称作缓冲区的内存区域, 输出的数据先存入缓冲区,当缓冲区满了或调用缓冲流的 flush()方法后,才完成对输出设备或文件的实际输出;
▪ 输入数据时,从输入设备或文件每次读入尽可能多的数据到 缓冲区,程序需要的数据从缓冲区取得,当缓冲区变空时再 读入一个数据块。
▪ 缓冲流包括BufferedInputStream和 BufferedOutputStream以及BufferedReader和 BufferedWriter。
▪ 它们都是处理流。
9.2.2 缓冲流的使用
▪ 1.BufferedInputStream和BufferedOutputStream的构 造方法
▪ 2.BufferedReader和BufferedWriter的构造方法
Java基础之文件的输入输出流操作

Java基础之⽂件的输⼊输出流操作在介绍输⼊输出流之前,⾸先需要了解如何创建⽂件,创建⽂件夹以及遍历⽂件夹等各种操作,这⾥⾯不在⼀⼀介绍,主要介绍的是⽂件的输⼊输出流操作。
在起初学习⽂件操作之前,总是喜欢将输⼊输出弄混淆,后来通过看⼀些书以及⼀些视频,有了⼀些⾃⼰的⼼得体会,随后介绍⼀下,以便在我以后忘记的时候可以温习⼀下。
1.流的概念及分类Java将所有传统的流模型(类或抽象类),都放在了Java.io包中,⽤来实现输⼊输出的功能。
这⾥⾯我们将流分成两种:输⼊流和输出流。
输⼊流:只能从中读取数据,⽽不能向其写⼊数据。
代表:InputStream(字节输⼊流),Reader(字符输⼊流)。
输出流:只能向其写⼊数据,⽽不能从中读取数据。
代表:OutputStream(字节输出流),Writer(字符输出流)。
流按照操作类型也可以分成两种:字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的。
它操作的数据单元是8位的字节。
字符流 : 字符流只能操作纯字符数据,⽐较⽅便。
它操作的数据单元是16位的字符。
在这个地⽅,我们需要弄清楚的就是什么是输⼊,什么是输出。
如下图所⽰:从Java程序指向⽂件,这个过程我们称为输出或者写⼊⽂件,从⽂件指向Java程序,这个过程我们称为输⼊或者读出⽂件。
在输⼊流和输出流中,我们主要掌握4个流⽂件的操作:InputStream,OutputStream,Reader,Writer。
这四个类都是抽象类,前两个代表了字节的输⼊输出流,后两个代表字符的输⼊输出流,当我们调⽤的时候通常使⽤他们的⼦类来实现我们的类⽅法。
2.字节输出流(OutputStream)字节输出流它有以下⼏个⽅法可以提供给它的⼦类使⽤(在输⼊输出流中,⼦类⼏乎没什么⽅法,都是调⽤⽗类的⽅法) void close(): 关闭此输出流并释放与此流有关的所有系统资源。
void write(byte[] b):将 b.length 个字节从指定的 byte 数组写⼊此输出流void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写⼊此输出流。
JAVA文件流输入输出

4、 Writer类(输出字符流类) public int write(int b); public int write(char b[]); public int write(char[] b,int off,int len); public int write(String s); public int write(String s ,int off,int len); public void flush(); public void close();
3、流的链接 ①、一个流经过其他流的多次包装
DataSource
FileInputStream BufferedInputStream DataInputStream
Program
Program
FileOutputStream DataOutputStream BufferedOutputStream
输入字节流类的继承
<<Abstract>> InputStrInput Stream
<<Abstract>> FilterInputStream
PipedInput Stream
SequenceInp utStream
ByteArrayIn putStream
<<Abstract>> FilterOutputStream
PipedOutputStream
ByteArrayOutputStream
BufferedOutputStream
PrintStream
DataOutputStream
输入字符流类的继承
JAVA开发与应用 输入输出流和文件

3.对象流 ◇ ObjectInputStream ◇ ObjectOutputStream
4.其它 ◇ 文件处理: File、RandomAccessFile; ◇ 接口 DataInput、DataOutput、ObjectInput、 ObjectOutput;
二、InputStream 和OutputStream 1.InputStream ◇ 从流中读取数据: int read( ); //读取一个字节,返回值为所读的字 节 int read( byte b[ ] ); //读取多个字节,放置到字 节数组b中,通常读取的字节数量为b的长度,返回 值为实际读取的字节的数量。 int read( byte b[ ], int off, int len ); //读取len个 字节,放置到以下标off开始字节数组b中,返回值为 实际读取的字节的数量。 int available( ); //返回值为流中尚未读取的 字节的数量 long skip( long n ); //读指针跳过n个字节不读, 返回值为实际跳过的字节数量
对象序列化
• 将对象转换为字节流保存起来,并在日后 还原这个对象,这种机制叫做对象序列化。 • 将一个对象保存到永久存储设备上称为持 续性。 • 一个对象要想能够实现序列化,必须实现 Serializable接口或Externalizable接口。
对ห้องสมุดไป่ตู้序列化
• 当一个对象被序列化时,只保存对象的非静态成 员变量,不能保存任何的成员方法和静态的成员 变量。 • 如果一个对象的成员变量是一个对象,那么这个 对象的数据成员也会被保存。 • 如果一个可序列化的对象包含对某个不可序列化 的对象的引用,那么整个序列化操作将会失败, 并且会抛出一个NotSerializableException。我们 可以将这个引用标记为transient,那么对象仍然 可以序列化。
Java输入输出流(一)——常用的输入输出流
Java输⼊输出流(⼀)——常⽤的输⼊输出流1.流的概念:在Java中,流是从源到⽬的地的字节的有序序列。
Java中有两种基本的流——输⼊流(InputStream)和输出流(OutputStream)。
根据流相对于程序的另⼀个端点的不同,分为节点流和过滤流。
(1)节点流:以特定源如磁盘⽂件、内存某区域或者线程之间的管道为端点的构造输⼊输出流,是⼀种基本的流。
(2)过滤流:以其他已经存在的流为端点构造的输⼊输出流。
根据流中的数据单位分为字节流和字符流。
(1)字节流:流中的数据是以8位字节为单位进⾏读写,以InputStream和OutputStream为基础类。
(2)字符流:流中的数据是以16为字符为单位进⾏读写,以Reader和Writer为基础类。
2.字节流InputStream和OutputStream是字节流的两个顶层⽗类,提供了输⼊流类和输出流类的通⽤API。
2.1 输⼊字节流InputStream基本⽅法:(1)基本读⽅法;: int read() int read(byte[] b) int read(byte[] b,int off,int len)(2) 关闭流:void close()(3) 返回输⼊流中还有多少可读字节 int available()(4) 跳过指定字节 long skip(long n)(5) 回读数据 boolean markSupported() void Mark(int readlimt) void reset()2.2 输出字符流OutputStream基本⽅法:(1)基本写⽅法:void write(int c) void write(byte[] b) void write(byte[] b,int off,int len)(2) 关闭流:void close()(3)q强制输出:void flush()3.字符流:Reader和Writer是字符流的顶层⽗类,字符流能够处理Unicode字符集中的所有字符。
Java文件输入输出流
import java.io.*;
java.io.OutputStream Class
• 该抽象类作为所有输出字节流类的基类,声 明用于输出字节流数据的通用方法: public abstract void write(int b) public void write(byte[] buf, int offset, int count) public void write(byte[]) public void flush() public void close()
Byte Streams
• 字节流可分为输入字节流和输出字节流 • 抽象类 java.io.InputStream 用于表示所有输 入字节流 • 抽象类 java.io.OutputStream 用于表示所有 输出字节流 • 所有的流类对象在使用前必须打开,在使用 后必须关闭
java.io.InputStream Class
Byte Streams to Character Streams import java.io.*;
•
class CountSpace{ InputStreamReadr类有以下构造函数: public static void main(String[] args) throws IOException{ Reader in; publicin=new InputStreamReader(System.in); InputStreamReader(InputStream in) 当前读入的字符 publicint ch; InputStreamReader(InputStream in, String int totol; 读入的字符总数 encoding) int spaces=0; 字符中的空格数 for(total=0;(ch=in.read())!=-1;total++){ 计算空格数 OutputStreamWriter类有以下构造函数: if(Character.isWhitespace((char)ch)) spaces++; public OutputStreamReader(OutputStream out) } 个字符, 个空格” 个字符 个空格 publicSystem.out.println(total+ “个字符 ”+spaces+ “个空格out, OutputStreamReader(OutputStream ”); } String encoding) }
JAVA输入输出流和文件操作
JAVA输入输出流和文件操作
1、JAVA输入输出流
Java的输入/输出流机制是Java中最基本的控制机制,它是把Java 程序和外部文件和网络服务之间建立的数据传输通道,是Java程序访问来自外部资源的基本手段。
Java的输入/输出流机制是Java中最基本的控制机制,它是把Java 程序和外部文件和网络服务之间建立的数据传输通道,是Java程序访问来自外部资源的基本手段。
Java的输入/输出流机制是将不同的数据源统一到同一结构,从而使Java程序与各种外部资源(文件、网络服务)之间可以进行输入/输出操作。
普通的Java程序可以使用这些IO流来读取和写入文件,从而实现文件的操作。
Java的输入/输出流系统分为字节流和字符流两种。
字节流是用来处理二进制数据流的,可以用来处理原始数据流;而字符流是用来处理字符流的,可以用来处理文本文件。
2、JAVA文件操作
文件是操作系统中用来存储信息的基本单位,在JAVA编程中,我们使用File来操作文件,File类是java.io包中的类,它是为了访问底层操作系统提供的文件和目录的操作方法。
File类可以用来操作一些文件系统相关的信息,比如:文件名、文件大小、文件是否存在等等,我们可以使用File类来实现文件的创建、删除、复制、移动等操作。
另外,如果要实现文件的读写操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*利用 BufferedReader 和 BufferedWriter 完成文本文件的复制*/import java.io.*;public class TestBufferedReaderWriterCopy{public static void main(String[] args){BufferedReader br = null;BufferedWriter bw = null;try{br = new BufferedReader(new FileReader("D:\\share\\S5\\di-20 流\\TestBufferedReaderWriterCopy.java"));bw = new BufferedWriter(new FileWriter("d:/share/Writer.txt"));String str = null;while (null != (str=br.readLine())) //br.readLine()读取一行字符,但会将读取的换行符自动丢弃,即返回的String对象中并不包括换行符{bw.write(str);bw.newLine(); //写入一个换行符这行不能省}bw.flush();}catch (FileNotFoundException e){e.printStackTrace();System.exit(-1);}catch (IOException e){e.printStackTrace();System.exit(-1);}finally{try{bw.close();br.close();}catch (IOException e){e.printStackTrace();System.exit(-1);}}}}2009年7月3日10:42:43通过字符流完成文本文件的复制*/import java.io.*;public class TestFileReaderWriterCopy{public static void main(String[] args) throws Exception{FileReader fr = new FileReader("D:\\share\\S5\\di-20 流\\TestFileReaderWriterCopy.java");FileWriter fw = new FileWriter("d:/zhangsan.haha");int ch;ch = fr.read();while (-1 != ch){fw.write(ch);ch = fr.read();}fw.flush();fr.close();fw.close();}}2009年7月3日10:43:18本程序证明了:通过字符流无法完成非文本文件的复制或者说:字符流只能处理文本文件不能处理非文本文件*/import java.io.*;public class TestFileReaderWriterCopy_2{public static void main(String[] args) throws Exception{FileReader fr = new FileReader("E:\\IBM教学\\java\\lesson_io\\妹妹来看我.mp3");FileWriter fw = new FileWriter("d:/zhangsan.haha");int ch;ch = fr.read();while (-1 != ch){fw.write(ch);ch = fr.read();}fw.flush();fr.close();fw.close();}}/*2009年7月3日10:44:37本程序证明了:通过字节流可以完成音频格式文件的复制实际上我们通过字节流可以完成任意格式文件的复制但本程序有个缺点:没有缓冲区,处理速度慢可以参考对比"TestInputStreamOutputStreamCopy_3.java"*/import java.io.*;public class TestInputStreamOutputStreamCopy{public static void main(String[] args) throws Exception{FileInputStream fr = new FileInputStream("E:\\IBM教学\\java\\lesson_io\\妹妹来看我.mp3");FileOutputStream fw = new FileOutputStream("d:/zhangsan.haha");int ch;ch = fr.read();while (-1 != ch){fw.write(ch);ch = fr.read();}fw.flush();fr.close();fw.close();}}/*2009年7月3日10:47:37本程序证明了:通过字节流可以完成图像文件的复制实际上我们通过字节流可以完成任意格式文件的复制*/import java.io.*;public class TestInputStreamOutputStreamCopy_2{public static void main(String[] args) throws Exception{FileInputStream fr = new FileInputStream("C:\\1.jpg");FileOutputStream fw = new FileOutputStream("d:/zhangsan.haha");int ch;ch = fr.read();while (-1 != ch){fw.write(ch);ch = fr.read();}fw.flush();fr.close();fw.close();}}/*2009年7月3日10:45:49本程序证明了:带缓冲区的字节流处理文件的速度要快于不带缓冲区的字节流处理文件的速度可以参考对比"TestInputStreamOutputStreamCopy.java"*/import java.io.*;public class TestInputStreamOutputStreamCopy_3{public static void main(String[] args) throws Exception{BufferedInputStream bis = new BufferedInputStream( new FileInputStream("E:\\IBM教学\\java\\lesson_io\\妹妹来看我.mp3"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d:/zhangsan.haha"));byte[] buf = new byte[1024];int len;len = bis.read(buf);while (-1 != len){bos.write(buf, 0, len);len = bis.read(buf);}bos.flush();bos.close();bis.close();}}/*2009年7月3日10:41:25复习上节课的例子*/import java.io.*;{public static void main(String[] args) throws Exception{FileReader fr = new FileReader("D:/share/S5/di-20 流/TestIO.java");int ch;int cnt = 0;ch = fr.read();while (-1 != ch){++cnt;System.out.printf("%c", (char)ch);ch = fr.read();}System.out.printf("该文件字符的个数是:%d\n", cnt);fr.close();}}/*2009年7月3日10:41:46本程序证明了:如果通过一个字节流把文本文件的内容输出到显示器上,当输出汉字时就会出现乱码*/import java.io.*;{public static void main(String[] args) throws Exception{FileInputStream fr = new FileInputStream("D:/share/S5/di-20 流/TestIO.java");int ch;int cnt = 0;ch = fr.read();while (-1 != ch){++cnt;System.out.printf("%c", (char)ch);ch = fr.read();}System.out.printf("该文件字符的个数是:%d\n", cnt);fr.close();}}import java.io.*;public class TestData{public static void main(String[] args) throws Exception{ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream dos = new DataOutputStream(baos);long m = 1234567;dos.writeLong(m);byte[] buf2 = baos.toByteArray();ByteArrayInputStream bais = new ByteArrayInputStream(buf2);DataInputStream dis = new DataInputStream(bais);long n;n = dis.readLong();//dis.readLong(n); //errorSystem.out.println("n = " + n);}}import java.io.*;public class TestObjectIO{public static void main(String[] args){ObjectOutputStream oos = null;ObjectInputStream ois = null;Student ss = new Student("zhansan", 1000, 88.8f); //注意88.8f不能改为88.8Student ss2 = null;try{FileOutputStream fos = newFileOutputStream("d:/share/java/ObjectOut.txt");oos = new ObjectOutputStream(fos);oos.writeObject(ss);ois = new ObjectInputStream(newFileInputStream("d:/share/java/ObjectOut.txt"));ss2 = (Student)ois.readObject(); //(Student)不能省ois.readObject();如果ois中的某个成员是transient,则该成员是不会被读取的,因为该成员不会被保存,何来读取之说?!System.out.println("ss2.sname = " + ss2.sname);System.out.println("ss2.sid = " + ss2.sid);System.out.println("ss2.sscore = " + ss2.sscore);}catch (FileNotFoundException e){System.out.println("文件没有找到!");System.exit(-1);}catch (Exception e){e.printStackTrace();System.exit(-1);}finally{try{oos.close();ois.close();}catch (Exception e){e.printStackTrace();System.exit(-1);}}}}class Student implements Serializable //如果将implements Serializable 注释掉,则程序编译时就会报错{public String sname = null;transient public int sid = 0;public float sscore = 0; //表示sscore成员不能被序列化,所谓不能被序列化就是指:“该成员调用ObjectOutputStream 的writeOnbject()时不会被保存,调用ObjectInputStream的readObject()方法时不会被读取”public Student(String name, int id, float score){this.sname = name;this.sid = id;this.sscore = score;}}/*DataOutputStream 中的 writeXXX(data)方法与PrintStream 中的 println(data)的区别总结:DataOutputStream 中的 writeXXX(data)方法是把data在内存中的二进制数据写入文件PrintStream 中的 println(data)写出的是该数据的格式化后的字符串*/import java.io.*;public class TestPrintStream_1{public static void main(String[] args) throws Exception{DataOutputStream dos = new DataOutputStream(new FileOutputStream("d:/kk.txt"));dos.writeLong(12345); //实际写入文件的是00 00 00 00 00 00 30 39dos.close();System.out.printf("%#X\n", 12345);PrintStream ps = new PrintStream(newFileOutputStream("d:/kk2.txt"), true);ps.println(12345); //实际写入文件的是'1' '2' '3' '4' '5'ps.close();}}/*2009年3月30日9:57:47功能:将键盘输入的数据输入A文件中,如果输入有误,则把出错信息输出到B文件中标准输入输出流的重定向*/import java.io.*;import java.util.*;public class TestSetOutErr{public static void main(String[] args){PrintStream psOut = null;PrintStream psError = null;Scanner sc = null;try{psOut = new PrintStream("d:/Out.txt");psError = new PrintStream("d:/error.txt");sc = new Scanner(System.in);int num;System.setOut(psOut);System.setErr(psError);while (true){num = sc.nextInt();System.out.println(num);}}catch (Exception e){System.err.println("出错的信息是:"); //不可以写成System.out.println("出错的信息是:");e.printStackTrace(); //e.printStackTrace(); 默认是输出到System.err所关联的设备中}}}import java.io.*;public class TestString{public static void main(String[] args){String str = null;try{BufferedReader br = new BufferedReader(new InputStreamReader(System.in) );str = br.readLine();System.out.println("str = " + str);}catch (Exception e){}}}import java.io.*;public class TestSys{public static void main(String[] args) throws Exception{PrintStream ps = new PrintStream("d:/heihei.asd");System.setOut(ps);System.out.println("哈哈");}}。