关于Java编程基础学习输入输出IO的问题

96
Java小辰
2018.05.23 22:39 字数 3234

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

给你学习路线:html-css-js-jq-javase-数据库-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm

Java中将输入输出抽象成流,流通过输入输出系统与物理设备连接,尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。

Java语言中的IO包支持Java的基本I/O(输入/输出)系统,包括文件的输入/输出。Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。

小编推荐一个学Java的学习裙【 六五零,五五四,六零七 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

Java I/O基础

流的概念

java中将输入输出抽象成流,流通过输入输出系统与物理设备连接,尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。将数据从外部(包括磁盘文件、键盘、套接字)读入到内存中的流称为输入流,将从内存写入到外部设备(控制台、磁盘文件或者网络)的称为输出流。

流的分类

流序列中的数据既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。因此Java中的流分为两种:

·

字节流:数据流中最小的数据单元是字节 多用于读取或书写二进制数据

·

·

字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。

·

提示

在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。

字节流

字节流的最顶层是两个抽象类:InputStream和OutputStream,其他关于处理字节的类都是它们的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。

抽象类InputStream 和 OutputStream中定义了实现其他流类的关键方法read()和write(),它们分别对数据的字节进行读写。两种方法都是抽象方法,被子类重载。

例1 文件按字节流的方式拷贝

import java.io.*;

//byte streams are used to perform input and output of 8-bit bytes

public class CopyFileByte {

public static void main(String args[]) throws IOException

{

FileInputStream in = null;

FileOutputStream out = null;

try {

in = new FileInputStream("input.txt");

out = new FileOutputStream("output.txt");

int c;

while ((c = in.read()) != -1) {

out.write(c);

}

}finally {

if (in != null) {

in.close();

}

if (out != null) {

out.close();

}

}

}

}

例1中,上面使用的是文件名来创建FileInoutStream和FileOutputStream,实际上可以还可以使用文件对象来创建输入输出流。字节流的每次操作都是一个数据单位——字节,假如input.txt文件中包含 Hello world ,那么它将复制完“H”之后,再复制“e”,接着就是“l”,如此类推直到其结束。in.read()每次从输入流中读取一个字节,如果达到文件末尾就返回-1。使用完了,还要关闭这些字节流,调用close()方法。

File inFile = new File("input.txt");

File outFile = new File("output.txt");

FileInputStream in = new FileInputStream(inFile);

FileOutputStream out = new FileOutputStream(outFile);

字符流

java是使用16-bits来存储字符数据的,涉及到的大多是字符操作,在程序中使用字符流会比字节流更加合适。类似于字节流,字符流的两个顶层抽象类是Reader和Writer,一下是它们的子类处理字符流。

类似于字节,字符的抽象类Reader和 Writer中也定义了关键方法read()和write(),它们分别对字符进行读写。两种方法也都是抽象方法,被子类重载。

例2 文件按字符流的方式拷贝

import java.io.*;

//Character streams are used to perform input and output for 16-bit unicode

public class CopyFileCharacter {

public static void main(String args[]) throws IOException

{

FileReader in = null;

FileWriter out = null;

try {

in = new FileReader("input.txt");

out = new FileWriter("output.txt");

int c;

while ((c = in.read()) != -1) {

out.write(c);

}

}finally {

if (in != null) {

in.close();

}

if (out != null) {

out.close();

}

}

}

}

和例1对比发现,只有声明的I/O流的类名不同,这里使用的FileReader和FileWriter,它们操作的最小单位是一个字符16bits,而FileInputStream和FileOutputStream最小单位则是一个字节8bits.

java 自定义的标准流

标准输入流 System.in 读取标准输入设备数据,例如键盘输入(默认),其类型是InputStream,三个重要的读入方法:

int read() 从输入流中读取数据的下一个字节,返回ASCII码。若,返回值=-1,说明没有读取到任何字节读取工作结束

int read(byte[] b) 从输入流中读取一定数量的字节,并将这些数据存储到缓冲区数组b中

int read(byte[] b, int off, int len) 将输入流中最多len个字节读入到字节数组b中

标准输出流 System.out 向标准的输出设备写入数据,默认情况下指控制台,其类型是PrintStream,包含两个重要的方法:print()(不换行)和println()(输出之后换行)

标准错误流 System.err 默认也是控制台,类型和System.out相同是PrintStream,

提示

这些流都有默认的设备,但它们可以重定向到任何兼容的输入/输出设备。

控制台的输入和输出

正如上面所介绍的,控制台的输入、输出是由System.in和System.out来完成的。目前,读取控制台的输入输出的首选方法的是字符流,但完成控制台输入的唯一方法是字节流,因而java提供了InputStreamReader和OutputStreamWriter将字节流转化成字符流。BufferedReader是缓冲输入字符流。正如我们在例子中看到的,java允许使用System.out向控制台写数据,但在实际的项目中,它推荐使用PrintWriter,它是基于字符的。

例3 控制台输入字符

import java.io.*;

class ConsoleInOut{

public static void main(String args[])throws IOException{

char c;

InputStreamReader isr = new InputStreamReader(System.in); //①

BufferedReader br = new BufferedReader(isr); //②

System.out.println("Enter characters, 'q' to exit.");

c=(char)br.read();

while(c != 'q'){

System.out.println(c);

c = (char) br.read();

} ;

}

}

小编推荐一个学Java的学习裙【 六五零,五五四,六零七 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

输出:

D:java>java ConsoleInOut

Enter characters, 'q' to quit.

Hello world!

H

e

l

l

o

w

o

r

l

d

!

q

例3 中的①和②两行创建了一个与键盘相连的BufferedReader对象,这里使用read()方法来读取字符,当到达流的末尾时返回-1,输入q退出程序。输出我们使用的是println()方法,每次输出后都换行。

控制台输入字符我们使用的是read()方法,输入字符串的话我们可以使用readLine()方法,和输入字符非常相似,只需要将例3中的read()方法换成readLine()方法即可,同时将改为String类型,由于比较简单,此处不再赘述。

提高

我们来看java工具包中的输入类Scanner。

创建Scanner类的对象时,需要用System.in 作为它的参数,也可以将Scanner看作是System.in对象的支持者,System.in取得用户输入的内容后,交给Scanner来作一些处理.

Scanner类中提供了多个方法:next():取得一个字符串;

hasNext():是否还有输入;

nextInt():将取得的字符串转换成int类型的整数;

nextFloat():将取得的字符串转换成float型;

nextBoolean():将取得的字符串转换成boolean型;

提示

使用Scanner非常方便,但也有不足,Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键.当按下这其中的任一键 时,Scanner就会返回下一个输入. 当你输入的内容中间包括空格时,显然,使用Scanner就不能完整的获得你输入的字符串.

例4 Scanner

public static void main(String[] args){

Scanner sc = new Scanner(new BufferedInputStream(System.in));

while(sc.hasNext()){

int m = sc.nextInt();

String str = sc.next();

for(int i=0; i

System.out.println(sc.nextInt());

}

}

}

正如我们在例子中看到的,java允许使用System.out向控制台写数据,但在实际的项目中,它推荐使用PrintWriter,它是基于字符的。

PrintWriter支持所有类型(包括Object)的print( )和println( )方法,这样,我们就可以像用System.out那样用这些方法。如果遇到不同类型的情况,PrintWriter方法调用对象的toString( )方法并打印结果。

例5 控制台的输出

import java.io.*;

public class TestAbstract {

public static void main(String args[]) {

PrintWriter printerWriter = new PrintWriter(System.out, true);

printerWriter.println("Hello World!");

int i = -10;

printerWriter.println(i);

double d = 0.00003;

printerWriter.println(d);

}

}

D:java>java TestAbstract

Hello World!

-10

3.0E-5

例5 中的new PrintWriter(System.out, true)新建了一个PrinterWriter对象,指定输出流为System.out,true是每一行输出之后进行刷新。

文件的输入输出

文件

文件File 位于java.io包中,用于描述文件和目录的操作。创建文件对象如下:

File file = new File("input.txt");//文件位于当前目录下

File file = new File("/home/user","input.txt");//文件位于/home/user目录下

除了上述的File构造方法之外,还有很多和File相关的方法如下:

exists() 判断文件或目录是否存在

mkdir() 创建目录

isFile()/isDirectory() 判断是文件还是目录

delete() 删除文件

getPath() 获取文件或者目录的路径

list() 将目录中所有文件名保存在字符串数组中返回

例6 文件相关操作

import java.io.*;

public class TestAbstract {

public static void main(String args[]) throws IOException {

File dir = new File("D:/java");

File file1 = new File(dir, "fileTest001.txt");

File file2 = new File(dir, "fileTest002.java");

if (!dir.exists())

dir.mkdir();

if (!file1.exists())

file1.createNewFile();

if (!file2.exists())

file2.createNewFile();

System.out.println("file1's AbsolutePath= " + file1.getAbsolutePath());

System.out.println("file2's AbsolutePath= " + file2.getAbsolutePath());

System.out.println("file1 Canread=" + file1.canRead());

System.out.println("file1's len= " + file1.length());

String[] fileList = dir.list();

System.out.println("there are " + fileList.length + " file(s) in D:");

}

}

运行结果:

D:java>java TestAbstract

file1's AbsolutePath= D:javaileTest001.txt

file2's AbsolutePath= D:javaileTest002.java

file1 Canread=true

file1's len= 0

there are 133 file(s) in D:

I/O

文件处理最常用的两个流是FileInputStream和FileOutputStream,初始化的形式为:

FileInputStream(String fileName) throws FileNotFoundException

FileOutputStream(String fileName) throws FileNotFoundException

小编推荐一个学Java的学习裙【 六五零,五五四,六零七 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

或者

FileInputStream(File fileName) throws FileNotFoundException

FileOutputStream(File fileName) throws FileNotFoundException

读文件使用的是FileInputStream中定义的read()方法,它有很多种形式,具体可参考FileInputStream,写文件是使用FileOutputStream中定义的write()方法,详细参考FileOutputStream

提示

当你对文件的操作结束后,需要调用close( )来关闭文件。

具体的实例请参考例1和例2。

日记本
Web note ad 1