|
第九章 输入输出
一、键盘输入
(1)System.in 和流
System.in是Java最基本的输入方式
类System中的静态成员in代表标准输入流,提供了三个重载的read方法用于从标准设备中接受输入。
不带参数的read方法可以从输入流中读取一个字节并以整数的形式返回其asc码值。
import java.io.*;//如果不导入的话后面捕获错误的语句会报错
public class System_in {
public static void main(String[] args)
{
try{
int c = System.in.read();
System.out.println(c);//如果希望输出的是字符,可以进行强制类型转换,将c换为 (char)c
}
catch(IOException ie)
{
ie.printStackTrace();
}
}
}
如果希望使用read输入一串字符,则可以使用循环,在所有字符输入后按下回车键所有的字符才会被放到标准输入流中,这里回车键可以作为一个信号告诉电脑我输入完了。
import java.io.*;
public class System_in {
public static void main(String[] args)
{
int c=0;
try{
while(c!='c')
{
c = System.in.read();
System.out.println(c);
}
}
catch(IOException ie)
{
ie.printStackTrace();
}
}
}
如果希望使用read()函数输入数字,然后返回数字的值而不是asc码值,则需要对输入的数字进行处理,输出时用该数字的asc码值减去0的asc码值。
import java.io.*;
public class System_in {
public static void main(String[] args)
{
int c=0,d=0;
try{
while(c!='c')
{
c = System.in.read();
if(c>='0'&&c<='9')
{
d=d*10+c-'0';
}
}
System.out.println(d);
}
catch(IOException ie)
{
ie.printStackTrace();
}
}
}
(2)Scanner(这个类是从JDK1.6才开始有的)
具体使用方法如下:
import java.util.Scanner;
public class TestScanner {
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);//注意这里要将标准的输入流作为扫描对象
int i = sc.nextInt();//一次只能识别并接收一个输入整数,默认情况下用空格和回车分隔两个数据项 如果希望输入其他类型有nextBigDecimal,nextLong等方法,点next应该都会自动出来,在eclipse的编程环境下
String str = sc.nextLine();//如果没有前面的赋值语句,则输出 从输入的第一个字符到第一个回车键之前的字符,否则输出剩下没有输出的回车键之前的所有输入
System.out.println(i);
System.out.println(str);
}
}
InputMismatchException
Scanner 扫描器读入指定类型数据,如果输入流中对应的信息不能以该类型读入,那么相关方法将会抛出该异常。
NoSuchElementExpection
表明输入流中已经没有更多的数据可以读取了。
IllegalStateException
表明当前扫描器已经关闭了(调用扫描器的close方法可以关闭扫描器)
//这里知道会有错误抛出没有写try catch居然没有报错,貌似上面那些方法后面没有throws语句
二、输入,输出格式
(1)System.out
System.out.println(可省略参数);这个是输出内容后回车
System.out.print(可省略参数); 输出内容后不回车
System.out.println() or System.out.print() 可以输出所有的基本数据类型和数组字符串,而对于对象型的数据类型的输出则是自动调用该对象的toString方法,并将该方法的返回值输出。
class Point
{
int x;
int y;
public Point(int x,int y)
{
this.x = x;
this.y =y;
}
public String toString()
{
String str = "x="+x+",y="+y;
return str;
}
}
public class TestToString {
public static void main(String[] args)
{
Point p = new Point(2,4);
System.out.println(p);
}
}
(2)输出格式控制(Java JDK1.5开始提供)
格式如下:
public class TestFomat {
public static void main(String[] args)
{
int i = 123;
System.out.printf("%5d", i);//还有很多其他格式符号,这里规则基本和C一样
}
}
三、文件
(1)File类
(其方法吧?)可以打开或创建一个文件并且可以通过方法获得或者设定文件的相关属性;
该类的对象可以是普通意义上的文档,目录,网络路径;
创建文件和读取/设定文件属性操作:
package unite_9;
import java.io.*;
public class TestFile {
public static void main(String[] args)
{
File f = new File("test.txt");
if(!f.exists())//为什么这里要判断f是否创建,前面不是创建了吗,如果这样创建文件的名称和类型怎么确定,这里指的存在是什么意思呢?
{
try
{
f.createNewFile();
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
}
f.setReadOnly();//设定仅仅可读
System.out.println("文件是否可读:"+f.canRead());
System.out.println("文件是否可写:"+f.canWrite());
System.out.println("文件是否可以执行:"+f.canExecute());
System.out.println("包含文件名的路径:"+f.getPath());
System.out.println("包含文件名的绝对路径:"+f.getAbsolutePath());
System.out.println("文件名称:"+f.getName());
System.out.println("文件父类目录:"+f.getParent());
System.out.println("文件名是否为绝对路径"+f.isAbsolute());
System.out.println("文件是否为文件:"+f.isFile());
System.out.println("文件是否是隐藏的:"+f.isHidden());
System.out.println("文件最后修改时间:"+f.lastModified());
System.out.println("文件是否是目录:"+f.isDirectory());
System.out.println("文件长度"+f.length());
}
}
SetWritable设定写权限;
SetReadable 设定读权限;
SetExcutable 设定执行权限;
SetLastModified 修改文件的最后修改时间
(2)RandomAccessFile类
貌似是可以对文件中指定的位置进行读写操作,而不是只能从文件的头开始。
下面是两个重载构造器
public RandomAccessFile(String name,String mode)
thows FileNotFoundException
public RandomAccessFile(File file,String mode)
thows FileNotFoundException
import java.io.*;
public class TestRandomAccessFile {
public static void main(String[] args)
{
try
{
File f = new File("text.txt");
RandomAccessFile raf = new RandomAccessFile(f,"rw");
raf.writeByte(1);
//raf.writeBytes("hello java yo!");这个和后面这个语句raf.writeChars("不记字符串长度")都不记录字符串的长度,而且没有输出用这个方法写入的内容的方法
raf.writeFloat(398.3f);
raf.writeChar('a');
raf.writeUTF("你好!");//记录字符串的长度
System.out.println("当前文件长度:"+raf.length());
raf.seek(0);//这两条语句是帮助我们在文件中随意移来移去的核心语句
System.out.println(raf.readByte());//读出的顺序要和读入的顺序一致才可以顺利读出
System.out.println(raf.readFloat());
System.out.println(raf.readChar());
System.out.println(raf.readUTF());
}
catch(FileNotFoundException fnfe)
{
fnfe.printStackTrace();
}//如果这个语句放在后面这个catch语句的后面会显示这个问题会被IOEception捕获,所以会报错,因为不需要了,后来我试了下,把这个catch删除了也没有报错,顺利执行了并且
catch(IOException ioe)
{
ioe.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
四、字节流
(1)InputStream/OutputStream(在java.io包中,是直接扩展于类java.lang.Object的抽象类)
InputStream:所有字节输入流的父类;
OutputStream:所有字节输出流的父类;
在进行完读或者写的操作后应该通过调用close来关闭它,从而释放有限的系统资源。
1.InputStream的操作方法
public abstract int read () throws IOException
该方法将读入一个字节,并返回读入的字节,或者在遇到输入源尾的时候返回-1.在设计具体流类的时候必须覆盖这个方法提供适用的功能。例如在FileInputStream类中,这个方法将从某一个文件中读入一个字节,而System.in则是从键盘读入信息。
int read(byte[] b)//从数据中读入一个字节数组,并返回实际读入的字节数,或者在碰到流的结尾时返回-1.这个read方法最多读入b.length个字节
int read(byte[] b,int off, int len)//从数据中读入一个字节数组,并返回实际读入的字节数,或者在碰到流的结尾时返回-1
//参数b 数据读入的数组
// off 第一个读入字节应该被放置的位置在b中的偏移量
// len 读入字节的最大数量
long skip(long n)//在输入流中跳过n个字节,返回实际跳过的字节数(如果碰到流尾,则可能小于n)
int available()//返回在不阻塞情况下可用的字节数
void close()//关闭这个输入流
2.OutputStream的操作方法
abstract void write(int b)
可以向某个输出位置写出一个字节
int write(byte[] b)//
int write(byte[] b,int off, int len)//写出所有字节或者某个范围内的字节到数组b中这让我觉得和读入没有区别。。这里输入和输入是相对于计算机而言的,输入是由文件或者键盘输入到计算机中,而输出则是从计算机输出到文件中或其他。
//参数b 数据写出的数组
// off 第一个写出字节在b中的偏移量
// len 写出字节的最大数量
void close()//关闭这个输出流
void flush()//清空输出流,即将所有的缓冲数据发送到目的地
小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)
GMT+8, 2024-5-17 12:01
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.