Java学习之十一 Java流(Stream)和Scanner类和文件(File)和IO
Java学习之十一 Java流(Stream) 文件 File 和IO
Java.io包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
Java.io包中的流支持很多格式,比如基本类型、对象、本地化字符集等等;
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java为I/O提供了强大的而灵活的支持,使其更广泛的应用到文件传输和网络编程上。
读取控制台输入
System.in
BufferedReader对象创建一个字符流
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedReader 对象创建后,我们可以使用read()读取一个字符,或者用readLine()方法读取一个字符串。
从控制台读取字符输入
int read() throws IOException
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char c = (char) br.read();
System.out.println(c);
从控制台读取字符串
readLine()
String readLine() throws IOException
// 使用 System.in 创建 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
System.out.println(str);
Java Scanner类
java.util.Scanner 是 java5的新特性。
Scanner s= new Scanner(System.in);
Scanner scan = new Scanner(System.in);
System.out.println("next()方法接收数据:");
if (scan.hasNext())
{
String str1= scan.next();
System.out.println("next输入的数据为:" +str1);
}
System.out.println("nextLine()方法接收数据:");
int i=0;
do {
i++;
if (scan.hasNextLine())
{
String str1= scan.nextLine();
System.out.println("nextLine输入的数据为:" +str1);
}
}
while(i<2);
scan.close();
next() 与nextLine()区别
next():
- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符之前遇到的空白,next()方法会自动将其去掉
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
- next()不能得到带有空格的字符串
nextLine():
- 以Enter未结束符,也就是nextLine()方法返回的是输入回车之前的所有字符
- 可以获得空白
控制台输出
PrintStream 继承了 OutputStream类,并且实现了方法 write()
void write(int byteval)
注意:write() 方法不经常使用,因为 print() 和 println() 方法用起来更为方便
读写文件
一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据
FileInputStream
该流用于从文件读取数据,它的对象可以用关键字 new 来创建,并且有多种方式。
InputStream f = new FileInputStream("E:/java/hello");
File f = new File("E:/java/hello");
InputStream out = new FileInputStream(f);
创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作。
序号 | 方法及描述 |
---|---|
1 |
public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常 |
2 |
protected void finalize()throws IOException {} 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常 |
3 |
public int read(int r)throws IOException{} 这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1 |
4 |
public int read(byte[] r) throws IOException{} 这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1 |
5 |
public int available() throws IOException{} 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值 |
FileOutputStream
该类用来创建一个文件并向文件中写数据,如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件
OutputStream f = new FileOutputStream("E:/java/hello");
File f = new File("E:/java/hello");
OutputStream f = new FileOutputStream(f);
创建OutputStream 对象完成后,就可以使用下面的方法来写入流或者进行其他的流操作:
序号 | 方法名及描述 |
---|---|
1 |
public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常 |
2 |
protected void finalize()throws IOException {} 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
3 |
public void write(int w)throws IOException{} 这个方法把指定的字节写到输出流中 |
4 |
public void write(byte[] w) 把指定数组中w.length长度的字节写到OutputStream中 |
try
{
File f= new File("F:\\java\\test.txt");
FileOutputStream fop = new FileOutputStream(f);//文件不存在会被创建(不会自动创建文件夹)
//目录的创建需要使用f.mkdirs()
OutputStreamWriter writer = new OutputStreamWriter(fop,"UTF-8");
// 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
writer.append("中文输入");
writer.append("\r\n");
writer.append("English:");
writer.append("\r\n");
writer.close(); // 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
fop.close();//关闭输出流,释放系统资源
FileInputStream fip = new FileInputStream(f);
InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
StringBuffer sb = new StringBuffer();
while (reader.ready()) {
sb.append((char) reader.read());
// 转成char加到StringBuffer对象中
}
System.out.println("文件内容");
System.out.println(sb.toString());
reader.close();
fip.close();
}
catch(Exception ex)
{
}
Java中的文件和I/O
File FilderReader FileWrite
File类
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等
File对象代表磁盘中实际存在的文件和目录。通过以下构造方法创建一个File对象
File(File parent, String child)
File(String pathname)
File(String parent, String child)
File(URI uri)
File常用方法
序号 | 方法及描述 |
---|---|
1 |
public String getName() 返回由此抽象路径名表示的文件或目录的名称 |
2 |
public String getParent() 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 |
3 |
public File getParentFile() 返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回 |
4 |
public String getPath() 将此抽象路径名转换为一个路径名字符串 |
5 |
public boolean isAbsolute() 测试此抽象路径名是否为绝对路径名 |
6 |
public String getAbsolutePath() 返回抽象路径名的绝对路径名字符串 |
7 |
public boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件 |
8 |
public boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件 |
9 |
public boolean exists() 测试此抽象路径名表示的文件或目录是否存在 |
10 |
public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录 |
11 |
public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件 |
12 |
public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间 |
13 |
public long length() 返回由此抽象路径名表示的文件的长度 |
14 |
public boolean createNewFile() throws IOException 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件 |
15 |
public boolean delete() 删除此抽象路径名表示的文件或目录 |
16 |
public void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录 |
17 |
public String[] list() 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组 |
18 |
public String[] list(FilenameFilter filter) 返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的 |
19 |
public File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件 |
20 |
public File[] listFiles(FileFilter filter) 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器 |
21 |
public boolean mkdir() 创建此抽象路径名指定的目录 |
22 |
public boolean mkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录 |
23 |
public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件 |
24 |
public boolean setLastModified(long time) 设置由此抽象路径名所指定的文件或目录的最后一次修改时间 |
25 |
public boolean setReadOnly() 标记此抽象路径名指定的文件或目录,以便只可对其进行读操作 |
26 |
public static File createTempFile(String prefix, String suffix, File directory) throws IOException 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 |
27 |
public static File createTempFile(String prefix, String suffix) throws IOException 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称 |
28 |
public int compareTo(File pathname) 按字母顺序比较两个抽象路径名 |
29 |
public int compareTo(Object o) 按字母顺序比较抽象路径名与给定对象 |
30 |
public boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等 |
31 |
public String toString() 返回此抽象路径名的路径名字符串 |
public void testFilelst()
{
String dirname="F:/java";
File f1 = new File(dirname);
if (f1.isDirectory())
{
System.out.println("文件夹: " + dirname);
String s[] = f1.list();
System.out.println("当前是绝对路径(isAbsolute()): " + f1.isAbsolute());
for (int i = 0; i < s.length; i++) {
File f = new File(dirname + "/" + s[i]);
if (f.isDirectory()) {
System.out.println(s[i] + " is a directory");
} else {
System.out.println(s[i] + " is a file");
}
}
}
else
{
System.out.println(dirname + " 不是一个文件");
}
}
FileReader
FileReader(File file)
FileReader(FileDescriptor fd)
FileReader(String fileName)
序号 | 方法 |
---|---|
1 |
public int read() throws IOException 读取单个字符,返回一个int型变量代表读取到的字符 |
2 |
public int read(char [] c, int offset, int len) 读取字符到c数组,返回读取到字符的个数 |
Java FileWriter
FileWriter(File file)
FileWriter(File file, boolean append)
FileWriter(FileDescriptor fd)
FileWriter(String fileName, boolean append)
序号 | 方法描述 |
---|---|
1 |
public void write(int c) throws IOException 写入单个字符c |
2 |
public void write(char [] c, int offset, int len) 写入字符数组中开始为offset长度为len的某一部分 |
3 |
public void write(String s, int offset, int len) 写入字符串中开始为offset长度为len的某一部分 |
Java中的目录
创建目录
- mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建
- mkdirs()方法创建一个文件夹和它的所有父文件夹
读取目录
- 一个目录其实就是一个 File 对象,它包含其他文件和文件夹
- 如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true
- 可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表
删除目录或文件
- 删除文件可以使用 java.io.File.delete() 方法
- 需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败