java之输入输出
介绍java的输入/输出,我们首先要了解流的基本概念,因为Java所有的I/O机制都是基于数据流进行输入/输出。
输入/输出流
流的基本概念
流是一组有序的数据序列,java由数据流处理输入/输出。
流的输入源可以是我们常见的键盘
,也可以是文件
,乃至网络
,或者其他的数据源。
流的分类
所有的输入流类都是抽象类inputStream(字节输入流)或抽象类Reader(字符输入流)的子类;
所有输出流类都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。
也就是说,流可以分为字节流和字符流两类。
流也可以分为节点流和处理流两类:节点流(Node Stream)
可以从或向一个特地的地方(节点)读写数据
如文件流:FileInputStream,内存流ByteArrayInputStream
处理流(processing Stream)
是对一个已存在的流的链接和封装,处理流又称过滤流(filter)
如缓冲处理流BufferReader
File类
File类是java.io包中唯一代表磁盘文件本身的对象。
文件的创建和删除
进行文件的创建,就是实例化一个file对象,file对象常见的构造方法有两种:
File(String filename) //默认与当前应用程序在同一目录中
File(String path,String filename)
具体举例如下:
File file = new File("hello.txt");
//创建一个文件对象,并在当前应用程序目录下指定一个名为hello.txt 的物理文件,如果文件不存在,可以调用file类中相应方法创建
文件的删除:
file.delete();
获取文件信息:
String name = file.getName(); //获取文件的名字
long length = file.length(); //获取文件的长度
boolean hidden = file.isHidden(); //判断文件是否是隐藏文件
String path = file.getPath(); //获取文件的路径
字节流的输入/输出
inputStream、OutputStream 抽象类
文件输入/输出(字节流)
FileInputStream继承InputStream,文件输入流可以使用父提供的read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少,就读入多少个字节。
构造方法
FileInputStream in = new FileInputStream(file); //File对象
FileInputStream in1 = new FileInputStream("hello.txt"); //给定的文件名
FileOutputStream 文件输出流继承OutputStream ,可以使用父类提供的write()方法把字节写入到输出流,处理以文件作为数据输出目的的数据流,或者从内存区读数据到文件中。
构造方法:同输入流
使用字节缓冲流提高输入/输出效率
计算机访问外部设备非常耗时,访问外村的频率越高,造成cpu闲置的概率就越大。为了提高效率,可以在程序中使用缓冲机制,减访问硬盘的次数
BufferedInputStream bin = new BufferedInputStream(in);
BufferedOutputStream bout = new BufferedOutputStream(out);
基本java数据类型的输入/输出
DataInputStream和DataOutputStream类创建的对象分别被称为数据输入流和数据输出流。用以以机器无关的方法从底层输入流中读取基本的java数据类型,数据输出流允许应用程序以适当的方式将基本的java数据类型写入输出流中
构造方法
DataInputStream(InputStream in)
DataOutputStream(OutPutStream out)
文件输入/输出(字符流)
FileReader类是Reader类的子类,与FileInputStream对应,主要用来读取字符文件;
FileWriter类是Writer类的子类,与FileOutPutStream对应,主要用来将字符类型数据写入文件。
构造方法
1、使用文件名为字符串参数
2、使用File类作为参数
使用字符缓冲流提高输入/输出效率
如果文件是按行存放的一个完整信息,读取文件时,必须没出读取一行,使用FileReader流很难完成这样的任务,因为不清楚一行有多少字符。
Java中BufferedReader流类可以读取文本行,BufferedWriter流类可以把字符串按行存入文件,当bufferedReader在读取文本文件时,会尽量先从文件中读取字符数据并置入缓冲区,使用readLine()方法在读取到使用者的换行字符是,再一次将整行字符串传入。如果缓冲区数据不足,才会从文件中读取;使用bufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。等到缓冲区中数据满了,才会一次对目的地进行写出。
字节流与字符流的转换
java JDK中提供字节流到字符流的直接转换:
BufferReader in2 = new BufferReader(new inputReamReader(new FileInputStream(file,“utf-8”)) )
上述代码将字节流转换成一个字符流,注意参数要传入文件的编码方式。
随机文件的访问
randomAccessFile
构造方法randomAccessFile(String name ,String mode)name文件名,即是流的源也是流的目的地,mode r只读,rw可读可写randomAccessFile(File file,String mode)
常用方法:
read():从文件中读取一个字节的数据
Seek():定位文件指针在文件中的位置
getFilePointer():获取当前读写的位置
Write(byte b[]):写b.length个字节到文件
流的包装(链接)
上文讲过流还可以分为节点流和处理流,我们可以看到对于处理流(如缓冲处理流),它的构造方法总是要带一个其他的流对象作为参数。
这就是流的包装,如:
BufferReader in = new BufferReader(new FileReader(file));
BufferReader in2 = new BufferReader(new inputReamReader(new FileInputStream(file,“utf-8”)) )
网络流
同文件流一样,需要一个File类,网络流中的节点就是网络的URL,在网络流中至关重要的就是URL这个类。
它是Java.net 中网络命名的类,通过openStream得到一个流,是inputStream流,如:
URL url = new URL("https://blog.youkuaiyun.com/qq_38180223");
InputStream in = url.openStream();
然后我们就能按照字节流的处理方式来处理网络流。
这里介绍一下网络流的常用方法:
System.out.println("URL 为:" + url.toString());
System.out.println("协议为:" + url.getProtocol());
System.out.println("验证信息:" + url.getAuthority());
System.out.println("文件名及请求参数:" + url.getFile());
System.out.println("主机名:" + url.getHost());
System.out.println("路径:" + url.getPath());
System.out.println("端口:" + url.getPort());
System.out.println("默认端口:" + url.getDefaultPort());
System.out.println("请求参数:" + url.getQuery());
System.out.println("定位位置:" + url.getRef());