java之输入输出

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.csdn.net/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());

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值